[๐Ÿฅˆ Silver 3] srand(0xBEEF) ํ•˜๋‚˜๋กœ 6MB ์‚ฌ์ง„์„ ๋˜์ฐพ๋‹ค โ€” DreamHack photographer ํ’€์ด

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

[๐Ÿฅˆ Silver 3] srand(0xBEEF) ํ•˜๋‚˜๋กœ 6MB ์‚ฌ์ง„์„ ๋˜์ฐพ๋‹ค โ€” DreamHack photographer ํ’€์ด

BMP ํ•œ ์žฅ์„ ํ†ต์งธ๋กœ ๋ฐ”๊ฟ” ๋†“์€ 26KB์งœ๋ฆฌ C++ ๋ฐ”์ด๋„ˆ๋ฆฌ. ์‹œ๋“œ๊ฐ€ time(NULL)์ด ์•„๋‹ˆ๋ผ ์ƒ์ˆ˜ 0xBEEF๊ณ , ๋ฐ”์ดํŠธ๋งˆ๋‹ค rand()๋ฅผ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์“ฐ๋ฉฐ, ์„ธ ๊ฐˆ๋ž˜ ๋ณ€ํ™˜์ด ๋ชจ๋‘ ๊ฐ€์—ญ์ด๋‹ค. ๊ทธ ์„ธ ์กฐ๊ฑด์ด ๋งž์•„๋–จ์–ด์ ธ์„œ ์—ญํ•จ์ˆ˜๋ฅผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ํ•œ ๋ฒˆ์”ฉ ๊ฑธ๋ฉด 6,220,854๋ฐ”์ดํŠธ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋Œ์•„์˜จ๋‹ค.

๋ฌธ์ œ: DreamHack โ€” photographer ๋ถ„๋ฅ˜: reversing ๋‚œ์ด๋„: ๐Ÿฅˆ Silver 3 FLAG: DH{d85a130283f58035eb327b56e37d2dd087156ba629687a5d52bd4af3c5bfa4f4}

๋ฌธ์ œ ์„ค๋ช…์€ ํ•œ ์ค„์ด๋‹ค. "I lost my big-secret photo..."

๋ฐ›์€ ๊ฑด ์žƒ์–ด๋ฒ„๋ ธ๋‹ค๋Š” ์‚ฌ์ง„์˜ ์ž”ํ•ด ํ•˜๋‚˜์™€, ๊ทธ ์‚ฌ์ง„์„ ๊ทธ ๊ผด๋กœ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ ํ•˜๋‚˜๋‹ค.


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…photographer
๋‚œ์ด๋„๐Ÿฅˆ Silver 3
๋ถ„๋ฅ˜reversing
์ œ๊ณต ํŒŒ์ผprob (26,848B, stripped PIE C++), flag.bmp.enc (6,220,854B)
์„œ๋ฒ„์—†์Œ โ€” ํŒŒ์ผ๋งŒ ์ค€๋‹ค
ํ•ต์‹ฌ ๊ธฐ๋ฒ•๊ณ ์ • ์‹œ๋“œ srand(0xBEEF) + ๋ฐ”์ดํŠธ๋ณ„ ๊ฐ€์—ญ ๋ณ€ํ™˜์˜ ์—ญ์‚ฐ

prob์€ flag.bmp๋ฅผ ์ฝ์–ด flag.bmp.enc๋ฅผ ๋ฑ‰๋Š” ํ•œ ๋ฐฉํ–ฅ ๋ณ€ํ™˜๊ธฐ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๊ฑด ๊ฒฐ๊ณผ๋ฌผ๋ฟ์ด๋‹ˆ, ๊ทธ ๋ณ€ํ™˜์„ ์ฝ์–ด์„œ ๊ฑฐ๊พธ๋กœ ๋Œ๋ฆฌ๋ฉด ๋œ๋‹ค.

๋˜๋Œ๋ฆฐ BMP๋ฅผ ์—ด๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ทธ๋ฆผ์œผ๋กœ ๊ทธ๋ ค์ ธ ์žˆ๋‹ค.



๐Ÿ”ฌ ์ •์ฐฐ โ€” ๋ฐ›์€ ๊ฒƒ ๋‘ ๊ฐœ

๋จผ์ € ๋ญ˜ ๋ฐ›์•˜๋Š”์ง€๋ถ€ํ„ฐ ๋ณธ๋‹ค.

