[๐Ÿฅ‰ Bronze 2] AES S-box ๋ธ”๋ก ๋ณ€ํ™˜์„ ์—ญ์‚ฐํ•ด ์ž…๋ ฅ ๋ณต์› โ€” DreamHack rev-basic-9 ํ’€์ด

2026-07-08ยท1๋ถ„ ์ฝ๊ธฐยท

[๐Ÿฅ‰ Bronze 2] AES S-box ๋ธ”๋ก ๋ณ€ํ™˜์„ ์—ญ์‚ฐํ•ด ์ž…๋ ฅ ๋ณต์› โ€” DreamHack rev-basic-9 ํ’€์ด

chall9.exe ๋Š” ์ž…๋ ฅ์„ 8๋ฐ”์ดํŠธ ๋ธ”๋ก๋งˆ๋‹ค 16๋ผ์šด๋“œ ๋ณ€ํ™˜(AES S-box + ror + ๋ง์…ˆ ํ”ผ๋“œ๋ฐฑ)ํ•œ ๋’ค ํ•˜๋“œ์ฝ”๋”ฉ๋œ target ๊ณผ memcmp ํ•œ๋‹ค. S-box ๊ฐ€ ์ „๋‹จ์‚ฌ๋ผ ๊ฐ ๋ผ์šด๋“œ๊ฐ€ ๊ฐ€์—ญ์ด๋ฏ€๋กœ, ๋ธ”๋ก๋ณ„๋กœ ์—ญ์‚ฐํ•˜๋ฉด ์ •๋‹ต ์ž…๋ ฅ์ด ๊ทธ๋Œ€๋กœ ๋ณต์›๋œ๋‹ค. wine ์œผ๋กœ "Correct" ๊นŒ์ง€ ํ™•์ธ.

๋ฌธ์ œ: DreamHack โ€” rev-basic-9

๋ถ„๋ฅ˜: Reversing (์ž…๋ ฅ ๊ฒ€์ฆ ์—ญ์‚ฐ)

๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 2

FLAG: DH{Reverse__your__brain_;)}


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…rev-basic-9
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 2
๋ถ„๋ฅ˜Reversing
์ œ๊ณต ํŒŒ์ผchall9.exe (PE32+ x86-64, Windows ์ฝ˜์†”)
์„œ๋ฒ„์—†์Œ (์˜คํ”„๋ผ์ธ ๋ฐ”์ด๋„ˆ๋ฆฌ)
ํ•ต์‹ฌ ๊ธฐ๋ฒ•AES S-box ๋ธ”๋ก ๋ณ€ํ™˜ ์—ญ์‚ฐ (๋ผ์šด๋“œ ๊ฐ€์—ญ์„ฑ)

rev-basic ์‹œ๋ฆฌ์ฆˆ๋Š” "์ž…๋ ฅ์„ ๋„ฃ์œผ๋ฉด ๊ฒ€์ฆํ•ด์„œ Correct/Wrong ์„ ์ถœ๋ ฅํ•˜๋Š”" ๋ฐ”์ด๋„ˆ๋ฆฌ๋‹ค. ๋ชฉํ‘œ๋Š” Correct ๋ฅผ ๋งŒ๋“œ๋Š” ์ž…๋ ฅ์„ ์ฐพ๋Š” ๊ฒƒ์ด๊ณ , ๊ทธ ์ž…๋ ฅ์ด ๊ณง ํ”Œ๋ž˜๊ทธ ๋‚ด์šฉ์ด ๋œ๋‹ค. 9๋ฒˆ์€ ์•ž ๋ฒˆํ˜ธ๋“ค์˜ ๋‹จ์ˆœ XORยท์น˜ํ™˜๊ณผ ๋‹ฌ๋ฆฌ, ์ž…๋ ฅ์„ ๋ธ”๋ก ์•”ํ˜ธ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๋ผ์šด๋“œ๋กœ ๋’ค์„ž์€ ๋’ค ๋น„๊ตํ•œ๋‹ค. ๊ทธ๋ž˜๋„ ๊ฐ ์—ฐ์‚ฐ์ด ๊ฐ€์—ญ์ด๋ผ ์ฐจ๋ถ„ํžˆ ๋’ค์ง‘์œผ๋ฉด ํ’€๋ฆฐ๋‹ค.

1. ์ •์ฐฐ โ€” main ์˜ ํฐ ๊ทธ๋ฆผ

