[๐Ÿฅ‰ Bronze 4] ๊ณฑ์…ˆ ์น˜ํ™˜์„ ๋ชจ๋“ˆ๋Ÿฌ ์—ญ์›์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ โ€” DreamHack rev-basic-8 ํ’€์ด

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

[๐Ÿฅ‰ Bronze 4] ๊ณฑ์…ˆ ์น˜ํ™˜์„ ๋ชจ๋“ˆ๋Ÿฌ ์—ญ์›์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ โ€” DreamHack rev-basic-8 ํ’€์ด

์ž…๋ ฅ ๊ฐ ๋ฐ”์ดํŠธ์— 0xfb๋ฅผ ๊ณฑํ•˜๊ณ  ํ•˜์œ„ 1๋ฐ”์ดํŠธ๋งŒ ๋‚จ๊ธด ๊ฐ’์„ 21๋ฐ”์ดํŠธ ๊ณ ์ • ํ…Œ์ด๋ธ”๊ณผ ๋น„๊ตํ•˜๋Š” x86-64 PE. 0xfb๊ฐ€ mod 256์—์„œ ํ™€์ˆ˜๋ผ ๊ณฑ์…ˆ์˜ ์—ญ์›์ด ์กด์žฌํ•œ๋‹ค๋Š” ์ ์„ ์ด์šฉํ•ด ๊ฒ€์ฆ ํ…Œ์ด๋ธ”์„ ๊ทธ๋Œ€๋กœ ์—ญ์‚ฐํ–ˆ๋‹ค. ๋งˆ์ง€๋ง‰ 21๋ฒˆ์งธ ๋น„๊ต๊ฐ€ ์‚ฌ์‹ค์€ ๋ฌธ์ž์—ด ์ข…๊ฒฐ NUL ๊ฒ€์ฆ์ด๋ผ๋Š” ๊ฒƒ๋„ ํ•จ๊ป˜ ์ •๋ฆฌ.