ls -l extracted && file extracted/* && xxd -l 64 extracted/flag.bmp.enc

lsยทfileยทxxd ๋กœ ํ™•์ธํ•œ ๋ฐฐํฌ๋ฌผ โ€” prob ์€ stripped PIE C++ ์‹คํ–‰ํŒŒ์ผ์ด๊ณ  flag.bmp.enc ๋Š” 6,220,854๋ฐ”์ดํŠธ์งœ๋ฆฌ data ๋กœ ์žกํžŒ๋‹ค. ์•ž 64๋ฐ”์ดํŠธ ํ—ฅ์Šค์—์„œ 00 ๊ณผ ff ๊ฐ€ ์„ธ ๋ฐ”์ดํŠธ ์ฃผ๊ธฐ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒŒ ๋ณด์ธ๋‹ค
lsยทfileยทxxd ๋กœ ํ™•์ธํ•œ ๋ฐฐํฌ๋ฌผ โ€” prob ์€ stripped PIE C++ ์‹คํ–‰ํŒŒ์ผ์ด๊ณ  flag.bmp.enc ๋Š” 6,220,854๋ฐ”์ดํŠธ์งœ๋ฆฌ data ๋กœ ์žกํžŒ๋‹ค. ์•ž 64๋ฐ”์ดํŠธ ํ—ฅ์Šค์—์„œ 00 ๊ณผ ff ๊ฐ€ ์„ธ ๋ฐ”์ดํŠธ ์ฃผ๊ธฐ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒŒ ๋ณด์ธ๋‹ค

flag.bmp.enc๋Š” file์ด data๋ผ๊ณ ๋งŒ ํ•œ๋‹ค. BMP๋ผ๋ฉด BM์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ฒซ ๋‘ ๋ฐ”์ดํŠธ๊ฐ€ 72 35๋‹ค. ํ—ค๋”๊นŒ์ง€ ๊ฑด๋“œ๋ ธ๋‹ค๋Š” ๋œป์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ—ฅ์Šค๋ฅผ ๋ณด๋ฉด ๊ทœ์น™์ด ํ•˜๋‚˜ ๋ˆˆ์— ๋ˆ๋‹ค. 00๊ณผ ff๊ฐ€ ์„ธ ๋ฐ”์ดํŠธ ์ฃผ๊ธฐ๋กœ ๊ณ„์† ๋‚˜์˜จ๋‹ค. ์ฒซ ์ค„ 7235 ed32 e597 b400 9fea d841 9900 dc4b์—์„œ 00์€ ์˜คํ”„์…‹ 7๊ณผ 13์— ์žˆ๋‹ค. ๋‘˜ ๋‹ค 3์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๊ฐ€ 1์ด๋‹ค. ๊ทธ ์•„๋ž˜ ์ค„๋“ค์˜ ff๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

24๋น„ํŠธ BMP๋Š” ํ”ฝ์…€ ํ•˜๋‚˜๊ฐ€ B, G, R ์„ธ ๋ฐ”์ดํŠธ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ "์„ธ ๋ฐ”์ดํŠธ ์ฃผ๊ธฐ"๋ฅผ ๋ณด๋ฉด ํ”ฝ์…€ ๊ตฌ์กฐ๊ฐ€ ์‚ด์•„ ์žˆ๋‹ค๊ณ  โ€” ๊ฐ’์€ ๊ทธ๋Œ€๋กœ๊ณ  ์ž๋ฆฌ๋งŒ ์„ž์˜€๋‹ค๊ณ  โ€” ์ƒ๊ฐํ•˜๊ธฐ ์‰ฝ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•œ ๋ฒˆ ํ—›์งš์—ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋ญ˜ ๋งํฌํ–ˆ๋Š”์ง€๋‹ค. stripped๋ผ๋„ PLT๋Š” ๋‚จ๋Š”๋‹ค.

objdump -d -M intel extracted/prob | grep -E "@plt>:" | grep -iE "rand|time|memmove|alarm|clock"

objdump ๋กœ ๋ฝ‘์€ PLT ๋ชฉ๋ก โ€” rand@plt ์™€ srand@plt ๋Š” ์žˆ๋Š”๋ฐ time@pltยทclock@plt ๋Š” ํ•œ ๊ฐœ๋„ ์—†๋‹ค. ์‹œ๋“œ๊ฐ€ ์‹คํ–‰ ์‹œ๊ฐ์ด ์•„๋‹ˆ๋ผ ์ƒ์ˆ˜๋ผ๋Š” ์ •์  ๊ทผ๊ฑฐ๊ฐ€ ๋œ๋‹ค
objdump ๋กœ ๋ฝ‘์€ PLT ๋ชฉ๋ก โ€” rand@plt ์™€ srand@plt ๋Š” ์žˆ๋Š”๋ฐ time@pltยทclock@plt ๋Š” ํ•œ ๊ฐœ๋„ ์—†๋‹ค. ์‹œ๋“œ๊ฐ€ ์‹คํ–‰ ์‹œ๊ฐ์ด ์•„๋‹ˆ๋ผ ์ƒ์ˆ˜๋ผ๋Š” ์ •์  ๊ทผ๊ฑฐ๊ฐ€ ๋œ๋‹ค

rand@plt์™€ srand@plt๊ฐ€ ์žˆ๋‹ค. ๋‚œ์ˆ˜๋ฅผ ์“ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ time@plt๋„ clock@plt๋„ ์—†๋‹ค. ์‹œ๋“œ๋ฅผ ์‹คํ–‰ ์‹œ๊ฐ์—์„œ ๋ฝ‘์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค. ์‹œ๋“œ๊ฐ€ ์ƒ์ˆ˜๋ฉด ๋‚œ์ˆ˜์—ด์ด ๋งค ์‹คํ–‰ ๋˜‘๊ฐ™๊ณ , ๊ทธ๋Ÿฌ๋ฉด ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ด ํ•œ ์ค„์ด ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค.


๐Ÿ› ์‚ฝ์งˆ โ€” ์ž๋ฆฌ๋ฅผ ์„ž์—ˆ๋‹ค๊ณ  ๋ฏฟ์—ˆ๋‹ค

โ–ถ๐Ÿ› ์‚ฝ์งˆ โ€” 'ํ”ฝ์…€ ์…”ํ”Œ'์ด๋ผ๋Š” ์ž˜๋ชป๋œ ์ฒซ ๊ฐ€์„ค

ํ—ฅ์Šค์˜ ์„ธ ๋ฐ”์ดํŠธ ์ฃผ๊ธฐ + rand() ์‚ฌ์šฉ. ์ด ๋‘˜์„ ๋ถ™์ด๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•˜๋‚˜์˜ ๊ทธ๋ฆผ์ด ๋– ์˜ฌ๋ž๋‹ค.

ํ”ฝ์…€(๋˜๋Š” ๋ฐ”์ดํŠธ)์˜ ์ž๋ฆฌ๋ฅผ ๋‚œ์ˆ˜๋กœ ์„ž์€ ๊ฒƒ์ด๋‹ค. ๊ฐ’์€ ๊ทธ๋Œ€๋กœ๋‹ˆ๊นŒ 00ยทff ๊ฐ™์€ ์ฑ„๋„๊ฐ’์ด ์‚ด์•„ ์žˆ๊ณ , std::shuffle์ด๋‚˜ Fisherโ€“Yates๋ฅผ ๋Œ๋ ธ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์ฒ˜์Œ์—” memmove@plt๊ฐ€ ์žˆ๋Š” ๊ฒƒ๋„ "๋ธ”๋ก์„ ์˜ฎ๊ธด๋‹ค"๋Š” ์ฆ๊ฑฐ๋กœ ์ฝ์—ˆ๋‹ค. ์…”ํ”Œ์ด๋ฉด ์—ญ์…”ํ”Œ๋งŒ ๋งŒ๋“ค๋ฉด ๋˜๋‹ˆ main์„ ๋Œ€์ถฉ ํ›‘๊ณ  rand() % n ํŒจํ„ด๋งŒ ์ฐพ์œผ๋ ค ํ–ˆ๋‹ค.

ํ‹€๋ ธ๋‹ค. main์—๋Š” ๋‘ ์›์†Œ๋ฅผ ๋งž๋ฐ”๊พธ๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค. mov BYTE PTR [rax], bl โ€” ์ฝ์€ ์ž๋ฆฌ์— ๊ทธ๋Œ€๋กœ ๋˜์“ด๋‹ค. ์ž๋ฆฌ๋Š” ํ•œ ๋ฒˆ๋„ ์•ˆ ๋ฐ”๋€๋‹ค.

์„ธ ๋ฐ”์ดํŠธ ์ฃผ๊ธฐ์˜ ์ •์ฒด๋„ ์…”ํ”Œ์ด ์•„๋‹ˆ์—ˆ๋‹ค. ์•„๋ž˜์—์„œ ๋ณด๊ฒ ์ง€๋งŒ ๋ณ€ํ™˜์€ i % 3์œผ๋กœ ์„ธ ๊ฐˆ๋ž˜๋กœ ๊ฐˆ๋ฆฌ๊ณ , ๊ทธ์ค‘ i%3==1 ๊ฐˆ๋ž˜๊ฐ€ ํšŒ์ „๋งŒ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ 00000000๊ณผ 11111111์€ ๋ช‡ ์นธ์„ ๋Œ๋ ค๋„ ์ž๊ธฐ ์ž์‹ ์ด๋‹ค. ์›๋ณธ BMP๋Š” ํฐ ๋ฐฐ๊ฒฝ(ff ff ff)๊ณผ ๊ฒ€์€ ๊ธ€์ž(00 00 00)๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋‹ˆ, ๊ทธ ์ž๋ฆฌ์˜ 00ยทff๋Š” ๋ณ€ํ™˜์„ ํ†ต๊ณผํ•ด๋„ ๊ทธ๋Œ€๋กœ ๋‚จ๋Š”๋‹ค.

์‹ค์ œ๋กœ ์•ž 4KB์—์„œ ff 1353๊ฐœ ์ค‘ 1347๊ฐœ๊ฐ€ i%3==1 ์ž๋ฆฌ์— ์žˆ๋‹ค. ํ”ฝ์…€ ๊ตฌ์กฐ๊ฐ€ ์‚ด์•„๋‚จ์€ ๊ฒŒ ์•„๋‹ˆ๋ผ, ์„ธ ๊ฐˆ๋ž˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ทน๋‹จ๊ฐ’์„ ๋ณด์กดํ•œ ๊ฒƒ๋ฟ์ด๋‹ค.

๊ฐ€์„ค์ด ๊ด€์ธก์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๊ณ  ๋งž๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค. memmove@plt๋„ ์…”ํ”Œ์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ std::vector๊ฐ€ ์ปค์งˆ ๋•Œ ์“ฐ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.


๐Ÿ” main ์„ ์ฝ๋Š”๋‹ค

main์€ ์‹ฌ๋ณผ์ด ์—†๋‹ค. ์—”ํŠธ๋ฆฌ(_start)๊ฐ€ __libc_start_main์— ๋„˜๊ธฐ๋Š” ์ฒซ ์ธ์ž๋ฅผ ๋ณด๋ฉด 0x24fb๋‹ค.

objdump -d -M intel --start-address=0x24fb --stop-address=0x2540 extracted/prob | sed -f annot_seed.sed

objdump ๋กœ ๋ณธ main ๋„์ž…๋ถ€ โ€” mov edi,0xbeef ๋‹ค์Œ์— ๊ณง๋ฐ”๋กœ call srand@plt ๊ฐ€ ์žˆ๊ณ , lea ๋กœ .rodata 0x4004("flag.bmp")์™€ 0x400d("flag.bmp.enc")๋ฅผ ์ง‘์–ด ifstream/ofstream ์— ๋„˜๊ธด๋‹ค
objdump ๋กœ ๋ณธ main ๋„์ž…๋ถ€ โ€” mov edi,0xbeef ๋‹ค์Œ์— ๊ณง๋ฐ”๋กœ call srand@plt ๊ฐ€ ์žˆ๊ณ , lea ๋กœ .rodata 0x4004("flag.bmp")์™€ 0x400d("flag.bmp.enc")๋ฅผ ์ง‘์–ด ifstream/ofstream ์— ๋„˜๊ธด๋‹ค

์ฒซ ์ค„๋ถ€ํ„ฐ ๋‹ต์ด ๋‚˜์˜จ๋‹ค.

251a:  bf ef be 00 00    mov  edi,0xbeef        ; ์‹œ๋“œ
251f:  e8 6c fd ff ff    call 2290 <srand@plt>  ; srand(0xbeef)

srand(0xBEEF). ํ”„๋กœ๊ทธ๋žจ์ด ๋ญ˜ ํ•˜๋“  ๋‚œ์ˆ˜์—ด์€ ํ•ญ์ƒ ๊ฐ™๋‹ค.

์ด์–ด์„œ lea๋กœ ์ง‘๋Š” ๋‘ ์ฃผ์†Œ 0x4004, 0x400d๊ฐ€ ๊ฐ๊ฐ ifstream๊ณผ ofstream ์ƒ์„ฑ์ž๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ๊ทธ ์ž๋ฆฌ์— ๋ญ๊ฐ€ ์žˆ๋Š”์ง€๋Š” .rodata๋ฅผ ๊ทธ๋Œ€๋กœ ๋คํ”„ํ•˜๋ฉด ๋ณด์ธ๋‹ค.

objdump -s -j .rodata extracted/prob

objdump -s ๋กœ ๋คํ”„ํ•œ .rodata โ€” 0x4004 ์— "flag.bmp", 0x400d ์— "flag.bmp.enc" ๊ฐ€ ๋‚˜๋ž€ํžˆ ์žˆ๊ณ  ๊ทธ ๋’ค๋กœ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋ฌธ์ž์—ด์ด ์ด์–ด์ง„๋‹ค
objdump -s ๋กœ ๋คํ”„ํ•œ .rodata โ€” 0x4004 ์— "flag.bmp", 0x400d ์— "flag.bmp.enc" ๊ฐ€ ๋‚˜๋ž€ํžˆ ์žˆ๊ณ  ๊ทธ ๋’ค๋กœ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋ฌธ์ž์—ด์ด ์ด์–ด์ง„๋‹ค

flag.bmp๋ฅผ ์ฝ์–ด flag.bmp.enc๋กœ ์“ด๋‹ค. ํŒŒ์ผ ์ „์ฒด๋ฅผ std::vector<char>์— ๋‹ด๊ณ , ์ธ๋ฑ์Šค๋ฅผ 0๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ›‘๋Š” ๋ฃจํ”„๊ฐ€ ์ด์–ด์ง„๋‹ค.

๋ฃจํ”„ ๋ณธ์ฒด ์ฒซ๋จธ๋ฆฌ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๋‹ค.

objdump -d -M intel --start-address=0x2649 --stop-address=0x2699 extracted/prob | sed -f annot_dispatch.sed

objdump ๋กœ ๋ณธ ๋ฃจํ”„ ์ง„์ž…๋ถ€ โ€” movabs rdx,0xaaaaaaaaaaaaaaab ์™€ mul ๋กœ i/3 ์„ ๊ตฌํ•œ ๋’ค sub ๋กœ i%3 ์„ ๋งŒ๋“ค๊ณ , ๊ทธ ๊ฐ’ 0ยท1ยท2 ์— ๋”ฐ๋ผ 0x2699ยท0x26feยท0x2757 ์„ธ ๊ณณ์œผ๋กœ ๋ถ„๊ธฐํ•œ๋‹ค
objdump ๋กœ ๋ณธ ๋ฃจํ”„ ์ง„์ž…๋ถ€ โ€” movabs rdx,0xaaaaaaaaaaaaaaab ์™€ mul ๋กœ i/3 ์„ ๊ตฌํ•œ ๋’ค sub ๋กœ i%3 ์„ ๋งŒ๋“ค๊ณ , ๊ทธ ๊ฐ’ 0ยท1ยท2 ์— ๋”ฐ๋ผ 0x2699ยท0x26feยท0x2757 ์„ธ ๊ณณ์œผ๋กœ ๋ถ„๊ธฐํ•œ๋‹ค

0xaaaaaaaaaaaaaaab๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ 3์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋‚˜๋ˆ—์…ˆ์„ ๊ณฑ์…ˆ์œผ๋กœ ๋ฐ”๊ฟ€ ๋•Œ ์“ฐ๋Š” ์ƒ์ˆ˜๋‹ค. ๊ทธ๊ฑธ๋กœ i / 3์„ ๊ตฌํ•˜๊ณ , i - 3*(i/3)์œผ๋กœ i % 3์„ ๋งŒ๋“  ๋‹ค์Œ 0ยท1ยท2 ์„ธ ๊ฐˆ๋ž˜๋กœ ๋›ด๋‹ค.

์ฆ‰ ๋ฐ”์ดํŠธ๋งˆ๋‹ค ์ธ๋ฑ์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ณ€ํ™˜์ด ๊ฑธ๋ฆฐ๋‹ค. ์•„๊นŒ ํ—ฅ์Šค์—์„œ ๋ณธ ์„ธ ๋ฐ”์ดํŠธ ์ฃผ๊ธฐ์˜ ์ •์ฒด๊ฐ€ ์ด๊ฑฐ๋‹ค.



๐Ÿ’ฃ ์„ธ ๊ฐˆ๋ž˜ ๋ณ€ํ™˜

์„ธ ๋ถ„๊ธฐ๋ฅผ ์ฐจ๋ก€๋กœ ์ฝ๋Š”๋‹ค.

i % 3 == 0

objdump -d -M intel --start-address=0x2699 --stop-address=0x26fe extracted/prob | sed -f annot_cases.sed

objdump ๋กœ ๋ณธ i%3==0 ๋ถ„๊ธฐ โ€” ror8(b,7) ์„ ๋ถ€๋ฅธ ๋’ค rand() ๋ฅผ ๋”ํ•˜๊ณ  movzx ๋กœ ํ•˜์œ„ 1๋ฐ”์ดํŠธ๋งŒ ๋‚จ๊ธด ๋‹ค์Œ rol8(x,4) ๋ฅผ ๊ฑธ์–ด v[i] ์— ๋˜์“ด๋‹ค
objdump ๋กœ ๋ณธ i%3==0 ๋ถ„๊ธฐ โ€” ror8(b,7) ์„ ๋ถ€๋ฅธ ๋’ค rand() ๋ฅผ ๋”ํ•˜๊ณ  movzx ๋กœ ํ•˜์œ„ 1๋ฐ”์ดํŠธ๋งŒ ๋‚จ๊ธด ๋‹ค์Œ rol8(x,4) ๋ฅผ ๊ฑธ์–ด v[i] ์— ๋˜์“ด๋‹ค

ror8(v[i], 7) โ†’ + rand() โ†’ ํ•˜์œ„ ๋ฐ”์ดํŠธ๋งŒ ๋‚จ๊น€ โ†’ rol8(..., 4). ํšŒ์ „ ๋‘ ๋ฒˆ์— ๋ง์…ˆ ํ•œ ๋ฒˆ์ด๋‹ค.

i % 3 == 1

objdump -d -M intel --start-address=0x26fe --stop-address=0x2757 extracted/prob | sed -f annot_cases.sed

objdump ๋กœ ๋ณธ i%3==1 ๋ถ„๊ธฐ โ€” cdq/shr/and 0x7 ์กฐํ•ฉ์œผ๋กœ rand() ๋ฅผ 8๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•ด ๊ทธ ๊ฐ’์„ ํšŒ์ „๋Ÿ‰์œผ๋กœ ror8 ์„ ๋ถ€๋ฅธ๋‹ค
objdump ๋กœ ๋ณธ i%3==1 ๋ถ„๊ธฐ โ€” cdq/shr/and 0x7 ์กฐํ•ฉ์œผ๋กœ rand() ๋ฅผ 8๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•ด ๊ทธ ๊ฐ’์„ ํšŒ์ „๋Ÿ‰์œผ๋กœ ror8 ์„ ๋ถ€๋ฅธ๋‹ค

์—ฌ๊ธฐ์„  ๋‚œ์ˆ˜๊ฐ€ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ํšŒ์ „๋Ÿ‰์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. cdq; shr edx,0x1d; add; and 0x7; sub๋Š” ๋ถ€ํ˜ธ ์žˆ๋Š” % 8์„ ์ธ๋ผ์ธํ•œ ๊ฒƒ์ธ๋ฐ, rand()๋Š” ํ•ญ์ƒ 0 ์ด์ƒ์ด๋ผ ์‹ค์งˆ์ ์œผ๋กœ rand() & 7์ด๋‹ค.

i % 3 == 2

objdump -d -M intel --start-address=0x2757 --stop-address=0x279b extracted/prob | sed -f annot_cases.sed

objdump ๋กœ ๋ณธ i%3==2 ๋ถ„๊ธฐ โ€” xor eax,ebx ๋กœ ๋ฐ”์ดํŠธ์™€ rand() ๋ฅผ XOR ํ•œ ๋’ค lea ebx,[rax-0x18] ๋กœ 0x18 ์„ ๋นผ๊ณ  ๊ทธ ํ•˜์œ„ ๋ฐ”์ดํŠธ๋ฅผ v[i] ์— ๋˜์“ด๋‹ค
objdump ๋กœ ๋ณธ i%3==2 ๋ถ„๊ธฐ โ€” xor eax,ebx ๋กœ ๋ฐ”์ดํŠธ์™€ rand() ๋ฅผ XOR ํ•œ ๋’ค lea ebx,[rax-0x18] ๋กœ 0x18 ์„ ๋นผ๊ณ  ๊ทธ ํ•˜์œ„ ๋ฐ”์ดํŠธ๋ฅผ v[i] ์— ๋˜์“ด๋‹ค

XOR ํ›„ 0x18์„ ๋บ€๋‹ค. 32๋น„ํŠธ๋กœ ๊ณ„์‚ฐํ•˜์ง€๋งŒ ์ €์žฅ์€ mov BYTE PTR [rax], bl โ€” ํ•˜์œ„ 1๋ฐ”์ดํŠธ๋งŒ ๋‚จ๋Š”๋‹ค. ๋บ„์…ˆ์€ mod 256์—์„œ ํ•˜์œ„ ๋ฐ”์ดํŠธ๋งŒ ๋ณด๋ฉด ๋˜๋‹ˆ ์ƒ์œ„ ๋น„ํŠธ๋Š” ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.

์„ธ ๊ฐˆ๋ž˜๋ฅผ ํ•œ ์žฅ์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡๋‹ค.

์„ธ ๊ฐˆ๋ž˜ ๋ณ€ํ™˜ ํŒŒ์ดํ”„๋ผ์ธ ๋„์‹ โ€” srand(0xbeef) ์ดํ›„ flag.bmp ์˜ ๋ฐ”์ดํŠธ v[0], v[1], v[2] ์™€ ๋‚œ์ˆ˜ r0, r1, r2 ๊ฐ€ ์ธ๋ฑ์Šค ์ˆœ์„œ๋กœ ์ง์ง€์–ด์ง€๊ณ  i%3 ๊ฐ’์— ๋”ฐ๋ผ rol8/ror8/XOR ์„ธ ์‹ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ ์šฉ๋œ๋‹ค
์„ธ ๊ฐˆ๋ž˜ ๋ณ€ํ™˜ ํŒŒ์ดํ”„๋ผ์ธ ๋„์‹ โ€” srand(0xbeef) ์ดํ›„ flag.bmp ์˜ ๋ฐ”์ดํŠธ v[0], v[1], v[2] ์™€ ๋‚œ์ˆ˜ r0, r1, r2 ๊ฐ€ ์ธ๋ฑ์Šค ์ˆœ์„œ๋กœ ์ง์ง€์–ด์ง€๊ณ  i%3 ๊ฐ’์— ๋”ฐ๋ผ rol8/ror8/XOR ์„ธ ์‹ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ ์šฉ๋œ๋‹ค

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒŒ ๋‘ ๊ฐ€์ง€๋‹ค.

์ฒซ์งธ, ์„ธ ๊ฐˆ๋ž˜ ๋ชจ๋‘ rand()๋ฅผ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์”ฉ ๋ถ€๋ฅธ๋‹ค. ๋ถ„๊ธฐ๋งˆ๋‹ค ๊ฐœ์ˆ˜๊ฐ€ ๋‹ฌ๋ž๋‹ค๋ฉด ๋‚œ์ˆ˜ ์†Œ๋น„ ์œ„์น˜๋ฅผ ๋”ฐ๋กœ ์ถ”์ ํ•ด์•ผ ํ–ˆ์„ ํ…๋ฐ, ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†๋‹ค. i๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋Š” i๋ฒˆ์งธ ๋‚œ์ˆ˜๋ฅผ ์“ด๋‹ค.

๋‘˜์งธ, ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค. ํšŒ์ „ยท๋ง์…ˆยทXORยท๋บ„์…ˆ๋ฟ์ด๊ณ  ์ „๋ถ€ 8๋น„ํŠธ ์•ˆ์—์„œ ๊ฐ€์—ญ์ด๋‹ค. ์—ญํ•จ์ˆ˜๋ฅผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๊ฑธ๋ฉด ๊ทธ๋Œ€๋กœ ๋Œ์•„์˜จ๋‹ค.


๐Ÿ” ํšŒ์ „ ํ—ฌํผ ๋‘ ๊ฐœ

0x2489์™€ 0x24c2๊ฐ€ ๋ญ”์ง€ ํ™•์ธํ•œ๋‹ค. ๋‘˜ ๋‹ค ์ธ์ž๋ฅผ ๋‘ ๊ฐœ ๋ฐ›๋Š” ์งง์€ ํ•จ์ˆ˜๋‹ค.

objdump -d -M intel --start-address=0x2489 --stop-address=0x24c2 extracted/prob | sed -f annot_rot.sed

objdump ๋กœ ๋ณธ 0x2489 ํ—ฌํผ โ€” movzx ๋กœ ๋ฐ”์ดํŠธ๋ฅผ ์˜ ํ™•์žฅํ•œ ๋’ค sar edx,cl ๋กœ n ๋งŒํผ ์˜ค๋ฅธ์ชฝ, shl edx,(8-n) ์œผ๋กœ ์™ผ์ชฝ ์‹œํ”„ํŠธํ•œ ๊ฒฐ๊ณผ๋ฅผ OR ํ•œ๋‹ค. 8๋น„ํŠธ ์˜ค๋ฅธ์ชฝ ํšŒ์ „ ror8 ์ด๋‹ค
objdump ๋กœ ๋ณธ 0x2489 ํ—ฌํผ โ€” movzx ๋กœ ๋ฐ”์ดํŠธ๋ฅผ ์˜ ํ™•์žฅํ•œ ๋’ค sar edx,cl ๋กœ n ๋งŒํผ ์˜ค๋ฅธ์ชฝ, shl edx,(8-n) ์œผ๋กœ ์™ผ์ชฝ ์‹œํ”„ํŠธํ•œ ๊ฒฐ๊ณผ๋ฅผ OR ํ•œ๋‹ค. 8๋น„ํŠธ ์˜ค๋ฅธ์ชฝ ํšŒ์ „ ror8 ์ด๋‹ค

(b >> n) | (b << (8 - n)) โ€” ์˜ค๋ฅธ์ชฝ ํšŒ์ „์ด๋‹ค.

objdump -d -M intel --start-address=0x24c2 --stop-address=0x24fb extracted/prob | sed -f annot_rot.sed

objdump ๋กœ ๋ณธ 0x24c2 ํ—ฌํผ โ€” 0x2489 ์™€ ๊ฐ™์€ ๊ตฌ์กฐ์ธ๋ฐ shl ๊ณผ sar ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ˜๋Œ€๋‹ค. ๋จผ์ € n ๋งŒํผ ์™ผ์ชฝ์œผ๋กœ ๋ฐ€๊ณ  8-n ๋งŒํผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฏผ ๊ฒฐ๊ณผ๋ฅผ OR ํ•˜๋ฏ€๋กœ 8๋น„ํŠธ ์™ผ์ชฝ ํšŒ์ „ rol8 ์ด๋‹ค
objdump ๋กœ ๋ณธ 0x24c2 ํ—ฌํผ โ€” 0x2489 ์™€ ๊ฐ™์€ ๊ตฌ์กฐ์ธ๋ฐ shl ๊ณผ sar ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ˜๋Œ€๋‹ค. ๋จผ์ € n ๋งŒํผ ์™ผ์ชฝ์œผ๋กœ ๋ฐ€๊ณ  8-n ๋งŒํผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฏผ ๊ฒฐ๊ณผ๋ฅผ OR ํ•˜๋ฏ€๋กœ 8๋น„ํŠธ ์™ผ์ชฝ ํšŒ์ „ rol8 ์ด๋‹ค

์ด์ชฝ์€ ์‹œํ”„ํŠธ ์ˆœ์„œ๊ฐ€ ๋ฐ˜๋Œ€๋ผ ์™ผ์ชฝ ํšŒ์ „์ด๋‹ค.

๋‘ ํ•จ์ˆ˜ ๋ชจ๋‘ and DWORD PTR [rbp-0x8], 0x7๋กœ ํšŒ์ „๋Ÿ‰์„ 0~7๋กœ ์ž๋ฅธ๋‹ค. n์ด 0์ด๋ฉด 8 - n = 8์ด ๋˜์–ด ์‹œํ”„ํŠธ๊ฐ€ ๋ฐ”์ดํŠธ ๋ฐ–์œผ๋กœ ๋ฐ€๋ ค๋‚˜๋Š”๋ฐ, ์ €์žฅํ•  ๋•Œ ํ•˜์œ„ 1๋ฐ”์ดํŠธ๋งŒ ์“ฐ๋ฏ€๋กœ ๊ฒฐ๊ณผ๋Š” ์›๋ž˜ ๊ฐ’ ๊ทธ๋Œ€๋กœ๋‹ค. ํ•ญ๋“ฑ์ด ๋˜๋‹ˆ ๋”ฐ๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•  ํ•„์š”๋Š” ์—†๋‹ค.

sar์ด ์“ฐ์ธ ๊ฒŒ ๋ˆˆ์— ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ ์•ž์— movzx edx, BYTE PTR [rbp-0x4]๋กœ ์˜ ํ™•์žฅ์„ ํ•ด ๋‘”๋‹ค. ๊ฐ’์ด ํ•ญ์ƒ 0~255๋ผ ์‚ฐ์ˆ  ์‹œํ”„ํŠธ๋“  ๋…ผ๋ฆฌ ์‹œํ”„ํŠธ๋“  ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค. ์ด๊ฑธ ๋†“์น˜๊ณ  ๋ถ€ํ˜ธ ์žˆ๋Š” ํƒ€์ž…์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด ์กฐ์šฉํžˆ ์–ด๊ธ‹๋‚œ๋‹ค โ€” ์•„๋ž˜ ์‚ฝ์งˆ 2์—์„œ ์‹ค์ œ๋กœ ๋Œ๋ ค๋ดค๋‹ค.


๐Ÿงช ๋Ÿฐํƒ€์ž„ ํ™•์ธ โ€” ์‹œ๋“œ์™€ ๋‚œ์ˆ˜์—ด

์—ฌ๊ธฐ๊นŒ์ง€๋Š” ์ „๋ถ€ ์ •์  ๋ถ„์„์ด๋‹ค. ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋„๋Š”์ง€ ๋ถ™์–ด์„œ ๋ณธ๋‹ค.

set pagination off
set confirm off
 
# 1) srand() ์— ์‹ค์ œ๋กœ ์–ด๋–ค ์‹œ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”์ง€ โ€” ์ •์ ์œผ๋กœ ์ฝ์€ 0xbeef ๋ฅผ ๋Ÿฐํƒ€์ž„์œผ๋กœ ํ™•์ธ
break srand
run
printf "\n[gdb] srand(0x%x)  <- main+0x1f ์˜ mov edi,0xbeef ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋“ค์–ด์™”๋‹ค\n\n", $edi
 
# 2) ๊ทธ ์‹œ๋“œ์—์„œ ๋‚˜์˜ค๋Š” rand() ์•ž ์„ธ ๊ฐœ โ€” solve.py ์˜ ctypes ํ˜ธ์ถœ๊ณผ ๊ฐ™์•„์•ผ ํ•œ๋‹ค
delete 1
break rand
continue
finish
continue
finish
continue
finish
quit
gdb -q -batch -x ../verify.gdb ./prob 2>&1 | grep -vE "Missing separate|^Downloading|^Reading|Using host libthread"

gdb -batch ๋Ÿฐํƒ€์ž„ ํ™•์ธ โ€” __srandom (x=48879) ๋กœ ์‹œ๋“œ๊ฐ€ 0xbeef ์ž„์ด ์ฐํžˆ๊ณ  rand() ์„ธ ๋ฒˆ์˜ ๋ฐ˜ํ™˜๊ฐ’ 479531427 / 447733150 / 1307573299 ์ด ๋‚˜์˜จ๋‹ค. ๋ณต๊ท€ ์ฃผ์†Œ๋Š” PIE ๋ฒ ์ด์Šค+0x26cb, +0x2703, +0x277a ๋กœ ์„ธ ๋ถ„๊ธฐ์™€ ์ผ์น˜ํ•œ๋‹ค
gdb -batch ๋Ÿฐํƒ€์ž„ ํ™•์ธ โ€” __srandom (x=48879) ๋กœ ์‹œ๋“œ๊ฐ€ 0xbeef ์ž„์ด ์ฐํžˆ๊ณ  rand() ์„ธ ๋ฒˆ์˜ ๋ฐ˜ํ™˜๊ฐ’ 479531427 / 447733150 / 1307573299 ์ด ๋‚˜์˜จ๋‹ค. ๋ณต๊ท€ ์ฃผ์†Œ๋Š” PIE ๋ฒ ์ด์Šค+0x26cb, +0x2703, +0x277a ๋กœ ์„ธ ๋ถ„๊ธฐ์™€ ์ผ์น˜ํ•œ๋‹ค

์„ธ ๊ฐ€์ง€๊ฐ€ ํ•œ ํ™”๋ฉด์—์„œ ํ™•์ธ๋œ๋‹ค.

__srandom (x=48879) โ€” 48879๋Š” 0xBEEF๋‹ค. ์ •์ ์œผ๋กœ ์ฝ์€ ๊ฐ’์ด ๋Ÿฐํƒ€์ž„์—๋„ ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

rand() ๋ฐ˜ํ™˜๊ฐ’์€ ์ˆœ์„œ๋Œ€๋กœ 479531427, 447733150, 1307573299.

๊ทธ๋ฆฌ๊ณ  ๋ณต๊ท€ ์ฃผ์†Œ๊ฐ€ ...66cb, ...6703, ...677a๋‹ค. PIE ๋ฒ ์ด์Šค๋ฅผ ๋นผ๋ฉด 0x26cb, 0x2703, 0x277a โ€” ๊ฐ๊ฐ i%3==0, 1, 2 ๋ถ„๊ธฐ ์•ˆ์˜ call rand@plt ๋ฐ”๋กœ ๋‹ค์Œ์ด๋‹ค. ์„ธ ๋ถ„๊ธฐ๊ฐ€ ์ธ๋ฑ์Šค ์ˆœ์„œ๋Œ€๋กœ ๋‚œ์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ๊ฐ„๋‹ค๋Š” ๊ฒŒ ์‹คํ–‰์œผ๋กœ ํ™•์ธ๋œ๋‹ค.

PIE ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ก€๋กœ ๊ฐ€์ •ํ•˜์ง€ ์•Š๊ณ  ํ™”๋ฉด์— ์ฐํžŒ ๋ณต๊ท€ ์ฃผ์†Œ์—์„œ ์—ญ์‚ฐํ–ˆ๋‹ค. ๋ฒ ์ด์Šค๋Š” ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.



๐Ÿš€ solve.py

์—ญํ•จ์ˆ˜๋Š” ๊ทธ๋Œ€๋กœ ๋’ค์ง‘์œผ๋ฉด ๋œ๋‹ค.

i % 3์•”ํ˜ธํ™”๋ณตํ˜ธํ™”
0rol8((ror8(b,7) + r) & 0xff, 4)rol8((ror8(c,4) - r) & 0xff, 7)
1ror8(b, r & 7)rol8(c, r & 7)
2(b ^ r) - 0x18((c + 0x18) & 0xff) ^ (r & 0xff)

rand()๋Š” ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋‹ค. glibc์˜ rand()๋Š” TYPE_3 ๊ฐ€์‚ฐ ๋˜๋จน์ž„ ์ƒ์„ฑ๊ธฐ๋ผ ์†์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด ์ดˆ๊ธฐํ™” 34๋‹จ๊ณ„์™€ ์›Œ๋ฐ์—…๊นŒ์ง€ ์ •ํ™•ํžˆ ๋งž์ถฐ์•ผ ํ•œ๋‹ค. ํ•œ ๊ตฐ๋ฐ๋งŒ ํ‹€๋ ค๋„ 6๋ฐฑ๋งŒ ๋ฐ”์ดํŠธ๊ฐ€ ์ „๋ถ€ ์–ด๊ธ‹๋‚˜๊ณ , ๊ทธ๊ฑธ ๋””๋ฒ„๊น…ํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค. ctypes๋กœ ์‹œ์Šคํ…œ libc์˜ ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ๋ถ€๋ฅธ๋‹ค.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
DreamHack photographer (#1998, Silver 3, reversing) โ€” flag.bmp.enc ๋ณตํ˜ธ
 
prob ๋Š” flag.bmp ๋ฅผ ํ†ต์งธ๋กœ ์ฝ์–ด ํ•œ ๋ฐ”์ดํŠธ์”ฉ ๋ณ€ํ˜•ํ•œ ๋’ค flag.bmp.enc ๋กœ ์“ด๋‹ค.
main(0x24fb) ์„ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธฐ๋ฉด ์ด๋ ‡๋‹ค.
 
    srand(0xbeef);
    for (i = 0; i < v.size(); i++)
        switch (i % 3) {
        case 0: v[i] = rol8((ror8(v[i], 7) + rand()) & 0xff, 4); break;
        case 1: v[i] = ror8(v[i], rand() & 7);                    break;
        case 2: v[i] = (v[i] ^ rand()) - 0x18;                    break;
        }
 
ror8/rol8 ์€ ๊ฐ๊ฐ 0x2489 / 0x24c2 ์— ์žˆ๋Š” ์ธ๋ผ์ธ ์•„๋‹Œ ํ—ฌํผ๋‹ค.
 
    0x2489:  sar edx, cl(n&7) ; shl edx, 8-(n&7) ; or      โ†’  ROR8
    0x24c2:  shl edx, cl(n&7) ; sar edx, 8-(n&7) ; or      โ†’  ROL8
 
์„ธ ๋ถ„๊ธฐ ๋ชจ๋‘ ๋ฐ”์ดํŠธ๋‹น rand() ๋ฅผ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ๋ถ€๋ฅด๋ฏ€๋กœ ๋‚œ์ˆ˜ ์†Œ๋น„ ์ˆœ์„œ๊ฐ€ ์ธ๋ฑ์Šค ์ˆœ์„œ์™€ ๊ฐ™๋‹ค.
์‹œ๋“œ๊ฐ€ 0xbeef ์ƒ์ˆ˜๋ผ srand/rand ์ˆ˜์—ด์€ ์™„์ „ํžˆ ๊ฒฐ์ •์ ์ด๋‹ค โ€” time(NULL) ์ด ์—†๋‹ค๋Š” ๊ฒŒ
`objdump -d` ์˜ PLT ๋ชฉ๋ก์—์„œ ์ด๋ฏธ ๋ณด์ธ๋‹ค.
 
์—ญ๋ณ€ํ™˜:
    i%3==0:  b = rol8((ror8(c, 4) - rand()) & 0xff, 7)
    i%3==1:  b = rol8(c, rand() & 7)
    i%3==2:  b = ((c + 0x18) & 0xff) ^ (rand() & 0xff)
 
rand() ๋Š” ์žฌ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ctypes ๋กœ **libc ์˜ ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ** ๋ถ€๋ฅธ๋‹ค. glibc ์˜ TYPE_3
๊ฐ€์‚ฐ ๋˜๋จน์ž„ ์ƒ์„ฑ๊ธฐ๋ฅผ ์†์œผ๋กœ ์˜ฎ๊ธฐ๋‹ค ํ‹€๋ฆฌ๋ฉด ์ „์ˆ˜๊ฐ€ ์–ด๊ธ‹๋‚˜๋Š”๋ฐ, ๊ทธ๊ฑธ ๋””๋ฒ„๊น…ํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค.
 
์‹คํ–‰:
    python3 solve.py                # extracted/flag.bmp.enc โ†’ flag.bmp
"""
import ctypes
import ctypes.util
from pathlib import Path
 
HERE = Path(__file__).resolve().parent
ENC = HERE / "extracted" / "flag.bmp.enc"
OUT = HERE / "flag.bmp"
 
SEED = 0xBEEF
 
 
def ror8(b: int, n: int) -> int:
    n &= 7
    return ((b >> n) | (b << (8 - n))) & 0xFF
 
 
def rol8(b: int, n: int) -> int:
    n &= 7
    return ((b << n) | (b >> (8 - n))) & 0xFF
 
 
def main():
    libc = ctypes.CDLL(ctypes.util.find_library("c"))
    libc.srand(ctypes.c_uint(SEED))
 
    enc = bytearray(ENC.read_bytes())
    out = bytearray(len(enc))
 
    for i, c in enumerate(enc):
        r = libc.rand()
        m = i % 3
        if m == 0:
            out[i] = rol8((ror8(c, 4) - r) & 0xFF, 7)
        elif m == 1:
            out[i] = rol8(c, r & 7)
        else:
            out[i] = ((c + 0x18) & 0xFF) ^ (r & 0xFF)
 
    OUT.write_bytes(bytes(out))
    print(f"[*] {ENC.name} {len(enc)} bytes -> {OUT.name}")
    print(f"[*] magic     : {bytes(out[:2])!r}")
    print(f"[*] BITMAPINFO: size={int.from_bytes(out[2:6],'little')} "
          f"offset={int.from_bytes(out[10:14],'little')} "
          f"w={int.from_bytes(out[18:22],'little')} "
          f"h={int.from_bytes(out[22:26],'little')} "
          f"bpp={int.from_bytes(out[28:30],'little')}")
 
 
if __name__ == "__main__":
    main()
python3 solve.py && file flag.bmp

solve.py ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” 6,220,854๋ฐ”์ดํŠธ๋ฅผ ๋ณตํ˜ธํ•ด magic ์ด b'BM' ์œผ๋กœ ๋Œ์•„์˜ค๊ณ  BITMAPINFO ๊ฐ€ w=1920 h=1080 bpp=24 offset=54 ๋กœ ์ฝํžŒ๋‹ค. file ๋„ PC bitmap, Windows 3.x format ์œผ๋กœ ์ธ์‹ํ•œ๋‹ค
solve.py ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” 6,220,854๋ฐ”์ดํŠธ๋ฅผ ๋ณตํ˜ธํ•ด magic ์ด b'BM' ์œผ๋กœ ๋Œ์•„์˜ค๊ณ  BITMAPINFO ๊ฐ€ w=1920 h=1080 bpp=24 offset=54 ๋กœ ์ฝํžŒ๋‹ค. file ๋„ PC bitmap, Windows 3.x format ์œผ๋กœ ์ธ์‹ํ•œ๋‹ค

BM์ด ๋Œ์•„์™”๋‹ค. ํ—ค๋”๊ฐ€ ์Šค์Šค๋กœ 1920ร—1080 24bpp๋ผ๊ณ  ๋งํ•˜๊ณ , ์„ ์–ธํ•œ ํฌ๊ธฐ 6,220,854๊ฐ€ ์‹ค์ œ ํŒŒ์ผ ํฌ๊ธฐ์™€ ์ •ํ™•ํžˆ ๋งž๋Š”๋‹ค. ํ—ค๋” ํ•˜๋‚˜๋กœ ์ด๋ฏธ ๋ณต์›์ด ๋งž์•˜๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ–ผ๏ธ ๋˜์ฐพ์€ ์‚ฌ์ง„

python3 render.py

Pillow ๋กœ 1200px ๋กœ ์ค„์ธ ๋ณตํ˜ธ๋ณธ flag.bmp โ€” ํฐ ๋ฐฐ๊ฒฝ์— ๊ฒ€์€ ์‚ฐ์„ธ๋ฆฌํ”„ ๊ตต์€ ๊ธ€์”จ๋กœ DH ๋กœ ์‹œ์ž‘ํ•˜๋Š” 64์ž๋ฆฌ 16์ง„์ˆ˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ธ ์ค„์— ๊ฑธ์ณ ๊ทธ๋ ค์ ธ ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์— ํŒŒ๋ž€ ์‚ผ๊ฐ ๋„ํ˜•์ด ํ•˜๋‚˜ ์žˆ๋‹ค
Pillow ๋กœ 1200px ๋กœ ์ค„์ธ ๋ณตํ˜ธ๋ณธ flag.bmp โ€” ํฐ ๋ฐฐ๊ฒฝ์— ๊ฒ€์€ ์‚ฐ์„ธ๋ฆฌํ”„ ๊ตต์€ ๊ธ€์”จ๋กœ DH ๋กœ ์‹œ์ž‘ํ•˜๋Š” 64์ž๋ฆฌ 16์ง„์ˆ˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ธ ์ค„์— ๊ฑธ์ณ ๊ทธ๋ ค์ ธ ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์— ํŒŒ๋ž€ ์‚ผ๊ฐ ๋„ํ˜•์ด ํ•˜๋‚˜ ์žˆ๋‹ค

ํ”Œ๋ž˜๊ทธ๋Š” ํŒŒ์ผ ์–ด๋””์—๋„ ๋ฌธ์ž์—ด๋กœ ๋“ค์–ด ์žˆ์ง€ ์•Š๋‹ค. ์‚ฌ์ง„์— ๊ทธ๋ ค์ ธ ์žˆ์–ด์„œ strings๋กœ๋Š” ์ ˆ๋Œ€ ์•ˆ ๋‚˜์˜จ๋‹ค. ๊ทธ๋ฆผ์„ ๋ณต์›ํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋ฌธ์ œ์˜€๋‹ค.

DH{d85a130283f58035eb327b56e37d2dd087156ba629687a5d52bd4af3c5bfa4f4}

โœ… ๊ฒ€์ฆ โ€” ๋ฌธ์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋˜๋Œ๋ ค ๋ณธ๋‹ค

๊ทธ๋ฆผ์ด ๋ฉ€์ฉกํ•ด ๋ณด์ธ๋‹ค๊ณ  ๋ณตํ˜ธ๊ฐ€ ์ •ํ™•ํ•œ ๊ฑด ์•„๋‹ˆ๋‹ค. 1๋น„ํŠธ๋งŒ ์–ด๊ธ‹๋‚˜๋„ ๋ˆˆ์œผ๋กœ๋Š” ๊ตฌ๋ถ„์ด ์•ˆ ๋œ๋‹ค.

ํ™•์‹คํ•œ ๊ฒ€์ฆ์€ ๋ฌธ์ œ๊ฐ€ ์ค€ prob์„ ์˜ค๋ผํด๋กœ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค. ๋ณต์›ํ•œ flag.bmp๋ฅผ ์›๋ž˜ ์ž๋ฆฌ์— ๋†“๊ณ  prob์„ ๋Œ๋ ค์„œ, ๋‚˜์˜จ flag.bmp.enc๊ฐ€ ๋ฐฐํฌ๋ณธ๊ณผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๊ฐ™์€์ง€ ๋ณธ๋‹ค. ๊ฐ™๋‹ค๋ฉด ์šฐ๋ฆฌ ์—ญํ•จ์ˆ˜๊ฐ€ ์ •ํ™•ํžˆ ์—ญํ•จ์ˆ˜๋ผ๋Š” ๋œป์ด๋‹ค.

cp ../flag.bmp . && ./prob && sha256sum flag.bmp.enc ../extracted/flag.bmp.enc && cmp flag.bmp.enc ../extracted/flag.bmp.enc && echo ROUNDTRIP_OK

sha256sumยทcmp ๋กœ ํ•œ ์™•๋ณต ๊ฒ€์ฆ โ€” ๋ณต์›ํ•œ flag.bmp ๋ฅผ prob ์— ๋‹ค์‹œ ๋„ฃ์–ด ๋งŒ๋“  flag.bmp.enc ์˜ sha256 ์ด 83266dde8aea8e67db2e97af066a843f26โ€ฆ ๋กœ ๋ฐฐํฌ๋ณธ๊ณผ ๊ฐ™๊ณ  cmp ๋„ ํ†ต๊ณผํ•ด ROUNDTRIP_OK ๊ฐ€ ์ฐํžŒ๋‹ค
sha256sumยทcmp ๋กœ ํ•œ ์™•๋ณต ๊ฒ€์ฆ โ€” ๋ณต์›ํ•œ flag.bmp ๋ฅผ prob ์— ๋‹ค์‹œ ๋„ฃ์–ด ๋งŒ๋“  flag.bmp.enc ์˜ sha256 ์ด 83266dde8aea8e67db2e97af066a843f26โ€ฆ ๋กœ ๋ฐฐํฌ๋ณธ๊ณผ ๊ฐ™๊ณ  cmp ๋„ ํ†ต๊ณผํ•ด ROUNDTRIP_OK ๊ฐ€ ์ฐํžŒ๋‹ค

ํ•ด์‹œ๊ฐ€ ๊ฐ™๋‹ค. 6,220,854๋ฐ”์ดํŠธ ์ค‘ ํ•œ ๋ฐ”์ดํŠธ๋„ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.


๐Ÿ› ์‚ฝ์งˆ 2 โ€” sar ์„ ๋ถ€ํ˜ธ ์žˆ๋Š” ์‹œํ”„ํŠธ๋กœ ์˜ฎ๊ธฐ๋ฉด

โ–ถ๐Ÿ› ์‚ฝ์งˆ 2 โ€” ํšŒ์ „ ํ—ฌํผ๋ฅผ int8_t ๋กœ ์žฌ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ

0x2489/0x24c2๋Š” ํšŒ์ „์„ sar(์‚ฐ์ˆ  ์šฐ์‹œํ”„ํŠธ)๋กœ ํ•œ๋‹ค. ์–ด์…ˆ๋ธ”๋ฆฌ๋งŒ ํ›‘๊ณ  "์‚ฐ์ˆ ์ด๋‹ˆ๊นŒ ๋ถ€ํ˜ธ ํ™•์žฅ์ด๊ฒ ๊ตฌ๋‚˜" ํ•˜๊ณ  int8_t๋กœ ์˜ฎ๊ธฐ๋ฉด 0x80 ์ด์ƒ ๋ฐ”์ดํŠธ์—์„œ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๊ธ‹๋‚œ๋‹ค.

์‹ค์ œ๋กœ๋Š” ๋ฐ”๋กœ ์•ž์— movzx edx, BYTE PTR [rbp-0x4]๊ฐ€ ์žˆ์–ด ์˜ ํ™•์žฅ์„ ํ•ด ๋‘”๋‹ค. ๊ทธ๋ž˜์„œ sar์ด๋“  shr์ด๋“  ๊ฐ™๋‹ค.

ํ‹€๋ฆฐ ๊ฐ€์ •๋งŒ ๋„ฃ์€ ๋ฒ„์ „์„ ๋งŒ๋“ค์–ด ๋Œ๋ ค ๋ดค๋‹ค.

def ror8_signed(b: int, n: int) -> int:
    n &= 7
    s = b - 256 if b & 0x80 else b          # โ† ์—ฌ๊ธฐ๊ฐ€ ํ‹€๋ฆฐ ๊ฐ€์ •: ๋ถ€ํ˜ธ ์žˆ๋Š” char ๋กœ ๋ณธ๋‹ค
    return ((s >> n) | (s << (8 - n))) & 0xFF
 
 
def rol8_signed(b: int, n: int) -> int:
    n &= 7
    s = b - 256 if b & 0x80 else b
    return ((s << n) | (s >> (8 - n))) & 0xFF
python3 toy_signed.py && file flag_signed.bmp

๋ถ€ํ˜ธ ํ™•์žฅ ๋ฒ„์ „ ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” magic ์ด b'BM' ์ด ์•„๋‹ˆ๋ผ b'\xc2M' ์œผ๋กœ ๋‚˜์˜ค๊ณ  ์•ž 16๋ฐ”์ดํŠธ๊ฐ€ c2 4d 36 ec fe 00 ... ๋กœ ์–ด๊ธ‹๋‚˜๋ฉฐ file ๋„ ์—ฌ์ „ํžˆ data ๋กœ๋งŒ ์ธ์‹ํ•œ๋‹ค
๋ถ€ํ˜ธ ํ™•์žฅ ๋ฒ„์ „ ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” magic ์ด b'BM' ์ด ์•„๋‹ˆ๋ผ b'\xc2M' ์œผ๋กœ ๋‚˜์˜ค๊ณ  ์•ž 16๋ฐ”์ดํŠธ๊ฐ€ c2 4d 36 ec fe 00 ... ๋กœ ์–ด๊ธ‹๋‚˜๋ฉฐ file ๋„ ์—ฌ์ „ํžˆ data ๋กœ๋งŒ ์ธ์‹ํ•œ๋‹ค

ํ—ค๋”๊ฐ€ \xc2M์ด๋‹ค. file์€ ์—ฌ์ „ํžˆ data๋ผ๊ณ  ํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ”ฝ์…€ ์˜์—ญ๋งŒ ๊ฐ•์ œ๋กœ ๋ Œ๋”ํ•ด ๋ณด๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋” ๊ณ ์•ฝํ•˜๋‹ค.

๋ถ€ํ˜ธ ํ™•์žฅ ๋ฒ„์ „์˜ ํ”ฝ์…€ ์˜์—ญ์„ raw BGR ๋กœ ๊ฐ•์ œ ๋ Œ๋”ํ•œ ์ด๋ฏธ์ง€ โ€” ๋ฐฐ๊ฒฝ์ด ํฐ์ƒ‰์ด ์•„๋‹ˆ๋ผ ์—ฐ๋…ธ๋ž‘, ๊ธ€์ž๊ฐ€ ๊ฒ€์ •์ด ์•„๋‹ˆ๋ผ ๋‚จ์ƒ‰์œผ๋กœ ๋ฌผ๋“ค๊ณ  ์ „์ฒด์— ์žก์Œ์ด ๋ผ์—ˆ์ง€๋งŒ ํ”Œ๋ž˜๊ทธ ๋ฌธ์ž์—ด ์ž์ฒด๋Š” ๊ทธ๋Œ€๋กœ ์ฝํžŒ๋‹ค
๋ถ€ํ˜ธ ํ™•์žฅ ๋ฒ„์ „์˜ ํ”ฝ์…€ ์˜์—ญ์„ raw BGR ๋กœ ๊ฐ•์ œ ๋ Œ๋”ํ•œ ์ด๋ฏธ์ง€ โ€” ๋ฐฐ๊ฒฝ์ด ํฐ์ƒ‰์ด ์•„๋‹ˆ๋ผ ์—ฐ๋…ธ๋ž‘, ๊ธ€์ž๊ฐ€ ๊ฒ€์ •์ด ์•„๋‹ˆ๋ผ ๋‚จ์ƒ‰์œผ๋กœ ๋ฌผ๋“ค๊ณ  ์ „์ฒด์— ์žก์Œ์ด ๋ผ์—ˆ์ง€๋งŒ ํ”Œ๋ž˜๊ทธ ๋ฌธ์ž์—ด ์ž์ฒด๋Š” ๊ทธ๋Œ€๋กœ ์ฝํžŒ๋‹ค

๊ทธ๋ฆผ์€ ๊ฑฐ์˜ ๋ฉ€์ฉกํ•ด ๋ณด์ธ๋‹ค. ์ƒ‰์ด ์ข€ ๋ฌผ๋“ค๊ณ  ์žก์Œ์ด ๋‚€ ์ •๋„๋ผ, ํ”Œ๋ž˜๊ทธ๋Š” ๊ทธ๋Œ€๋กœ ์ฝํžŒ๋‹ค. ์ด ๋ฌธ์ œ์—์„œ๋Š” ์–ด์ฐจํ”ผ ๋‹ต์„ ์–ป๋Š”๋‹ค.

๋ฌธ์ œ๋Š” "๋ˆˆ์œผ๋กœ ๋ดค์„ ๋•Œ ๊ทธ๋Ÿด๋“ฏํ•˜๋ฉด ๋งž๋‹ค"๊ณ  ๋„˜์–ด๊ฐ€๋Š” ์Šต๊ด€์ด๋‹ค. ์›๋ณธ BMP๊ฐ€ ๋Œ€๋ถ€๋ถ„ 00๊ณผ ff๋ผ์„œ ๋ถ€ํ˜ธ ํ™•์žฅ์˜ ์˜ํ–ฅ์„ ๋œ ๋ฐ›์•˜์„ ๋ฟ, ์‚ฌ์ง„์ด ์กฐ๊ธˆ๋งŒ ๋ณต์žกํ–ˆ์œผ๋ฉด ์•Œ์•„๋ณด๊ธฐ ์–ด๋ ค์› ์„ ๊ฒƒ์ด๋‹ค. ํ—ค๋”๊ฐ€ BM์ธ์ง€, ์™•๋ณต ํ•ด์‹œ๊ฐ€ ๋งž๋Š”์ง€ โ€” ๊ธฐ๊ณ„๊ฐ€ ํŒ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€์„ ํ•˜๋‚˜๋Š” ๋‘๋Š” ๊ฒŒ ๋งž๋‹ค.



๐Ÿงฐ ์žฌํ˜„ ํ™˜๊ฒฝ

ํ•ญ๋ชฉ๊ฐ’
OSUbuntu 25.10 (x86-64)
glibc2.42 โ€” ctypes๋กœ ๋ถ€๋ฅด๋Š” rand()๊ฐ€ ์ด๊ฒƒ์ด๋‹ค
Python3.13.7 (ํ‘œ์ค€ ctypes๋งŒ ์‚ฌ์šฉ, ์ด๋ฏธ์ง€ ๋ Œ๋”๋ง์—๋งŒ Pillow 10.4.0)
binutilsobjdump 2.45
gdb16.3 (-batch ๋ชจ๋“œ)
๋ฐฐํฌ๋ฌผ sha256flag.bmp.enc โ†’ 83266dde8aea8e67db2e97af066a843f263604b2cde6be0c16317d53d78a02f3

์ž‘์—… ํด๋” ๊ตฌ์„ฑ์€ ์ด๋ ‡๋‹ค. ๋””์Šค์–ด์…ˆ๋ธ” ์บก์ณ์— ๋ถ™์ธ ์ฃผ์„์€ sed ๊ทœ์น™ ํŒŒ์ผ๋กœ ๋‚จ๊ฒจ ๋’€๋‹ค.

photographer/
โ”œโ”€โ”€ extracted/          # ๋ฐฐํฌ๋ฌผ (prob, flag.bmp.enc)
โ”œโ”€โ”€ solve.py            # ๋ณตํ˜ธ โ€” flag.bmp ์ƒ์„ฑ
โ”œโ”€โ”€ toy_signed.py       # ์‚ฝ์งˆ 2 ์žฌํ˜„ (๋ถ€ํ˜ธ ํ™•์žฅ ๋ฒ„์ „)
โ”œโ”€โ”€ render.py           # flag.bmp โ†’ ๋ธ”๋กœ๊ทธ์šฉ PNG
โ”œโ”€โ”€ verify.gdb          # gdb ๋Ÿฐํƒ€์ž„ ํ™•์ธ ์Šคํฌ๋ฆฝํŠธ
โ”œโ”€โ”€ annot_*.sed         # objdump ์ถœ๋ ฅ ์ฃผ์„ ๊ทœ์น™
โ””โ”€โ”€ roundtrip/          # prob ์„ ์˜ค๋ผํด๋กœ ์“ฐ๋Š” ์™•๋ณต ๊ฒ€์ฆ

ctypes๋กœ libc rand()๋ฅผ ๋ถ€๋ฅด๋Š” ๋ฐฉ์‹์€ glibc ๊ณ„์—ด์ด๋ฉด ์–ด๋””์„œ๋“  ๊ฐ™์€ ์ˆ˜์—ด์ด ๋‚˜์˜จ๋‹ค. musl(Alpine)์€ rand() ๊ตฌํ˜„์ด ๋‹ฌ๋ผ ๊ฐ’์ด ์–ด๊ธ‹๋‚˜๋‹ˆ, ์ปจํ…Œ์ด๋„ˆ๋กœ ๋Œ๋ฆฐ๋‹ค๋ฉด ๋ฐ๋น„์•ˆยท์šฐ๋ถ„ํˆฌ ๊ณ„์—ด ์ด๋ฏธ์ง€๋ฅผ ์“ฐ๋Š” ๊ฒŒ ๋งž๋‹ค.


๐Ÿ“ ๊ฒฐ๋ก 

์‹œ๋“œ๊ฐ€ ์ƒ์ˆ˜๋ฉด ๋‚œ์ˆ˜๋Š” ๋‚œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.

rand()๊ฐ€ ๋ณด์ธ๋‹ค๊ณ  ๊ฒ๋จน์„ ๊ฒŒ ์•„๋‹ˆ๋ผ srand()์— ๋ญ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”์ง€๋ถ€ํ„ฐ ๋ณธ๋‹ค. time(NULL)์ด๋ฉด ์‹œ๊ฐ์„ ๋ธŒ๋ฃจํŠธํฌ์Šคํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ƒ์ˆ˜๋ฉด ๊ทธ๋ƒฅ ๊ฐ™์€ ์ˆ˜์—ด์„ ๋‹ค์‹œ ๋ฝ‘์œผ๋ฉด ๋์ด๋‹ค. ์ด ๋ฌธ์ œ๋Š” time@plt๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ๋งŒ์œผ๋กœ PLT ๋ชฉ๋ก ๋‹จ๊ณ„์—์„œ ์ด๋ฏธ ๋‹ต์˜ ์ ˆ๋ฐ˜์ด ๋‚˜์™”๋‹ค.

๋‚œ์ˆ˜ ์†Œ๋น„ ํšŸ์ˆ˜๊ฐ€ ๋ถ„๊ธฐ๋งˆ๋‹ค ๊ฐ™์€์ง€ ํ™•์ธํ•œ๋‹ค.

์„ธ ๊ฐˆ๋ž˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ rand()๋ฅผ ๋‘ ๋ฒˆ ๋ถ€๋ฅด๊ฑฐ๋‚˜ ๊ฑด๋„ˆ๋›ฐ์—ˆ๋‹ค๋ฉด ์ธ๋ฑ์Šค์™€ ๋‚œ์ˆ˜์˜ ๋Œ€์‘์ด ๊นจ์ ธ์„œ, ์†Œ๋น„ ์ˆœ์„œ๋ฅผ ๋”ฐ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ด์•ผ ํ–ˆ๋‹ค. ๋ถ„๊ธฐ๋งˆ๋‹ค ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์”ฉ์ด๋ผ for ํ•œ ์ค„๋กœ ๋๋‚ฌ๋‹ค. ์—ญ์‚ฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ๊ธฐ ์ „์— ์ด๊ฑธ ๋จผ์ € ์„ธ์–ด ๋ณด๋Š” ๊ฒŒ ์ˆœ์„œ๋‹ค.

์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๊ณ ๊ธ‰ ์–ธ์–ด๋กœ ์˜ฎ๊ธธ ๋•Œ๋Š” ํญ๊ณผ ๋ถ€ํ˜ธ๋ฅผ ๊ฐ™์ด ์˜ฎ๊ธด๋‹ค.

sar๋งŒ ๋ณด๊ณ  ๋ถ€ํ˜ธ ํ™•์žฅ์„ ๋„ฃ์œผ๋ฉด ์–ด๊ธ‹๋‚˜๊ณ , ์•ž์˜ movzx๊นŒ์ง€ ๋ด์•ผ ์˜ ํ™•์žฅ์ธ ๊ฑธ ์•ˆ๋‹ค. ์ €์žฅ์ด mov BYTE PTR์ด๋ฉด ์ƒ์œ„ ๋น„ํŠธ๋Š” ๋ฒ„๋ ค์ง„๋‹ค๋Š” ๊ฒƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ์‹œํ”„ํŠธยท์‚ฐ์ˆ ์„ ์˜ฎ๊ธธ ๋•Œ ์ œ์ผ ์ž์ฃผ ์ƒˆ๋Š” ๊ณณ์ด๋‹ค.

๋ณต์›๋ฌผ์€ ๋ˆˆ์ด ์•„๋‹ˆ๋ผ ๊ธฐ๊ณ„๋กœ ํŒ์ •ํ•œ๋‹ค.

๋ถ€ํ˜ธ ํ™•์žฅ ๋ฒ„์ „๋„ ํ”Œ๋ž˜๊ทธ๋Š” ์ฝํ˜”๋‹ค. ๋ˆˆ์œผ๋กœ ํ†ต๊ณผ์‹œ์ผฐ์œผ๋ฉด ํ‹€๋ฆฐ ์ฝ”๋“œ๋ฅผ ๋งž๋‹ค๊ณ  ๋ฏฟ์€ ์ฑ„ ๋„˜์–ด๊ฐ”์„ ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„  ๋ฌธ์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž์ฒด๊ฐ€ ์˜ค๋ผํด์ด ๋˜์–ด ์ค€๋‹ค โ€” ๋ณต์›๋ณธ์„ ๋‹ค์‹œ ๋„ฃ์–ด ๋ฐฐํฌ๋ณธ๊ณผ ํ•ด์‹œ๊ฐ€ ๊ฐ™์€์ง€ ๋ณด๋ฉด ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์—†๋‹ค. ์ผ๋ฐฉํ–ฅ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ฃผ๋Š” ๋ฆฌ๋ฒ„์‹ฑ ๋ฌธ์ œ๋ผ๋ฉด ๋Œ€์ฒด๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๋ฐฉ์–ด ๊ด€์ ์—์„œ๋Š” ์ด ๊ตฌ์กฐ ์ „์ฒด๊ฐ€ ์•”ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋‹ค.

ํ‚ค๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์•ˆ์— ์ƒ์ˆ˜๋กœ ๋ฐ•ํ˜€ ์žˆ๊ณ , ๋ณ€ํ™˜์ด ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๊ฐ€์—ญ์ด๋ฉฐ, ๋ณ€ํ™˜๊ธฐ ์ž์ฒด๋ฅผ ํ•จ๊ป˜ ๋ฐฐํฌํ•œ๋‹ค. ์…‹ ์ค‘ ํ•˜๋‚˜๋งŒ ์žˆ์–ด๋„ ๊ธฐ๋ฐ€์„ฑ์€ ์—†๋‹ค. ํŒŒ์ผ์„ ์‹ค์ œ๋กœ ๋ณดํ˜ธํ•  ์ƒ๊ฐ์ด๋ผ๋ฉด ๊ฒ€์ฆ๋œ AEAD(AES-GCM, ChaCha20-Poly1305)์— ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•œ ํ‚ค๋ฅผ ์“ฐ๋Š” ๊ฒƒ ๋ง๊ณ  ๋‹ค๋ฅธ ๋‹ต์€ ์—†๋‹ค. ์ง์ ‘ ๋งŒ๋“  ๋ฐ”์ดํŠธ ๋ณ€ํ™˜์€ ๋‚œ๋…ํ™”์ง€ ์•”ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋‹ค.

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‡ Gold 4] ์ง€๊ทธ์žฌ๊ทธ๋กœ ์ ‘ํžŒ ํ”Œ๋ž˜๊ทธ โ€” DreamHack quilt ํ’€์ด
blog

[๐Ÿฅ‡ Gold 4] ์ง€๊ทธ์žฌ๊ทธ๋กœ ์ ‘ํžŒ ํ”Œ๋ž˜๊ทธ โ€” DreamHack quilt ํ’€์ด

๋ฐฐํฌ๋œ quilt๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹ˆ๋ผ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ๊ตฝ๋Š” ์ธ์ฝ”๋”์˜€๋‹ค. /dev/urandom 192๋ฐ”์ดํŠธ ํ•œ๋ณตํŒ์— ์ธ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ์–น๊ณ , 6๋น„ํŠธ์”ฉ ์ž˜๋ผ 64์ƒ‰ ํŒ”๋ ˆํŠธ๋กœ 32ร—32 ๋ธ”๋ก์„ ์น ํ•œ๋‹ค. ๋˜๋Œ๋ฆฌ๋Š” ๊ธธ๋ชฉ์— ๋†“์ธ ํ•จ์ •์€ ํ™€์ˆ˜ ๊ฒฉ์žํ–‰์„ ์ขŒ์šฐ๋กœ ๋’ค์ง‘๋Š” ํ•œ ์ค„์ด๋‹ค.
#dreamhack#ctf#reversing+4
2026-08-20#dreamhack +6
[๐Ÿฅˆ Silver 3] 2MB ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์ฝ”๋“œ๋Š” 509๋ฐ”์ดํŠธ๋ฟ์ด์—ˆ๋‹ค โ€” DreamHack Branches and Leaves ํ’€์ด
blog

[๐Ÿฅˆ Silver 3] 2MB ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์ฝ”๋“œ๋Š” 509๋ฐ”์ดํŠธ๋ฟ์ด์—ˆ๋‹ค โ€” DreamHack Branches and Leaves ํ’€์ด

๋ฌธ์ œ ์„ค๋ช…์ด ์‹œ ๋„ค ์ค„๋ฟ์ธ ๋ฆฌ๋ฒ„์‹ฑ. 2.1MB์งœ๋ฆฌ stripped ELF๋ฅผ ์—ด์–ด ๋ณด๋ฉด ์ฝ”๋“œ๋Š” 509๋ฐ”์ดํŠธ๊ณ  ๋‚˜๋จธ์ง€ ์ „๋ถ€๊ฐ€ ๋ฐฐ์—ด๋กœ ์ ‘์€ ๊นŠ์ด 16 ์ด์ง„ํŠธ๋ฆฌ๋‹ค. ์ž…๋ ฅ 4๊ธ€์ž๊ฐ€ 16๋น„ํŠธ๋กœ ํŽด์ ธ ํŠธ๋ฆฌ๋ฅผ 16๋ฒˆ ๋‚ด๋ ค๊ฐ€๊ณ , ๊ทธ ๋ฆฌํ”„ 65536๊ฐœ๊ฐ€ ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š์•„์„œ ๊ธฐ๋Œ€๊ฐ’๋งˆ๋‹ค ์—ญ์ƒ์ด ์ •ํ™•ํžˆ ํ•˜๋‚˜๋กœ ์ •ํ•ด์ง„๋‹ค.
#dreamhack#ctf#reversing+5
2026-08-19#dreamhack +5
[๐Ÿฅˆ Silver 1] ํ‚ค์ŠคํŠธ๋ฆผ 1๋น„ํŠธ๋กœ ๋˜๋Œ๋ฆฐ SNOW 3G โ€” DreamHack snow ํ’€์ด
blog

[๐Ÿฅˆ Silver 1] ํ‚ค์ŠคํŠธ๋ฆผ 1๋น„ํŠธ๋กœ ๋˜๋Œ๋ฆฐ SNOW 3G โ€” DreamHack snow ํ’€์ด

20KB ์งœ๋ฆฌ ์ŠคํŠธ๋ฆฝํŠธ ELF ์•ˆ์— 3GPP ํ‘œ์ค€ ์ŠคํŠธ๋ฆผ ์•”ํ˜ธ SNOW 3G ๊ฐ€ ํ†ต์งธ๋กœ ๋“ค์–ด ์žˆ์—ˆ๋‹ค. ํ‚ค๋Š” "Merry-Christmas!" ๋กœ ๊ณ ์ •์ด๊ณ  IV ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋„ฃ๋Š” ์ž…๋ ฅ์˜ ์•ž 16๋ฐ”์ดํŠธ โ€” ์ฆ‰ ๋ณต์›ํ•ด์•ผ ํ•  ๊ฐ’์ด ์ž๊ธฐ ์ž์‹ ์„ ์•”ํ˜ธํ™”ํ•œ๋‹ค. ์›Œ๋“œ๋งˆ๋‹ค ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ํ‚ค์ŠคํŠธ๋ฆผ์˜ ์ตœํ•˜์œ„ 1๋น„ํŠธ๋ฟ์ด๋ผ๋Š” ์ ์„ ์ด์šฉํ•ด 256๊ฐ€์ง€๋งŒ ํ™•์ธํ•˜๊ณ  32๊ธ€์ž๋ฅผ ๋˜๋Œ๋ ธ๋‹ค.
#dreamhack#ctf#reversing+6
2026-08-17#dreamhack +5