file ๋กœ ๋ณด๋ฉด PE32+ x86-64 ์ฝ˜์†” ์‹คํ–‰ํŒŒ์ผ์ด๊ณ , strings ์— Input :, Correct, Wrong, __stdio_common_vfscanf ๊ฐ€ ๋ณด์ธ๋‹ค. ์ „ํ˜•์ ์ธ rev-basic ์ด๋‹ค. main ์„ ๋””์Šค์–ด์…ˆ๋ธ”ํ•˜๋ฉด ํ๋ฆ„์ด ์…‹์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • ๊ธธ์ด ๊ฒ€์ฆ: (strlen(input) + 1) % 8 == 0 ์ด ์•„๋‹ˆ๋ฉด ์ฆ‰์‹œ ์‹คํŒจ. โ†’ ์ž…๋ ฅ ๊ธธ์ด๋Š” 7, 15, 23, โ€ฆ ์ค‘ ํ•˜๋‚˜(8์˜ ๋ฐฐ์ˆ˜ - 1).
  • ๋ธ”๋ก ๋ฃจํ”„: k = 0, 8, 16, โ€ฆ ๋กœ 8๋ฐ”์ดํŠธ์”ฉ ์ž˜๋ผ ๊ฒ€์ฆ ํ•จ์ˆ˜ sub_1400010a0(input + k) ๋ฅผ ํ˜ธ์ถœ. ์ด ํ•จ์ˆ˜๊ฐ€ ์ž…๋ ฅ ๋ฒ„ํผ๋ฅผ ์ œ์ž๋ฆฌ์—์„œ(in-place) ๋ณ€ํ™˜ํ•œ๋‹ค.
  • ๋น„๊ต: ๋ณ€ํ™˜์ด ๋๋‚œ ์ž…๋ ฅ์„ memcmp(input, target, 0x19) ๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋œ 25๋ฐ”์ดํŠธ(=24๋ฐ”์ดํŠธ + ๋„)์™€ ๋น„๊ต. ๊ฐ™์œผ๋ฉด Correct.

์ฆ‰ "์ž…๋ ฅ โ†’ ๋ณ€ํ™˜ โ†’ target ๊ณผ ์ผ์น˜?" ๊ตฌ์กฐ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฑด ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๊ฐ€ target ์ด ๋˜๋Š” ์›๋ž˜ ์ž…๋ ฅ์ด๋‹ค.

2. ๋ณ€ํ™˜ ๋กœ์ง ๋ฆฌ๋ฒ„์‹ฑ โ€” ๋ผ์šด๋“œ ํ•จ์ˆ˜

ํ•ต์‹ฌ ๊ฒ€์ฆ ํ•จ์ˆ˜ sub_1400010a0 ์„ ๋””์Šค์–ด์…ˆ๋ธ”ํ•œ ๊ฒƒ์ด๋‹ค. ์ด์ค‘ ๋ฃจํ”„(๋ฐ”๊นฅ 16ํšŒ, ์•ˆ์ชฝ 8ํšŒ)๊ฐ€ ๋ˆˆ์— ๋“ค์–ด์˜จ๋‹ค.

#!/usr/bin/env bash
# chall9.exe ์ž…๋ ฅ๊ฒ€์ฆ ๋ฃจํ”„ ๋””์Šค์–ด์…ˆ๋ธ” (8๋ฐ”์ดํŠธ ๋ธ”๋ก 16๋ผ์šด๋“œ ๋ณ€ํ™˜)
cd extracted
objdump -d -M intel chall9.exe 2>/dev/null | sed -n '/1400010fc:/,/14000116f:/p' \
 | grep -E '10(fc|f2|f6):|11(01|03|17|1c|1e|22|27|2c|30|37|3b|3f|41|4c|50|52|55|68|6c):' \
 | sed -E 's#<.*>##' \
 | sed -E 's/(83 7c 24 08 10).*/\1  ; i < 16 (outer, 16๋ผ์šด๋“œ)/' \
 | sed -E 's/(83 7c 24 04 08).*/\1  ; j < 8 (inner, ๋ธ”๋ก 8๋ฐ”์ดํŠธ)/' \
 | sed -E 's/(33 c1).*/\1              ; eax = s ^ K[j]/' \
 | sed -E 's/(0f b6 04 01).*4020.*/movzx eax,[rcx+rax]        ; eax = SBOX[s ^ K[j]]  (rcx=AES sbox)/' \
 | sed -E 's/(03 c1).*/\1              ; += b[(j+1)\&7]/' \
 | sed -E 's/(c0 c8 05).*/\1        ; ror al, 5/' \
 | sed -E 's/(88 14 01).*/\1        ; b[(j+1)\&7] = s   (ํ”ผ๋“œ๋ฐฑ ์ €์žฅ)/'
echo
echo "โ†’ s = ror5( AES_Sbox[s ^ K[j]] + b[(j+1)&7] );  b[(j+1)&7] = s   (16๋ผ์šด๋“œ x 8๋ฐ”์ดํŠธ)"
bash cap_disasm.sh