๋ฌธ์ œ: DreamHack โ€” rev-basic-8 (Reversing Basic Challenge #8) ๋ถ„๋ฅ˜: Reversing ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 4 FLAG: DH{Did_y0u_brute_force?}


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…rev-basic-8
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 4
๋ถ„๋ฅ˜Reversing
์ œ๊ณต ํŒŒ์ผchall8.exe (PE32+ x86-64, Windows ์ฝ˜์†”)
ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ž…๋ ฅ ๋ฐ”์ดํŠธ ร— 0xfb (mod 256)๋ฅผ ํ‘œ์™€ ๋น„๊ต โ€” ๊ณฑ์…ˆ์˜ ๋ชจ๋“ˆ๋Ÿฌ ์—ญ์›์œผ๋กœ ์—ญ์‚ฐ

rev-basic ์‹œ๋ฆฌ์ฆˆ ์—ฌ๋Ÿ ๋ฒˆ์งธ. ์ด๋ฒˆ์—๋„ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›์•„ Correct / Wrong์„ ์ถœ๋ ฅํ•˜๋Š” ๋‹จ์ˆœํ•œ ์ฝ˜์†” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ์•ž์„  ๋ฌธ์ œ๋“ค(strcmp, ๊ธ€์ž๋ณ„ cmp, ์ •์ˆ˜ ๋ฐฐ์—ด, XOR, ๋‹ˆ๋ธ” ์Šค์™‘, ์ธ์ ‘ํ•ฉ, AES S-box)๊ณผ ๊ฒฐ์ด ๋น„์Šทํ•œ๋ฐ, ์ด๋ฒˆ์—” ๊ฒ€์ฆ์— ์“ฐ๋Š” ์—ฐ์‚ฐ์ด ๊ณฑ์…ˆ์ด๋‹ค. ์ƒ์ˆ˜ ํ•˜๋‚˜๋งŒ ๊ณฑํ•˜๊ณ  ํ•˜์œ„ ๋ฐ”์ดํŠธ๋งŒ ๋‚จ๊ธฐ๋Š” ์—ฐ์‚ฐ์ด๋ผ, ๊ทธ ์ƒ์ˆ˜์˜ ๋ชจ๋“ˆ๋Ÿฌ ์—ญ์›๋งŒ ๊ตฌํ•˜๋ฉด ๊ณง๋ฐ”๋กœ ์—ญ์‚ฐ์ด ๋๋‚œ๋‹ค.

file chall8.exe
strings -a chall8.exe | grep -E "Input|Correct|Wrong"

file๊ณผ strings ์ถœ๋ ฅ โ€” chall8.exe๊ฐ€ 6๊ฐœ ์„น์…˜์งœ๋ฆฌ PE32+ x86-64 ์ฝ˜์†” ๋ฐ”์ด๋„ˆ๋ฆฌ์ด๊ณ , ๋ฌธ์ž์—ด ํ…Œ์ด๋ธ”์— Input :, Correct, Wrong ์„ธ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ฐ•ํ˜€ ์žˆ์Œ์„ ํ™•์ธํ•œ ํ™”๋ฉด
file๊ณผ strings ์ถœ๋ ฅ โ€” chall8.exe๊ฐ€ 6๊ฐœ ์„น์…˜์งœ๋ฆฌ PE32+ x86-64 ์ฝ˜์†” ๋ฐ”์ด๋„ˆ๋ฆฌ์ด๊ณ , ๋ฌธ์ž์—ด ํ…Œ์ด๋ธ”์— Input :, Correct, Wrong ์„ธ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ฐ•ํ˜€ ์žˆ์Œ์„ ํ™•์ธํ•œ ํ™”๋ฉด

์ด์ „ ๋ฌธ์ œ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‹ฌ๋ณผ์€ stripped ์ƒํƒœ๋‹ค. Input : ์„ ์ถœ๋ ฅํ•˜๊ณ  ์ž…๋ ฅ์„ ๋ฐ›์€ ๋’ค Correct๋‚˜ Wrong ์ค‘ ํ•˜๋‚˜๋ฅผ ์ฐ๋Š” ๊ตฌ์กฐ๋ผ๋Š” ๊ฒƒ๋งŒ ๋ฌธ์ž์—ด๋กœ ๋จผ์ € ํ™•์ธํ–ˆ๋‹ค.



๐Ÿ”ฌ ์ •์ฐฐ โ€” check ํ•จ์ˆ˜ ์ฐพ๊ธฐ

์‹ฌ๋ณผ์ด ์—†์œผ๋‹ˆ PE ํ—ค๋”์˜ AddressOfEntryPoint๋ถ€ํ„ฐ ๋”ฐ๋ผ๊ฐ„๋‹ค.

objdump -f chall8.exe | grep "start address"

์—”ํŠธ๋ฆฌ๋Š” 0x140001584. ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ๋ช‡ ๋‹จ๊ณ„ ๋‚ด๋ ค๊ฐ€๋ฉด main ๊ฒฉ์ธ ํ•จ์ˆ˜(0x140001120)๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, ์Šคํƒ ๋ฒ„ํผ๋ฅผ 0์œผ๋กœ ์ฑ„์šฐ๊ณ  "Input : "์„ ์ถœ๋ ฅํ•œ ๋‹ค์Œ scanf("%256s", buf)๋กœ ์ž…๋ ฅ์„ ๋ฐ›๊ณ , ๊ทธ ๋ฒ„ํผ ํฌ์ธํ„ฐ๋ฅผ ์ธ์ž๋กœ 0x140001000์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์ด 0์ด ์•„๋‹ˆ๋ฉด Correct, 0์ด๋ฉด Wrong์„ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค. ์ด 0x140001000 ํ•จ์ˆ˜๊ฐ€ ๊ฒ€์ฆ ๋กœ์ง ์ „์ฒด๋‹ค.

objdump -M intel -d --start-address=0x140001000 --stop-address=0x140001060 chall8.exe

objdump๋กœ ๋œฌ check ํ•จ์ˆ˜ ์ „์ฒด ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ โ€” 0x140001000๋ถ€ํ„ฐ ์ž…๋ ฅ 0x15๋ฐ”์ดํŠธ๋ฅผ ํ›‘์œผ๋ฉฐ ๊ฐ ๋ฐ”์ดํŠธ์— 0xfb์„ ๊ณฑํ•ด ํ•˜์œ„ 8๋น„ํŠธ๋งŒ ๋‚จ๊ธฐ๊ณ , 0x140003000์˜ ํ…Œ์ด๋ธ” ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋Š” ๋ฃจํ”„๊ฐ€ ๋ณด์ธ๋‹ค
objdump๋กœ ๋œฌ check ํ•จ์ˆ˜ ์ „์ฒด ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ โ€” 0x140001000๋ถ€ํ„ฐ ์ž…๋ ฅ 0x15๋ฐ”์ดํŠธ๋ฅผ ํ›‘์œผ๋ฉฐ ๊ฐ ๋ฐ”์ดํŠธ์— 0xfb์„ ๊ณฑํ•ด ํ•˜์œ„ 8๋น„ํŠธ๋งŒ ๋‚จ๊ธฐ๊ณ , 0x140003000์˜ ํ…Œ์ด๋ธ” ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋Š” ๋ฃจํ”„๊ฐ€ ๋ณด์ธ๋‹ค

๋ฃจํ”„ ํ•˜๋‚˜์— ๊ณฑ์…ˆ ํ•œ ๋ฒˆ, ๋น„๊ต ํ•œ ๋ฒˆ. ํ•ต์‹ฌ๋งŒ ๋‚จ๊ธฐ๋ฉด ์ด๋ ‡๊ฒŒ ์ฝํžŒ๋‹ค.

; rcx = ์ž…๋ ฅ ๋ฒ„ํผ, (%rsp) = ์นด์šดํ„ฐ i, ์‹œ์ž‘๊ฐ’ 0
loop:
  cmp    rax, 0x15              ; i >= 21 ์ด๋ฉด
  jae    correct                ;   โ†’ ๋ฃจํ”„ ์ข…๋ฃŒ, return 1
  movzx  eax, BYTE PTR [rcx+rax*1]   ; al = buf[i]
  imul   eax, eax, 0xfb          ; eax = al * 0xfb  (251)
  and    eax, 0xff               ; ํ•˜์œ„ 1๋ฐ”์ดํŠธ๋งŒ ๋‚จ๊น€ (mod 256)
  movzx  ecx, BYTE PTR [rdx+rcx*1]   ; cl = table[i]   (VA 0x140003000)
  cmp    eax, ecx
  jne    wrong                   ; ๋‹ค๋ฅด๋ฉด return 0
  inc    i; jmp loop
correct:
  mov    eax, 0x1
  ret

C๋กœ ์˜ฎ๊ธฐ๋ฉด ํ•œ ์ค„์ด๋‹ค.

for (int i = 0; i < 21; i++)
    if ((buf[i] * 0xfb) & 0xff != TABLE[i])
        return 0;   // Wrong
return 1;            // Correct

0x15(21)๊นŒ์ง€ ๋„๋Š”๋ฐ scanf("%256s", ...)๋กœ ๋ฐ›์€ ๋ฌธ์ž์—ด์˜ ์‹ค์ œ ๊ธ€์ž ์ˆ˜๋Š” ๊ทธ๋ณด๋‹ค ์ ์„ ๊ฒƒ์ด๋‹ค โ€” ๋งˆ์ง€๋ง‰ ํ•œ ์นธ์€ ๋’ค์—์„œ ๋ณด๋“ฏ NUL ์ข…๊ฒฐ์ž ๊ฒ€์ฆ์ด๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ โ€” 0xfb ๊ณฑ์…ˆ์„ ๊ฑฐ๊พธ๋กœ

๋น„๊ต ๋Œ€์ƒ ํ…Œ์ด๋ธ”์€ .data ์„น์…˜, VA 0x140003000์— 21๋ฐ”์ดํŠธ๋กœ ๋ฐ•ํ˜€ ์žˆ๋‹ค.

objdump -s -j .data chall8.exe | sed -n '1,6p'

.data ๋คํ”„ โ€” 0x140003000๋ถ€ํ„ฐ 21๋ฐ”์ดํŠธ ํ…Œ์ด๋ธ”
.data ๋คํ”„ โ€” 0x140003000๋ถ€ํ„ฐ 21๋ฐ”์ดํŠธ ํ…Œ์ด๋ธ”

ac f3 0c 25 a3 10 b7 25 16 c6 b7 bc 07 25 02 d5 c6 11 07 c5 00 โ€” 21๋ฐ”์ดํŠธ, ๋งˆ์ง€๋ง‰์ด 00์ด๋‹ค.

๊ฒ€์ฆ์‹์€ (buf[i] * 0xfb) & 0xff == table[i]. & 0xff๋Š” ๊ฒฐ๊ตญ mod 256๊ณผ ๊ฐ™์œผ๋‹ˆ ์ •์ˆ˜๋ก  ๊ด€์ ์—์„œ ๋ณด๋ฉด buf[i] * 251 โ‰ก table[i] (mod 256)์ด๋‹ค. 251์€ ํ™€์ˆ˜๋ผ 256๊ณผ ์„œ๋กœ์†Œ(gcd(251, 256) = 1)์ด๊ณ , ๊ทธ๋ž˜์„œ mod 256์—์„œ ๊ณฑ์…ˆ์˜ ์—ญ์›์ด ์กด์žฌํ•œ๋‹ค. ์—ญ์›์„ inv๋ผ ํ•˜๋ฉด ์–‘๋ณ€์— ๊ณฑํ•ด์„œ buf[i] โ‰ก table[i] * inv (mod 256)๋กœ ๋ฐ”๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

โ–ถ๐Ÿ› ์‚ฝ์งˆ โ€” XOR์ธ ์ค„ ์•Œ์•˜๋‹ค๊ฐ€, ๊ทธ๋ฆฌ๊ณ  21๋ฒˆ์งธ ๋ฐ”์ดํŠธ์˜ ์ •์ฒด

imul eax,eax,0xfb ํ•œ ์ค„๋งŒ ํ›‘์—ˆ์„ ๋• ์ˆœ๊ฐ„์ ์œผ๋กœ xor๋ฅ˜ ์ƒ์ˆ˜ ์—ฐ์‚ฐ์ธ ์ค„ ์•Œ๊ณ  ๊ทธ๋ƒฅ table[i] ^ 0xfb๋ฅผ ์‹œ๋„ํ–ˆ๋‹ค. ๋‹น์—ฐํžˆ ์•ˆ ๋งž๋Š”๋‹ค โ€” ๋ช…๋ น์–ด๊ฐ€ ๋ถ„๋ช…ํžˆ imul์ด๊ณ  ๋’ค์— and eax,0xff๋กœ ํ•˜์œ„ ๋ฐ”์ดํŠธ๋งŒ ์ž๋ฅด๋Š” ๊ฑธ ๋ณด๊ณ ์„œ์•ผ "๊ณฑ์…ˆ ํ›„ mod"๋ผ๋Š” ๊ฑธ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ๋กœ ๊ฑธ๋ฆฐ ๊ฑด ๋ฃจํ”„ ์ƒํ•œ์ด 0x15(21)์ธ๋ฐ scanf๋กœ ๋ฐ›๋Š” ์ž…๋ ฅ์ด 21๊ธ€์ž์ผ ๋ฆฌ๊ฐ€ ์—†์–ด ๋ณด์ธ๋‹ค๋Š” ์ . ํ…Œ์ด๋ธ” ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ๊ฐ€ 0x00์ธ ๊ฑธ ๋ณด๊ณ  ๊ฐ์ด ์™”๋‹ค โ€” table[20] = 0์ด๋ฉด buf[20] * 251 โ‰ก 0 (mod 256)์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฐ’์€ buf[20] = 0์ด๋‹ค. scanf("%256s", ...)์€ ์ฝ์€ ๋ฌธ์ž์—ด ๋’ค์— ํ•ญ์ƒ NUL์„ ๋ถ™์ด๋ฏ€๋กœ, 20๋ฒˆ์งธ ์ธ๋ฑ์Šค(0-based)๋Š” ์‹ค์ œ ์ž…๋ ฅ ๊ธ€์ž๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์ž์—ด ์ข…๊ฒฐ์ž ์ž์ฒด๊ฐ€ ๊ฒ€์‚ฌ๋‹นํ•˜๋Š” ์ž๋ฆฌ๋‹ค. ์ฆ‰ ์ง„์งœ ์ž…๋ ฅ์€ 20๊ธ€์ž, ๊ฒ€์ฆ ๋ฃจํ”„์˜ 21๋ฒˆ์งธ ์นธ์€ "์ •ํ™•ํžˆ 20๊ธ€์ž์—์„œ ๋๋‚˜๋ผ"๋Š” ๊ธธ์ด ์ฒดํฌ๋ฅผ ๊ฒธํ•œ๋‹ค.

๊ณฑ์…ˆ ์—ญ์›์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ™•์žฅ ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ, ํŒŒ์ด์ฌ pow(a, -1, m)์ด ๊ทธ๋Œ€๋กœ ๊ณ„์‚ฐํ•ด์ค€๋‹ค.

0xfb ๊ณฑ์…ˆ ๊ฒ€์ฆ์„ ๋ชจ๋“ˆ๋Ÿฌ ์—ญ์›์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ํ๋ฆ„
0xfb ๊ณฑ์…ˆ ๊ฒ€์ฆ์„ ๋ชจ๋“ˆ๋Ÿฌ ์—ญ์›์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ํ๋ฆ„



๐ŸŽฏ ์—ญ์‚ฐ โ€” solve.py

ํ…Œ์ด๋ธ”์„ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ฒจ ์ ๊ณ , pow(0xfb, -1, 256)์œผ๋กœ ์—ญ์›์„ ๊ตฌํ•ด ๊ณฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

#!/usr/bin/env python3
"""rev-basic-8: check()๊ฐ€ buf[i]*0xfb & 0xff == table[i] ๋ฅผ 21๋ฐ”์ดํŠธ(0..20) ๊ฒ€์ฆํ•œ๋‹ค.
0xfb(=251)๋Š” mod 256์—์„œ ํ™€์ˆ˜๋ผ ์—ญ์›์ด ์กด์žฌํ•˜๋ฏ€๋กœ ๊ณฑ์…ˆ์„ ๊ทธ๋Œ€๋กœ ์—ญ์‚ฐํ•œ๋‹ค.
"""
 
TABLE = bytes.fromhex("acf30c25a310b72516c6b7bc072502d5c61107c500")
 
MUL = 0xfb
INV = pow(MUL, -1, 256)  # 51
 
flag_bytes = bytes((b * INV) & 0xff for b in TABLE)
print("inverse of 0xfb mod 256 :", INV)
print("recovered bytes         :", flag_bytes)
print("flag                    :", "DH{" + flag_bytes.rstrip(b"\x00").decode() + "}")

solve.py ์‹คํ–‰ โ€” ์—ญ์› 51 ๊ณ„์‚ฐ๊ณผ ๋ณต์›๋œ ๋ฐ”์ดํŠธ
solve.py ์‹คํ–‰ โ€” ์—ญ์› 51 ๊ณ„์‚ฐ๊ณผ ๋ณต์›๋œ ๋ฐ”์ดํŠธ

๋ณต์›๋œ ๋ฐ”์ดํŠธ๋Š” Did_y0u_brute_force?\x00. ์•ž์„œ ์ง์ž‘ํ•œ ๋Œ€๋กœ ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ๊ฐ€ NUL์ด๊ณ , ์‹ค์ œ๋กœ ํƒ€์ดํ•‘ํ•  ์ž…๋ ฅ์€ 20๊ธ€์ž Did_y0u_brute_force?๋‹ค. ์ด๋ฆ„ ๊ทธ ์ž์ฒด๊ฐ€ ๋†€๋ฆฌ๋Š” ๋ฌธ๊ตฌ์ธ ๊ฒŒ ์žฌ๋ฐŒ๋‹ค โ€” 21๋ฐ”์ดํŠธ์งœ๋ฆฌ ์ข์€ ํƒ์ƒ‰ ๊ณต๊ฐ„์ด๋ผ ๋ธŒ๋ฃจํŠธํฌ์Šค๋„ ์‚ฌ์‹ค ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„์ง€๋งŒ, ์—ญ์› ํ•œ ๋ฒˆ์ด๋ฉด ์ฆ‰์‹œ ๋๋‚œ๋‹ค.


๐Ÿš€ ๊ฒ€์ฆ โ€” wine์œผ๋กœ Correct ํ™•์ธ

ํŒŒ์ดํ”„(echo | wine chall8.exe)๋Š” ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์˜ค๋™์ž‘ํ•  ์ˆ˜ ์žˆ์–ด ์“ฐ์ง€ ์•Š๋Š”๋‹ค. subprocess๋กœ ์ž…๋ ฅ์„ ์ง์ ‘ ๋„ฃ๊ณ  ์ถœ๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.

#!/usr/bin/env python3
"""๋ณต์›ํ•œ ์ž…๋ ฅ์„ chall8.exe์— ์‹ค์ œ๋กœ ๋จน์—ฌ Correct ํ™•์ธ (wine, subprocess)"""
import subprocess, os
 
flag_input = "Did_y0u_brute_force?"
env = dict(os.environ)
env["WINEPREFIX"] = os.path.expanduser("~/.wine_revbasic8")
env["WINEDEBUG"] = "-all"
 
res = subprocess.run(["wine", "chall8.exe"], input=flag_input + "\n",
                      capture_output=True, text=True, env=env, timeout=120)
print("Input :", flag_input)
print("Output:", (res.stdout + res.stderr).strip())

verify.py โ€” wine์œผ๋กœ ์‹คํ–‰ํ•ด Input : Correct ํ™•์ธ
verify.py โ€” wine์œผ๋กœ ์‹คํ–‰ํ•ด Input : Correct ํ™•์ธ

Input : Correct. ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋‹ต์„ ์ธ์ •ํ–ˆ๋‹ค. ์ด ๊ฐ’์„ ๋“œ๋ฆผํ•ต ์ œ์ถœ์ฐฝ์— DH{}๋กœ ๊ฐ์‹ธ ๋„ฃ์œผ๋‹ˆ ์ •๋‹ต ์ฒ˜๋ฆฌ๋๊ณ  VM ํฌ๋ ˆ๋”ง๋„ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋๋‹ค(์ด ๋ฌธ์ œ๋Š” ์„œ๋ฒ„ ์—†์ด ํŒŒ์ผ๋งŒ ๋ฐ›๋Š” ์œ ํ˜•์ด๋ผ ํฌ๋ ˆ๋”ง์„ ์• ์ดˆ์— ์“ฐ์ง€ ์•Š๋Š”๋‹ค). ์ตœ์ข… ํ”Œ๋ž˜๊ทธ๋Š” DH{Did_y0u_brute_force?}.



๐Ÿ“ ๊ฒฐ๋ก 

์ƒ์ˆ˜๋ฅผ ๊ณฑํ•˜๋Š” ๋ณ€ํ™˜๋„ ๊ทธ ์ƒ์ˆ˜๊ฐ€ ๋ชจ๋“ˆ๋Ÿฌ ํ™˜์—์„œ ๊ฐ€์—ญ์ด๋ฉด XOR์ด๋‚˜ ์น˜ํ™˜ํ‘œ์™€ ๋˜‘๊ฐ™์ด ๋šซ๋ฆฐ๋‹ค.

์ด๋ฒˆ ๋ฌธ์ œ๊ฐ€ ์‹ค์ œ๋กœ ํ•œ ์ผ์€ ์„ธ ๊ฐ€์ง€๋ฟ์ด๋‹ค. (1) ๊ฒ€์ฆ ํ•จ์ˆ˜๊ฐ€ (buf[i] * 0xfb) & 0xff == table[i] ํ˜•ํƒœ์˜ 21ํšŒ ๋ฃจํ”„์ž„์„ ์ฝ๊ณ , (2) 0xfb๊ฐ€ mod 256์—์„œ ์„œ๋กœ์†Œ๋ผ ์—ญ์›์ด ์กด์žฌํ•œ๋‹ค๋Š” ๊ฑธ ํ™•์ธํ•˜๊ณ , (3) pow(0xfb, -1, 256)์œผ๋กœ ์—ญ์›์„ ๊ตฌํ•ด ํ…Œ์ด๋ธ”์— ๊ทธ๋Œ€๋กœ ๊ณฑํ–ˆ๋‹ค. 21๋ฒˆ์งธ ๋น„๊ต๊ฐ€ ์‚ฌ์‹ค์€ ๊ธธ์ด ์ฒดํฌ(NUL ์ข…๊ฒฐ์ž)๋ผ๋Š” ๊ฑธ ์•Œ์•„์ฑ„๋Š” ๊ฒƒ ์ •๋„๊ฐ€ ์œ ์ผํ•œ ์‚ฝ์งˆ์ด์—ˆ๋‹ค.

  • ๊ณฑ์…ˆ ์ธ์ฝ”๋”ฉ์€ ๋‚˜๋ˆ—์…ˆ์ด ์•„๋‹ˆ๋ผ ์—ญ์› ๊ณฑ์…ˆ์œผ๋กœ ํ’€๋ฆฐ๋‹ค. ๋ชจ๋“ˆ๋Ÿฌ ์‚ฐ์ˆ ์—์„œ ๋‚˜๋ˆ—์…ˆ์€ ์ •์˜๋˜์ง€ ์•Š์ง€๋งŒ, ๋ฒ•๊ณผ ์„œ๋กœ์†Œ์ธ ๊ณฑ์ˆ˜๋Š” ํ•ญ์ƒ ์—ญ์›์„ ๊ฐ–๋Š”๋‹ค. & 0xff๋กœ ์ž˜๋ผ๋‚ด๋Š” ์—ฐ์‚ฐ์„ ๋ณด๋ฉด mod 256 ๊ณฑ์…ˆ์ž„์„ ์˜์‹ฌํ•˜๋Š” ๊ฒŒ ๋จผ์ €๋‹ค.
  • ์ง์ˆ˜ ์ƒ์ˆ˜๋ฅผ ๊ณฑํ–ˆ๋‹ค๋ฉด ์ด ํŠธ๋ฆญ์ด ์•ˆ ํ†ตํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ์ง์ˆ˜๋Š” 256๊ณผ ๊ณต์•ฝ์ˆ˜ 2๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์—ญ์›์ด ์—†๊ณ , ์—ฌ๋Ÿฌ ์ž…๋ ฅ์ด ๊ฐ™์€ ์ถœ๋ ฅ์— ๋ชฐ๋ฆฌ๋Š” ๋‹ค๋Œ€์ผ ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค โ€” ๊ทธ๋Ÿฌ๋ฉด ์—ญ์‚ฐ์ด ์•„๋‹ˆ๋ผ ํ›„๋ณด ์ง‘ํ•ฉ์„ ์ขํžˆ๋Š” ๋ฌธ์ œ๋กœ ๋ฐ”๋€๋‹ค. ์ด๋ฒˆ์—” 0xfb๊ฐ€ ํ™€์ˆ˜์˜€๋˜ ๊ฒŒ ๊ฒ€์ฆ์„ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์— ๋’ค์ง‘์„ ์ˆ˜ ์žˆ์—ˆ๋˜ ์ด์œ ๋‹ค.
  • ๊ธธ์ด ๊ฒ€์‚ฌ๋ฅผ ์ข…๊ฒฐ์ž ๋น„๊ต๋กœ ์ˆจ๊ฒจ๋„ ์ •์  ๋ถ„์„ ์•ž์—์„  ํฐ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ํ…Œ์ด๋ธ” ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ๋ฅผ ๋ณด๋Š” ์ˆœ๊ฐ„ ๋ฐ”๋กœ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

์‹œ๋ฆฌ์ฆˆ๋ฅผ ๊ด€ํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋˜‘๊ฐ™๋‹ค โ€” ๊ฒ€์ฆ ํ•จ์ˆ˜๊ฐ€ ์ž…๋ ฅ์— ๋ฌด์Šจ ์—ฐ์‚ฐ์„ ํ•˜๋Š”์ง€ ์ฝ๊ณ , ๊ทธ ์—ฐ์‚ฐ์˜ ์—ญํ•จ์ˆ˜๋ฅผ ์ฐพ์•„ ๊ฑฐ๊พธ๋กœ ๋Œ๋ฆฐ๋‹ค. ์ด๋ฒˆ์—” ๊ทธ ์—ญํ•จ์ˆ˜๊ฐ€ ๋ชจ๋“ˆ๋Ÿฌ ๊ณฑ์…ˆ์˜ ์—ญ์›์ด์—ˆ์„ ๋ฟ์ด๋‹ค.

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ 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 +5
[๐Ÿฅ‰ 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 +5
[๐Ÿฅ‰ Bronze 4] ์ •๋‹ต์„ ํ˜๋ฆฌ๋Š” NULL ์ข…๋‹จ โ€” DreamHack rev-basic-5 ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 4] ์ •๋‹ต์„ ํ˜๋ฆฌ๋Š” NULL ์ข…๋‹จ โ€” DreamHack rev-basic-5 ํ’€์ด

์ž…๋ ฅ์˜ ์ธ์ ‘ํ•œ ๋‘ ๋ฐ”์ดํŠธ๋ฅผ ๋”ํ•ด .data ํ…Œ์ด๋ธ”๊ณผ ๋น„๊ตํ•˜๋Š” x86-64 PE. ์‹๋งŒ ๋ณด๋ฉด ๋ฏธ์ง€์ˆ˜๊ฐ€ ํ•˜๋‚˜ ๋‚จ๋Š” ๋ถ€์ •๋ฐฉ์ •์‹์ด์ง€๋งŒ, ์ž…๋ ฅ ๋ฒ„ํผ๊ฐ€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋ผ ๋ฌธ์ž์—ด์ด NULL๋กœ ๋๋‚œ๋‹ค๋Š” ์ ๊ณผ ํ…Œ์ด๋ธ” ๋งˆ์ง€๋ง‰ ๊ฐ’์ด 0์ด๋ผ๋Š” ์ ์ด ์˜ค๋ฅธ์ชฝ ๋์„ ๊ณ ์ •ํ•œ๋‹ค. ๊ฑฐ๊ธฐ์„œ ์™ผ์ชฝ์œผ๋กœ ๋„๋ฏธ๋…ธ์ฒ˜๋Ÿผ ์—ญ์‚ฐํ•˜๋ฉด ์ž…๋ ฅ์ด ๊ทธ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค.
#dreamhack#ctf#reversing+4
2026-07-01#dreamhack +5