chall9.exe ๊ฒ€์ฆ ํ•จ์ˆ˜ ๋””์Šค์–ด์…ˆ๋ธ”: ๋ฐ”๊นฅ 16๋ผ์šด๋“œยท์•ˆ์ชฝ 8๋ฐ”์ดํŠธ ์ด์ค‘ ๋ฃจํ”„, s xor K[j] ํ›„ 0x140004020 ํ…Œ์ด๋ธ”(AES sbox) ๋ฃฉ์—…, b[(j+1)&7] ๋”ํ•˜๊ณ  ror al,5, ๊ฒฐ๊ณผ๋ฅผ b[(j+1)&7]์— ํ”ผ๋“œ๋ฐฑ ์ €์žฅ
chall9.exe ๊ฒ€์ฆ ํ•จ์ˆ˜ ๋””์Šค์–ด์…ˆ๋ธ”: ๋ฐ”๊นฅ 16๋ผ์šด๋“œยท์•ˆ์ชฝ 8๋ฐ”์ดํŠธ ์ด์ค‘ ๋ฃจํ”„, s xor K[j] ํ›„ 0x140004020 ํ…Œ์ด๋ธ”(AES sbox) ๋ฃฉ์—…, b[(j+1)&7] ๋”ํ•˜๊ณ  ror al,5, ๊ฒฐ๊ณผ๋ฅผ b[(j+1)&7]์— ํ”ผ๋“œ๋ฐฑ ์ €์žฅ

์ •๋ฆฌํ•˜๋ฉด 8๋ฐ”์ดํŠธ ๋ธ”๋ก b[0..7] ์— ๋Œ€ํ•ด ์ด๋ ‡๊ฒŒ ๋ˆ๋‹ค.

s = b[0];
for (i = 0; i < 16; i++)              // 16 ๋ผ์šด๋“œ
    for (j = 0; j < 8; j++) {         // ๋ธ”๋ก 8๋ฐ”์ดํŠธ
        p = (j + 1) & 7;
        s = SBOX[s ^ K[j]];           // ์น˜ํ™˜
        s = (s + b[p]) & 0xff;        // ๋ง์…ˆ
        s = ror8(s, 5);               // 5๋น„ํŠธ ํšŒ์ „
        b[p] = s;                     // ํ”ผ๋“œ๋ฐฑ: ๊ฒฐ๊ณผ๋ฅผ ๋ฒ„ํผ์— ๋‹ค์‹œ ์”€
    }

s(๋Ÿฌ๋‹ ์ƒํƒœ)๋Š” ๋ธ”๋ก ์‹œ์ž‘ ์‹œ b[0] ์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ , ๋งค ์Šคํ… b[(j+1)&7] ์— ๊ฒฐ๊ณผ๋ฅผ ๋˜๋จน์ž„(feedback)ํ•˜๋ฉฐ ํ˜๋Ÿฌ๊ฐ„๋‹ค. ์ŠคํŠธ๋ฆผ ์•”ํ˜ธ์˜ ์ƒํƒœ ๊ฐฑ์‹ ๊ณผ ๋น„์Šทํ•˜๋‹ค.

3. ์ƒ์ˆ˜ 3์ข… ์ถ”์ถœ โ€” K, S-box, target

๋ณ€ํ™˜์— ์“ฐ์ด๋Š” ์ƒ์ˆ˜๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ๊ทธ๋Œ€๋กœ ๋ฝ‘์•˜๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์ƒ์ˆ˜ ์ถ”์ถœ: K@0x140003230 = "I_am_KEY", sbox@0x140004020 ์•ž 16๋ฐ”์ดํŠธ๊ฐ€ 637c777bf2... ๋กœ AES S-box ์™€ ์ผ์น˜(์ „๋‹จ์‚ฌ=์—ญ์‚ฐ ๊ฐ€๋Šฅ), target@0x140004000 = 24๋ฐ”์ดํŠธ = 8๋ฐ”์ดํŠธ ๋ธ”๋ก 3๊ฐœ
๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์ƒ์ˆ˜ ์ถ”์ถœ: K@0x140003230 = "I_am_KEY", sbox@0x140004020 ์•ž 16๋ฐ”์ดํŠธ๊ฐ€ 637c777bf2... ๋กœ AES S-box ์™€ ์ผ์น˜(์ „๋‹จ์‚ฌ=์—ญ์‚ฐ ๊ฐ€๋Šฅ), target@0x140004000 = 24๋ฐ”์ดํŠธ = 8๋ฐ”์ดํŠธ ๋ธ”๋ก 3๊ฐœ

  • K = "I_am_KEY" (8๋ฐ”์ดํŠธ). ๋ผ์šด๋“œ๋งˆ๋‹ค K[j] ๋กœ XOR.
  • SBOX ๋Š” 63 7c 77 7b f2 6b 6f c5 โ€ฆ ๋กœ ์‹œ์ž‘ โ€” ๊ทธ ์œ ๋ช…ํ•œ AES S-box ๋‹ค. 256๊ฐœ ๊ฐ’์ด ์ „๋ถ€ ์œ ์ผ(์ „๋‹จ์‚ฌ)ํ•˜๋ฏ€๋กœ ์—ญ์น˜ํ™˜์ด ์กด์žฌํ•œ๋‹ค. ์ด๊ฒŒ ์—ญ์‚ฐ์˜ ์—ด์‡ ๋‹ค.
  • target = 7e7d9a8b252dd53d 032b3898279f4fbc 2a79007dc42a4f58 = 24๋ฐ”์ดํŠธ = 8๋ฐ”์ดํŠธ ๋ธ”๋ก 3๊ฐœ. ๊ธธ์ด ๊ฒ€์ฆ(23์ž)๊ณผ๋„ ๋งž๋Š”๋‹ค.

4. ์—ญ์‚ฐ โ€” ๋ผ์šด๋“œ๋ฅผ ๊ฑฐ๊พธ๋กœ ๋˜๊ฐ๊ธฐ

๋ธ”๋ก๋ผ๋ฆฌ๋Š” ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฏ€๋กœ(๊ฐ๊ฐ ๋…๋ฆฝ ๋ณ€ํ™˜) ๋ธ”๋ก ํ•˜๋‚˜์”ฉ ๋’ค์ง‘์œผ๋ฉด ๋œ๋‹ค. ํ•œ ๋ผ์šด๋“œ ์Šคํ…์˜ ์—ญํ•จ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค.

์ •๋ฐฉํ–ฅ ์Šคํ…์€ b[p] (๋‹จ, p=(j+1)&7) ํ•˜๋‚˜๋งŒ ๊ฐฑ์‹ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ๊ฒฐ์ •์ ์ธ ๊ด€์ฐฐ์ด ๋‚˜์˜จ๋‹ค โ€” ์ด ์Šคํ…์€ b[j] ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ์ •๋ฐฉํ–ฅ์—์„œ s ๋Š” ๋ฐ”๋กœ ์ง์ „ ์Šคํ…์ด ์“ด ๊ฐ’(b[j])์ด๋ฏ€๋กœ, s_before == b[j](ํ˜„์žฌ ๋ฒ„ํผ๊ฐ’) ์ด๋‹ค. ๋•๋ถ„์— ์—ญ์‚ฐ์— ํ•„์š”ํ•œ s ๋ฅผ ๋”ฐ๋กœ ์ถ”์ ํ•  ํ•„์š” ์—†์ด ๋ฒ„ํผ์—์„œ ๋ฐ”๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

๋ณ€ํ™˜๊ณผ ์—ญ์‚ฐ ๋‹ค์ด์–ด๊ทธ๋žจ: ์ •๋ฐฉํ–ฅ์€ s๋ฅผ ror5๋กœ ๊ฐฑ์‹ ํ•˜๊ณ  b[p]์— ํ”ผ๋“œ๋ฐฑ, ์—ญ๋ฐฉํ–ฅ์€ s_before๋ฅผ b[j]์—์„œ ์ฝ์–ด rol5 ํ›„ AES S-box ์—ญ์น˜ํ™˜์œผ๋กœ b[p]๋ฅผ ๋ณต์›. K๋Š” I_am_KEY, sbox๋Š” AES ์ „๋‹จ์‚ฌ, target ๊ฐ ๋ธ”๋ก์„ ์—ญ์‚ฐํ•ด ํ”Œ๋ž˜๊ทธ ๋ฌธ์ž์—ด ๋ณต์›
๋ณ€ํ™˜๊ณผ ์—ญ์‚ฐ ๋‹ค์ด์–ด๊ทธ๋žจ: ์ •๋ฐฉํ–ฅ์€ s๋ฅผ ror5๋กœ ๊ฐฑ์‹ ํ•˜๊ณ  b[p]์— ํ”ผ๋“œ๋ฐฑ, ์—ญ๋ฐฉํ–ฅ์€ s_before๋ฅผ b[j]์—์„œ ์ฝ์–ด rol5 ํ›„ AES S-box ์—ญ์น˜ํ™˜์œผ๋กœ b[p]๋ฅผ ๋ณต์›. K๋Š” I_am_KEY, sbox๋Š” AES ์ „๋‹จ์‚ฌ, target ๊ฐ ๋ธ”๋ก์„ ์—ญ์‚ฐํ•ด ํ”Œ๋ž˜๊ทธ ๋ฌธ์ž์—ด ๋ณต์›

์—ญ์Šคํ…์€ ์„ธ ์—ฐ์‚ฐ์„ ์ˆœ์„œ๋Œ€๋กœ ๋˜๋Œ๋ฆฐ๋‹ค.

  • ror8(ยท,5) ์˜ ์—ญ์€ rol8(ยท,5)
  • + b[p] ์˜ ์—ญ์€ - SBOX[s ^ K[j]] (๋ชจ๋“ˆ๋Ÿฌ 256 ๋บ„์…ˆ)
  • ์น˜ํ™˜์€ ๊ฐ’ ์ž์ฒด๋ฅผ ๋˜๋Œ๋ฆด ํ•„์š” ์—†์ด, ์›๋ž˜ b[p] ๋งŒ ๋ณต์›ํ•˜๋ฉด ๋จ
for i in range(16):
    for j in reversed(range(8)):     # ๋ผ์šด๋“œ๋„, j ์ˆœ์„œ๋„ ๊ฑฐ๊พธ๋กœ
        p = (j + 1) & 7
        s_before = b[j]              # ์ด ์Šคํ…์€ b[j]๋ฅผ ์•ˆ ๊ฑด๋“œ๋ฆผ โ†’ s_before == b[j]
        t = rol8(b[p], 5)            # ror5 ๋˜๋Œ๋ฆฌ๊ธฐ
        b[p] = (t - SBOX[s_before ^ K[j]]) & 0xff

5. ์ž์ฒด ์™„๊ฒฐ solve.py

์ •๋ฐฉํ–ฅ/์—ญ๋ฐฉํ–ฅ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๊ณ , ์—ญ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์ •๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋ ค target ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ๋ธ”๋ก๋งˆ๋‹ค ๊ฒ€์ฆํ–ˆ๋‹ค.

def forward(block):                  # ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ๋™์ผ
    b = list(block); s = b[0]
    for _ in range(16):
        for j in range(8):
            p = (j + 1) & 7
            s = ror(( (SBOX[s ^ K[j]] + b[p]) & 0xff ), 5)
            b[p] = s
    return bytes(b)
 
def invert(block):                   # ์—ญํ•จ์ˆ˜
    b = list(block)
    for _ in range(16):
        for j in reversed(range(8)):
            p = (j + 1) & 7
            s_before = b[j]
            b[p] = (rol(b[p], 5) - SBOX[s_before ^ K[j]]) & 0xff
    return bytes(b)

solve.py ์‹คํ–‰: K=I_am_KEY, sbox=AES S-box(bijection), target 24๋ฐ”์ดํŠธ. ๋ธ”๋ก0 target=7e7d9a8b252dd53dโ†’input=Reverse_, ๋ธ”๋ก1โ†’your__b, ๋ธ”๋ก2โ†’rain;) ๊ฐ๊ฐ forward ์žฌ๊ฒ€์ฆ OK, FLAG: Reverse__your__brain_;)
solve.py ์‹คํ–‰: K=I_am_KEY, sbox=AES S-box(bijection), target 24๋ฐ”์ดํŠธ. ๋ธ”๋ก0 target=7e7d9a8b252dd53dโ†’input=Reverse_, ๋ธ”๋ก1โ†’your__b, ๋ธ”๋ก2โ†’rain;) ๊ฐ๊ฐ forward ์žฌ๊ฒ€์ฆ OK, FLAG: Reverse__your__brain_;)

์„ธ ๋ธ”๋ก์„ ์—ญ์‚ฐํ•ด ์ด์–ด๋ถ™์ด๋ฉด Reverse_ + _your__b + rain_;) = Reverse__your__brain_;) ์ด๊ณ , ๊ฐ ๋ธ”๋ก์€ ์ •๋ฐฉํ–ฅ ์žฌ๋ณ€ํ™˜์œผ๋กœ target ๊ณผ ์ผ์น˜ํ•จ์„ ํ™•์ธํ–ˆ๋‹ค.

6. ๋Ÿฐํƒ€์ž„ ํ™•์ธ โ€” wine ์œผ๋กœ ์ง„์งœ "Correct"

์—ญ์‚ฐ์ด ๋งž๋Š”์ง€ ์‹ค์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋„ฃ์–ด ๋ดค๋‹ค. ๋ฆฌ๋ˆ…์Šค๋ผ wine ์œผ๋กœ ๋Œ๋ ธ๋‹ค.

๋ณต์›ํ•œ ์ž…๋ ฅ Reverse__your__brain_;) ๋ฅผ wine chall9.exe ์— ํˆฌ์ž…ํ•˜๋ฉด "Input : Correct", ๋Œ€์กฐ๊ตฐ AAAA... ๋Š” "Input : Wrong". ์ •๋‹ต ์ž…๋ ฅ์—์„œ๋งŒ Correct ํ™•์ธ
๋ณต์›ํ•œ ์ž…๋ ฅ Reverse__your__brain_;) ๋ฅผ wine chall9.exe ์— ํˆฌ์ž…ํ•˜๋ฉด "Input : Correct", ๋Œ€์กฐ๊ตฐ AAAA... ๋Š” "Input : Wrong". ์ •๋‹ต ์ž…๋ ฅ์—์„œ๋งŒ Correct ํ™•์ธ

๋ณต์›ํ•œ ์ž…๋ ฅ์—์„œ๋งŒ Correct, ์•„๋ฌด ๋ฌธ์ž์—ด(๋Œ€์กฐ๊ตฐ)์€ Wrong. ์—ญ์‚ฐ์ด ์ •ํ™•ํ–ˆ๋‹ค.

ํ”Œ๋ž˜๊ทธ: DH{Reverse__your__brain_;)}

7. ์‚ฝ์งˆ ๊ธฐ๋ก

โ–ถ๐Ÿ› ์‚ฝ์งˆ โ€” ์—ญ์‚ฐ์—์„œ s ๋ฅผ ์–ด๋–ป๊ฒŒ ์•Œ์•„๋‚ด๋‚˜ (feedback ์˜ ํ•จ์ •)

์—ญ์‚ฐํ•  ๋•Œ ์ฒ˜์Œ์—” "์ •๋ฐฉํ–ฅ์—์„œ ํ˜๋Ÿฌ๊ฐ€๋˜ ๋Ÿฌ๋‹ ์ƒํƒœ s ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณต์›ํ•˜์ง€?" ์—์„œ ๋ง‰ํ˜”๋‹ค. ์ •๋ฐฉํ–ฅ์€ s ๊ฐ€ ์Šคํ…๋งˆ๋‹ค ๊ฐฑ์‹ ๋˜๋Š”๋ฐ, ๊ฑฐ๊พธ๋กœ ๋Œ ๋• ๊ทธ s ๋ฅผ ๋ชจ๋ฅด๋‹ˆ ์—ญ์น˜ํ™˜๋„ ๋ชป ํ•  ๊ฒƒ ๊ฐ™์•˜๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด๋‹ˆ ๊ฐ ์Šคํ…์€ b[(j+1)&7] ๋”ฑ ํ•˜๋‚˜๋งŒ ์ˆ˜์ •ํ•˜๊ณ  b[j] ๋Š” ์ ˆ๋Œ€ ์•ˆ ๊ฑด๋“œ๋ฆฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ •๋ฐฉํ–ฅ์—์„œ s ๋Š” ํ•ญ์ƒ "์ง์ „ ์Šคํ…์ด ๋ฐฉ๊ธˆ ์จ ๋„ฃ์€ ๊ฐ’" = ์ง€๊ธˆ b[j] ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์ด๋‹ค. ์ฆ‰ s_before ๋Š” ๋ฒ„ํผ์— ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ์–ด์„œ b[j] ๋กœ ์ฝ์œผ๋ฉด ๋์ด์—ˆ๋‹ค. ์ƒํƒœ๋ฅผ ๋”ฐ๋กœ ์ถ”์ ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๋˜ ๊ฒƒ. ์ด๊ฑธ ๊นจ๋‹ซ์ž ์—ญ์‚ฐ์ด ํ•œ ์ค„๋กœ ์ค„์—ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ ๊ตฌ์กฐ๋ฅผ ์ •ํ™•ํžˆ ์ฝ๋Š” ๊ฒŒ ๊ด€๊ฑด์ด์—ˆ๋‹ค.

โ–ถ๐Ÿ› ์‚ฝ์งˆ โ€” memcmp 25๋ฐ”์ดํŠธ vs ๋ธ”๋ก 24๋ฐ”์ดํŠธ, ๊ธธ์ด ๋งž์ถ”๊ธฐ

main ์˜ memcmp ๊ธธ์ด๊ฐ€ 0x19=25์ธ๋ฐ ๋ณ€ํ™˜์€ 8๋ฐ”์ดํŠธ ๋ธ”๋ก ๋‹จ์œ„(24๋ฐ”์ดํŠธ)๋ผ ์ฒ˜์Œ์—” ์–ด๊ธ‹๋‚˜ ๋ณด์˜€๋‹ค. target ์„ ๋คํ”„ํ•ด ๋ณด๋‹ˆ 24๋ฒˆ์งธ ๋ฐ”์ดํŠธ๊ฐ€ 0x00(๋„ ์ข…๋ฃŒ๋ฌธ์ž)์ด๋ผ, ์‹ค์ œ ๋น„๊ต ๋Œ€์ƒ์€ 24๋ฐ”์ดํŠธ(3๋ธ”๋ก) + ๋„์ด์—ˆ๋‹ค. ๊ธธ์ด ๊ฒ€์ฆ (strlen+1)%8==0 ๊ณผ๋„ ๋งž์•„๋–จ์–ด์ง„๋‹ค(strlen=23 โ†’ 23์ž + ๋„ = 24๋ฐ”์ดํŠธ = 3๋ธ”๋ก). ๋ฐ์ดํ„ฐ ์‹ค๋ฌผ์„ ๋– ์„œ ๋งž์ถฐ ๋ณด๋Š” ๊ฒŒ ๋‹ต์ด์—ˆ๋‹ค.

8. ๋งˆ๋ฌด๋ฆฌ โ€” ๋ฆฌ๋ฒ„์‹ฑ์—์„œ ๋ฐฐ์šฐ๋Š” ๊ฒƒ

rev-basic-9 ๋Š” "๋ธ”๋ก ์•”ํ˜ธ ํ‰๋‚ด๋ฅผ ๋‚ธ ์ž…๋ ฅ ๊ฒ€์ฆ"์„ ์—ญ์‚ฐํ•˜๋Š” ์—ฐ์Šต์ด๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜ํ™”ํ•  ๊ตํ›ˆ์ด ์žˆ๋‹ค.

  • ๊ฐ€์—ญ ์—ฐ์‚ฐ์˜ ์กฐํ•ฉ์€ ํ†ต์งธ๋กœ ๊ฐ€์—ญ์ด๋‹ค. XORยท๋ชจ๋“ˆ๋Ÿฌ ๋ง์…ˆยท๋น„ํŠธ ํšŒ์ „ยท์ „๋‹จ์‚ฌ ์น˜ํ™˜(S-box) ์€ ๊ฐ๊ฐ ์—ญ์ด ์žˆ์œผ๋‹ˆ, ์ˆœ์„œ๋งŒ ๊ฑฐ๊พธ๋กœ ๋ฐŸ์œผ๋ฉด ์ „์ฒด๊ฐ€ ๋’ค์ง‘ํžŒ๋‹ค. ๊ฒ€์ฆ ๋กœ์ง์ด ์•„๋ฌด๋ฆฌ ๋ณต์žกํ•ด ๋ณด์—ฌ๋„ "์ถœ๋ ฅ โ†’ ์ž…๋ ฅ"์ด ์œ ์ผํ•˜๊ฒŒ ์ •ํ•ด์ง€๋ฉด keygen ์€ ์„ฑ๋ฆฝํ•œ๋‹ค.
  • ์ƒ์ˆ˜์˜ ์ •์ฒด๋ฅผ ์•Œ์•„์ฑ„๋ฉด ์ ˆ๋ฐ˜์€ ๋. S-box ์•ž ๋ช‡ ๋ฐ”์ดํŠธ(63 7c 77 7b โ€ฆ)๋งŒ ๋ด๋„ AES ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ „๋‹จ์‚ฌ๋ผ๋Š” ์‚ฌ์‹ค์ด ๊ณง "์—ญ์‚ฐ ๊ฐ€๋Šฅ"์„ ๋ณด์žฅํ•œ๋‹ค.
  • ํ”ผ๋“œ๋ฐฑ/์ƒํƒœ๋ฅผ ์ •ํ™•ํžˆ ์ฝ์–ด๋ผ. ์ด ๋ฌธ์ œ์˜ s_before == b[j] ์ฒ˜๋Ÿผ, ์ƒํƒœ๊ฐ€ ์‹ค์€ ๋ฒ„ํผ์— ๋‚จ์•„ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ž๋ฃŒ ํ๋ฆ„์„ ์ •ํ™•ํžˆ ๋”ฐ๋ผ๊ฐ€๋ฉด ์—ญ์‚ฐ์ด ๋‹จ์ˆœํ•ด์ง„๋‹ค.
  • ์ •์  ์—ญ์‚ฐ + ๋™์  ํ™•์ธ์„ ๋ณ‘ํ–‰ํ•˜๋ผ. ์—ญ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์‹ค์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ(wine)๋กœ ์žฌํ˜„ํ•ด Correct ๋ฅผ ๋ฐ›์œผ๋ฉด ์‹ค์ˆ˜๋ฅผ ์ฆ‰์‹œ ์žก์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฉ์–ด ๊ด€์ ์—์„œ, ์ด๋Ÿฐ "๋กœ์ปฌ์—์„œ ์ •๋‹ต์„ ๊ฒ€์ฆํ•˜๋Š”" ๋ฐฉ์‹(ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๊ฒ€์ฆ)์€ ๋ฐ”์ด๋„ˆ๋ฆฌ๋งŒ ์žˆ์œผ๋ฉด ๋ฐ˜๋“œ์‹œ ๋šซ๋ฆฐ๋‹ค. ์ง„์งœ ๋น„๋ฐ€์€ ์„œ๋ฒ„์— ๋‘๊ณ  ๊ฒ€์ฆ๋„ ์„œ๋ฒ„์—์„œ ํ•ด์•ผ ํ•œ๋‹ค.


FLAG: DH{Reverse__your__brain_;)}

์ด ๊ธ€์ด ๋„์›€์ด ๋๋‚˜์š”?

Comments

๋Œ“๊ธ€

0๊ฐœ

๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋ ค๋ฉด ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ด์š”. (๋„ค์ด๋ฒ„ ยท ๊ตฌ๊ธ€ ๊ณ„์ •)

๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘โ€ฆ

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 4] AES S-box๋ฅผ ๊ฑฐ๊พธ๋กœ โ€” DreamHack rev-basic-6 ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 4] AES S-box๋ฅผ ๊ฑฐ๊พธ๋กœ โ€” DreamHack rev-basic-6 ํ’€์ด

์ž…๋ ฅ์„ ํ•œ ๊ธ€์ž์”ฉ 256๋ฐ”์ดํŠธ ์น˜ํ™˜ํ‘œ๋กœ ๋ฐ”๊ฟ” ๊ณ ์ •๋œ 18๋ฐ”์ดํŠธ์™€ ๋น„๊ตํ•˜๋Š” x86-64 PE. ๊ทธ ์น˜ํ™˜ํ‘œ๊ฐ€ AES S-box๋ผ๋Š” ๊ฑธ ์•Œ์•„์ฑ„๋ฉด ๋๋‚œ๋‹ค. S-box๋ฅผ ํ•œ ๋ฒˆ ๋’ค์ง‘์–ด ๊ธฐ๋Œ€๊ฐ’์„ ์—ญ์น˜ํ™˜ํ•˜๋ฉด ์ž…๋ ฅ์ด ๊ทธ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค. ๋””์Šค์–ด์…ˆ๋ธ”๋กœ ๊ฒ€์ฆ ๋กœ์ง์„ ์ฝ๊ณ , ํ‘œ๋ฅผ ์ถ”์ถœํ•ด ์—ญ์‚ฐํ•˜๊ณ , wine์œผ๋กœ Correct๋ฅผ ํ™•์ธํ•œ ๊ณผ์ •.
#dreamhack#ctf#reversing+5
2026-07-01#dreamhack +4
[๐Ÿ’  Platinum 3] ๋‹ˆ๋ธ” ๊ตํ™˜ยทAES S-boxยทstd::sort ๋กœ ์ง  ๋กœ๊ทธ์ธ ๊ฒ€์‚ฌ ๋˜๋Œ๋ฆฌ๊ธฐ โ€” DreamHack rev-login ํ’€์ด
blog

[๐Ÿ’  Platinum 3] ๋‹ˆ๋ธ” ๊ตํ™˜ยทAES S-boxยทstd::sort ๋กœ ์ง  ๋กœ๊ทธ์ธ ๊ฒ€์‚ฌ ๋˜๋Œ๋ฆฌ๊ธฐ โ€” DreamHack rev-login ํ’€์ด

์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ธ ๋‹จ๊ณ„๋กœ ๊ฒ€์‚ฌํ•˜๋Š” C++ ๋ฐ”์ด๋„ˆ๋ฆฌ. ์•„์ด๋”” ๊ฒ€์‚ฌ๋Š” ๊ธ€์ž๋ฅผ ๋‹ˆ๋ธ” ๋‹จ์œ„๋กœ ๋’ค์ง‘์–ด ์˜† ๊ธ€์ž์™€ ์—ฎ์€ ๋’ค AES S-box ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๊ณ , ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฒ€์‚ฌ๋Š” S-box ๋ฅผ ํ•œ ๋ฒˆ ๋” ๋ˆ„์‚ฐํ•œ ๋‹ค์Œ std::sort ๋กœ ์ž๋ฆฌ ์ •๋ณด๋ฅผ ์ง€์›Œ ๋ฒ„๋ฆฐ๋‹ค. ํ”Œ๋ž˜๊ทธ๋Š” ์–ด๋””์—๋„ ์—†๊ณ  ์ •๋‹ต ๋ฌธ์ž์—ด์˜ SHA-1 ์ด ๊ณง ํ‚ค๋‹ค.
#dreamhack#ctf#reversing+6
2026-08-04#dreamhack +4
[๐Ÿฅ‰ Bronze 4] ์™ผ์ชฝ์œผ๋กœ ๋Œ๋ฆฐ ๋น„ํŠธ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ โ€” DreamHack rev-basic-7 ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 4] ์™ผ์ชฝ์œผ๋กœ ๋Œ๋ฆฐ ๋น„ํŠธ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ โ€” DreamHack rev-basic-7 ํ’€์ด

์ž…๋ ฅ ๋ฐ”์ดํŠธ๋ฅผ (i mod 8)๋งŒํผ ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „์‹œํ‚ค๊ณ  i์™€ XORํ•œ ๊ฐ’์„ 31๋ฐ”์ดํŠธ ๊ณ ์ • ํ…Œ์ด๋ธ”๊ณผ ๋น„๊ตํ•˜๋Š” x86-64 PE. ํšŒ์ „์€ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ™์€ ์–‘๋งŒํผ ๋Œ๋ฆฌ๋ฉด ์ •ํ™•ํžˆ ์›์ƒ๋ณต๊ตฌ๋˜๋Š” ์—ฐ์‚ฐ์ด๋ผ, ๊ฒ€์ฆ์‹์„ ๊ทธ๋Œ€๋กœ ๋’ค์—์„œ๋ถ€ํ„ฐ ์ฝ์–ด ROR๋กœ ๋˜๋Œ๋ ธ๋‹ค. ๋””์Šค์–ด์…ˆ๋ธ”๋กœ ๊ฒ€์ฆ ๋กœ์ง์„ ์ฝ๊ณ , ํ‘œ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์ง์ ‘ ์ถ”์ถœํ•ด ์—ญ์‚ฐํ•˜๊ณ , wine์œผ๋กœ Correct๋ฅผ ํ™•์ธํ•œ ๊ณผ์ •.
#dreamhack#ctf#reversing+7
2026-07-05#dreamhack +4