[๐Ÿฅˆ Silver 2] ๋ฆฌ๋ฒ„์‹ฑ ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ๋Š”๋‹ค โ€” DreamHack just read memory ํ’€์ด

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

[๐Ÿฅˆ Silver 2] ๋ฆฌ๋ฒ„์‹ฑ ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ๋Š”๋‹ค โ€” DreamHack just read memory ํ’€์ด

์ž…๋ ฅ์„ ํ•œ ๊ธ€์ž์”ฉ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋…ธ๋“œ์™€ ๋น„๊ตํ•˜๊ณ , ๋‹ค ๋งž์œผ๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ฑ‰๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ. ๋…ธ๋“œ ๊ฐ’์€ ๋ฃจํ”„ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์„ธ ํ—ฌํผ ํ•จ์ˆ˜๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์ดˆ๊ธฐํ™” ์•ˆ ๋œ ์Šคํƒ ์Šฌ๋กฏ๊ณผ ์ „์—ญ cnt ๋กœ ๋งŒ๋“  ์ˆจ์€ ์ ํ™”์‹(cnt = 27*cnt + 103)์—์„œ ๋‚˜์˜จ๋‹ค. ๊ทธ ์ ํ™”์‹์„ ํŒŒ์ด์ฌ์œผ๋กœ ์ ‘์–ด ์ •๋‹ต ์ž…๋ ฅ์„ ๋ณต์›ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ฌธ์ œ ์ด๋ฆ„๋Œ€๋กœ gdb ๋กœ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ ์งํ›„์— ๋ฉˆ์ถฐ ํž™์„ ๊ทธ๋Œ€๋กœ ์ฝ์–ด๋‚ด๋Š” ๊ฒŒ ๋” ๋น ๋ฅด๋‹ค.

๋ฌธ์ œ: DreamHack โ€” just read memory ๋ถ„๋ฅ˜: Reversing ๋‚œ์ด๋„: ๐Ÿฅˆ Silver 2 FLAG: DH{7078981632989894389654921898749418541874549056189474343058581690}

๋ฐ›๋Š” ๊ฑด main ํ•˜๋‚˜. ์‹คํ–‰ํ•˜๋ฉด Input: ์„ ๋„์šฐ๊ณ  ํ•œ ์ค„์„ ๋ฐ›๋Š”๋‹ค. ์•„๋ฌด๊ฑฐ๋‚˜ ๋„ฃ์œผ๋ฉด Wrong, ์ •๋‹ต์„ ๋„ฃ์œผ๋ฉด Correct ๋’ค์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ถ™๋Š”๋‹ค.

๋ฌธ์ œ ์ด๋ฆ„์ด ์ด๋ฏธ ๋‹ต์„ ๋ฐ˜์ฏค ์•Œ๋ ค์ค€๋‹ค. "just read memory" โ€” ์ •๋‹ต์„ ํž˜๋“ค๊ฒŒ ์—ญ์‚ฐํ•˜์ง€ ๋ง๊ณ , ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋งŒ๋“ค์–ด ๋‘” ๊ฑธ ๊ทธ๋ƒฅ ์ฝ์œผ๋ผ๋Š” ์–˜๊ธฐ๋‹ค. ์‹ค์ œ๋กœ ์ •๋‹ต ๊ฒ€์ฆ์— ์“ฐ์ด๋Š” ๊ฐ’์€ ๋น„๊ต ์ง์ „์— ํž™ ์œ„์— ํ†ต์งธ๋กœ ์˜ฌ๋ผ์™€ ์žˆ๋‹ค.

๊ทธ๋ž˜๋„ ์™œ ๊ทธ๊ฒŒ ๋˜๋Š”์ง€๋Š” ๋ด์•ผ ์žฌ๋ฐŒ๋‹ค. ์ •๋‹ต์„ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ฃจํ”„ ์ธ๋ฑ์Šค๋ฅผ ์“ฐ๋Š” ์ฒ™ํ•˜๋ฉด์„œ ์‹ค์€ ์ดˆ๊ธฐํ™”๋„ ์•ˆ ํ•œ ์Šคํƒ ์Šฌ๋กฏ์„ ํ•จ์ˆ˜ ์„ธ ๊ฐœ๊ฐ€ ๋Œ๋ ค์“ฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆจ์€ ์ ํ™”์‹์„ ๊ตด๋ฆฐ๋‹ค. ๊ทธ ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ํ’€๊ณ , ๋งˆ์ง€๋ง‰์— gdb ํ•œ ๋ฐฉ์œผ๋กœ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค.


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…just read memory
๋‚œ์ด๋„๐Ÿฅˆ Silver 2
๋ถ„๋ฅ˜Reversing
์ œ๊ณต ํŒŒ์ผmain (x86-64 ELF, PIE, not stripped)
์„œ๋ฒ„์—†์Œ โ€” ํŒŒ์ผ๋งŒ์œผ๋กœ ์™„๊ฒฐ (needs_vm=false)
ํ•ต์‹ฌ ๊ธฐ๋ฒ•ํ•จ์ˆ˜๋“ค์ด ๊ณต์œ ํ•˜๋Š” ์ดˆ๊ธฐํ™” ์•ˆ ๋œ ์Šคํƒ ์Šฌ๋กฏ์œผ๋กœ ๋งŒ๋“  ์ˆจ์€ ์ ํ™”์‹ + ํž™ ๋Ÿฐํƒ€์ž„ ๋คํ”„

ํ’€์ด ํ๋ฆ„์€ ์งง๋‹ค. main์ด 64๊ฐœ์งœ๋ฆฌ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ž…๋ ฅ๊ณผ ํ•œ ๋ฐ”์ดํŠธ์”ฉ ๋น„๊ตํ•œ๋‹ค๋Š” ๊ฑธ ํ™•์ธํ•˜๊ณ , ๋…ธ๋“œ ๊ฐ’์ด ์–ด๋””์„œ ์˜ค๋Š”์ง€ ํ—ฌํผ ์„ธ ๊ฐœ๋ฅผ ์ฝ์–ด ์ ํ™”์‹์œผ๋กœ ์ •๋ฆฌํ•œ ๋‹ค์Œ, gdb๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ํž™์—์„œ ๊ทธ๋Œ€๋กœ ๋– ์„œ ์ •๋‹ต ์ž…๋ ฅ์„ ๋ณต์›ํ•œ๋‹ค.



๐Ÿ”Ž ์ •์ฐฐ โ€” ์‹ฌ๋ณผ๋ถ€ํ„ฐ ๋ณธ๋‹ค

not stripped ๋ฐ”์ด๋„ˆ๋ฆฌ๋ผ ์‹ฌ๋ณผ์ด ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ๋‹ค. ์ด๋ฆ„๋งŒ ๋ด๋„ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง„๋‹ค.

file main
nm main | grep -E "generate_flag|append_list|unknown_func|cnt|head_node|tail_node"
strings main | grep -E "Input|Wrong|Correct|flag is DH"

file ยท nm ยท strings ์ •์ฐฐ ์ถœ๋ ฅ โ€” not stripped PIE ๋ฐ”์ด๋„ˆ๋ฆฌ์— append_list ยท cnt ยท generate_flag ยท head_node ยท tail_node ยท unknown_func ๋‘ ๊ฐœ์˜ ์‹ฌ๋ณผ๊ณผ Input / Wrong / Correct ๋ฌธ์ž์—ด์ด ๋‚จ์•„ ์žˆ๋‹ค
file ยท nm ยท strings ์ •์ฐฐ ์ถœ๋ ฅ โ€” not stripped PIE ๋ฐ”์ด๋„ˆ๋ฆฌ์— append_list ยท cnt ยท generate_flag ยท head_node ยท tail_node ยท unknown_func ๋‘ ๊ฐœ์˜ ์‹ฌ๋ณผ๊ณผ Input / Wrong / Correct ๋ฌธ์ž์—ด์ด ๋‚จ์•„ ์žˆ๋‹ค

  • append_list, head_node, tail_node โ€” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ง์ ‘ ๊ตด๋ฆฐ๋‹ค.
  • generate_flag โ€” ๋…ธ๋“œ์— ์ฑ„์šธ ๊ฐ’์„ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜๋กœ ๋ณด์ธ๋‹ค.
  • unknown_func1, unknown_func2 โ€” ์ด๋ฆ„์„ ์•ˆ ์ง€์–ด์ค€ ๊ฑธ ๋ณด๋ฉด ์—ฌ๊ธฐ์— ๋ญ”๊ฐ€ ์ˆจ๊ฒผ๋‹ค.
  • ์ „์—ญ cnt โ€” ์นด์šดํ„ฐ. ๋’ค์—์„œ ์ด๊ฒŒ ์—ด์‡ ๋‹ค.

๋ฌธ์ž์—ด์€ Input: / Wrong / Correct / flag is DH{. ๋”ฑ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ๋‹ค.


๐Ÿ”ฌ main ์ฝ๊ธฐ โ€” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์ž…๋ ฅ๊ณผ ๋น„๊ตํ•œ๋‹ค

main์—์„œ ๋‘ ๋ถ€๋ถ„๋งŒ ๋ณด๋ฉด ๋œ๋‹ค. ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฑ„์šฐ๋Š” ๋ฃจํ”„์™€, ๊ทธ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž…๋ ฅ๊ณผ ๋Œ€์กฐํ•˜๋Š” ๋ฃจํ”„๋‹ค.

objdump -d -M intel --start-address=0x1280 --stop-address=0x12f5 main | sed -E -f ann_main.sed

objdump ๋กœ ๋œฌ main ์˜ ๋‘ ๋ฃจํ”„ โ€” ์•ž์ชฝ 1280129b ๊ฐ€ append_list ๋ฅผ i 0 ๋ถ€ํ„ฐ 0x3f ๊นŒ์ง€ 64๋ฒˆ ๋ถ€๋ฅด๊ณ , ๋’ค์ชฝ 12bc12f3 ์ด ๋…ธ๋“œ ๊ฐ’๊ณผ ์ž…๋ ฅ ๋ฐ”์ดํŠธ๋ฅผ cmp ๋กœ ํ•˜๋‚˜์”ฉ ๋Œ€์กฐํ•œ๋‹ค
objdump ๋กœ ๋œฌ main ์˜ ๋‘ ๋ฃจํ”„ โ€” ์•ž์ชฝ 1280129b ๊ฐ€ append_list ๋ฅผ i 0 ๋ถ€ํ„ฐ 0x3f ๊นŒ์ง€ 64๋ฒˆ ๋ถ€๋ฅด๊ณ , ๋’ค์ชฝ 12bc12f3 ์ด ๋…ธ๋“œ ๊ฐ’๊ณผ ์ž…๋ ฅ ๋ฐ”์ดํŠธ๋ฅผ cmp ๋กœ ํ•˜๋‚˜์”ฉ ๋Œ€์กฐํ•œ๋‹ค

์•ž์ชฝ ๋ฃจํ”„๋Š” i๋ฅผ 0๋ถ€ํ„ฐ 0x3f๊นŒ์ง€ ๋Œ๋ฆฌ๋ฉฐ append_list(i)๋ฅผ ๋ถ€๋ฅธ๋‹ค. i <= 63์ด๋‹ˆ ๋…ธ๋“œ๊ฐ€ ์ •ํ™•ํžˆ 64๊ฐœ ์ƒ๊ธด๋‹ค.

1289: mov  eax, [rbp-0x4]        ; i
128e: call append_list          ; append_list(i)  โ€” ์ธ์ž๋กœ i๋ฅผ ๋„˜๊ธฐ์ง€๋งŒโ€ฆ
1293: add  DWORD PTR [rbp-0x4],1 ; i++
1297: cmp  DWORD PTR [rbp-0x4],0x3f
129b: jle  1289                  ; i <= 63  โ†’ 64๊ฐœ

๋’ค์ชฝ ๋ฃจํ”„๋Š” head_node->next๋ถ€ํ„ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ, ๊ฐ ๋…ธ๋“œ์˜ ์ฒซ ๋ฐ”์ดํŠธ(node->value)๋ฅผ ์ž…๋ ฅ ๋ฒ„ํผ input[j]์™€ ๋น„๊ตํ•œ๋‹ค. ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅด๋ฉด [rbp-0x8](์ •๋‹ต ํ”Œ๋ž˜๊ทธ)์„ 0์œผ๋กœ ๋‚ด๋ฆฐ๋‹ค. ์ค‘๊ฐ„์— ๋น ์ ธ๋‚˜๊ฐ€์ง€ ์•Š๊ณ  ๋๊นŒ์ง€ ๋‹ค ๋ˆ๋‹ค.

12c1: movzx eax, BYTE PTR [rbp+rax*1-0x70] ; input[j]
12cd: movzx eax, BYTE PTR [rax]            ; node->value
12d3: cmp   edx, eax                       ; ๋‘ ๋ฐ”์ดํŠธ ๋น„๊ต
12d5: je    12de
12d7: mov   DWORD PTR [rbp-0x8], 0         ; ๋‹ค๋ฅด๋ฉด ์‹คํŒจ ํ‘œ์‹œ

์ •๋ฆฌํ•˜๋ฉด ์ •๋‹ต ์ž…๋ ฅ์€ 64๊ฐœ ๋…ธ๋“œ์˜ ๊ฐ’์„ ์ˆœ์„œ๋Œ€๋กœ ์ด์–ด๋ถ™์ธ ๋ฐ”์ดํŠธ์—ด์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๋…ธ๋“œ ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ์ •ํ•ด์ง€๋Š”์ง€๋งŒ ์•Œ๋ฉด ๋๋‚œ๋‹ค. ๋…ธ๋“œ๋Š” append_list ์•ˆ์—์„œ ๋งŒ๋“ค์–ด์ง€๋‹ˆ ๊ฑฐ๊ธฐ๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค.


๐Ÿ› ์‚ฝ์งˆ โ€” "๋…ธ๋“œ ๊ฐ’ = f(i)" ๋ผ๋Š” ์ฐฉ๊ฐ

โ–ถ๐Ÿ› ์‚ฝ์งˆ โ€” append_list(i) ์˜ i ๋ฅผ ๋…ธ๋“œ ๊ฐ’์˜ ์žฌ๋ฃŒ๋กœ ๋ดค๋‹ค

main์ด append_list(i)๋กœ ์ธ๋ฑ์Šค๋ฅผ ๋„˜๊ธฐ๊ณ , generate_flag๊ฐ€ [rbp-0x4]๋ฅผ ์ฝ์–ด ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๊ฑธ ๋ณด๊ณ  ์ฒ˜์Œ์—” ๋‹น์—ฐํžˆ "๋…ธ๋“œ ๊ฐ’์€ i์˜ ํ•จ์ˆ˜๊ฒ ์ง€" ํ•˜๊ณ  ์ ‘๊ทผํ–ˆ๋‹ค. i๋ฅผ ๊ทธ๋Œ€๋กœ, ํ˜น์€ i ๊ธฐ๋ฐ˜ ์‚ฐ์ˆ ๋กœ ๋„ฃ์–ด ๋…ธ๋“œ ์—ด์„ ์˜ˆ์ธกํ•ด ๋ดค๋Š”๋ฐ ์‹ค์ œ ๊ฐ’๊ณผ ํ•˜๋‚˜๋„ ์•ˆ ๋งž์•˜๋‹ค.

๋ฌธ์ œ๋Š” generate_flag๊ฐ€ ์ฝ๋Š” [rbp-0x4]๊ฐ€ i๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๋ฐ ์žˆ์—ˆ๋‹ค. append_list๋Š” ์ธ์ž i๋ฅผ [rbp-0x14]์— ์ €์žฅํ•œ๋‹ค. ์ดํ›„ ํ—ฌํผ๋“ค์ด ๋งŒ์ง€๋Š” [rbp-0x4]๋Š” ๊ทธ ํ”„๋ ˆ์ž„์˜ ์ „ํ˜€ ๋‹ค๋ฅธ, ์ดˆ๊ธฐํ™”๋„ ์•ˆ ๋œ ์Šฌ๋กฏ์ด๋‹ค. ์ฆ‰ append_list๊ฐ€ ๋ฐ›์€ i๋Š” ๋ฃจํ”„ ํšŸ์ˆ˜๋ฅผ ์„ธ๋Š” ๊ฒƒ ๋ง๊ณ ๋Š” ๋…ธ๋“œ ๊ฐ’์— ์•„๋ฌด ๊ธฐ์—ฌ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด ์ฐฉ๊ฐ์„ ๊ฑท์–ด๋‚ด๊ณ  ๋‚˜์„œ์•ผ unknown_func1/2๊ฐ€ ์™œ ์กด์žฌํ•˜๋Š”์ง€๊ฐ€ ๋ณด์˜€๋‹ค. ๋…ธ๋“œ ๊ฐ’์˜ ์ง„์งœ ์žฌ๋ฃŒ๋Š” i๊ฐ€ ์•„๋‹ˆ๋ผ ์ „์—ญ cnt์˜€๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ โ€” ํ•จ์ˆ˜ ์…‹์ด ๋Œ๋ ค์“ฐ๋Š” ์Šคํƒ ์Šฌ๋กฏ

append_list๋Š” ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— unknown_func1 โ†’ unknown_func2 โ†’ generate_flag๋ฅผ ์ฐจ๋ก€๋กœ ๋ถ€๋ฅธ๋‹ค. ์…‹ ๋‹ค push rbp; mov rbp, rsp๋งŒ ํ•˜๊ณ  ์Šคํƒ์„ ๋” ์•ˆ ์žก๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์„ธ ํ•จ์ˆ˜์˜ [rbp-0x4]๋Š” ๊ฐ™์€ ์Šคํƒ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ํ•œ ํ•จ์ˆ˜๊ฐ€ ๊ฑฐ๊ธฐ ์จ ๋†“์€ ๊ฐ’์„ ๋‹ค์Œ ํ•จ์ˆ˜๊ฐ€ ๊ทธ๋Œ€๋กœ ์ด์–ด๋ฐ›๋Š”๋‹ค. ์ง€์—ญ ๋ณ€์ˆ˜์ธ ์ฒ™ํ•˜์ง€๋งŒ ์‹ค์€ ์…‹์ด ๊ณต์œ ํ•˜๋Š” ์Šฌ๋กฏ์ด๋‹ค.

objdump -d -M intel --start-address=0x13f8 --stop-address=0x1472 main | sed -E -f ann_helpers.sed

objdump ๋กœ ๋ณธ unknown_func1 ยท unknown_func2 ยท generate_flag โ€” ์…‹์ด ๊ฐ™์€ ์Šคํƒ ์Šฌ๋กฏ rbp-0x4 ๋ฅผ ์ด์–ด๋ฐ›์•„ slot ์„ 27*cnt + 103 ์œผ๋กœ ๊ตด๋ฆฌ๊ณ , ๋งค์ง ์ƒ์ˆ˜ 0xdd67c8a7 ๊ณฑ์…ˆ์œผ๋กœ 74 ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•œ๋‹ค
objdump ๋กœ ๋ณธ unknown_func1 ยท unknown_func2 ยท generate_flag โ€” ์…‹์ด ๊ฐ™์€ ์Šคํƒ ์Šฌ๋กฏ rbp-0x4 ๋ฅผ ์ด์–ด๋ฐ›์•„ slot ์„ 27*cnt + 103 ์œผ๋กœ ๊ตด๋ฆฌ๊ณ , ๋งค์ง ์ƒ์ˆ˜ 0xdd67c8a7 ๊ณฑ์…ˆ์œผ๋กœ 74 ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•œ๋‹ค

์…‹์„ ์ด์–ด ์ฝ์œผ๋ฉด ์Šฌ๋กฏ ๊ฐ’(slot)์˜ ๋ณ€ํ™”๋Š” ์ด๋ ‡๋‹ค.

  • unknown_func1: slot = cnt โ€” ์ „์—ญ cnt๋ฅผ ๊ณต์œ  ์Šฌ๋กฏ์œผ๋กœ ๋กœ๋“œ.
  • unknown_func2: slot = (slot+5)*3, ๋‹ค์‹œ (slot-7)*9, ๋งˆ์ง€๋ง‰์— +0x1f. ์ „๊ฐœํ•˜๋ฉด slot = 27*cnt + 103.
  • generate_flag: ๋จผ์ € cnt = slot์œผ๋กœ ์ „์—ญ์„ ๊ฐฑ์‹ ํ•˜๊ณ , return (slot % 74) + 0x30.

์—ฌ๊ธฐ์„œ generate_flag ๋์˜ imul ... 0xdd67c8a7 โ†’ shr โ†’ imul ..., 0x4a(=74) โ†’ sub ํ๋ฆ„์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚˜๋ˆ—์…ˆ์„ ๊ณฑ์…ˆ์œผ๋กœ ๋ฐ”๊พผ ๊ด€์šฉ๊ตฌ๋‹ค. ์†์œผ๋กœ ํ’€๊ธฐ ๊ท€์ฐฎ์œผ๋‹ˆ ๋งค์ง ์ƒ์ˆ˜๊ฐ€ ์ •๋ง 74๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€์ธ์ง€ ํŒŒ์ด์ฌ์œผ๋กœ ์ „ ๊ตฌ๊ฐ„ ํ™•์ธํ–ˆ๋‹ค.

# check_magic.py โ€” generate_flag ๋์˜ ๋งค์ง ๋„˜๋ฒ„ ๋‚˜๋ˆ—์…ˆ์ด (v % 74) ์ธ์ง€ ๊ฒ€์ฆ
MASK = 0xFFFFFFFF
 
def asm_mod74(v):
    v &= MASK
    q = ((v >> 1) * 0xdd67c8a7) >> 32   # 64๋น„ํŠธ ๊ณฑ์˜ ์ƒ์œ„ 32๋น„ํŠธ
    q >>= 5                             # q == v // 74
    return (v - 74 * q) & MASK          # == v % 74
 
bad = sum(asm_mod74(v) != v % 74 for v in range(0, 2_000_000))
print(f"checked 0..2_000_000 : mismatches = {bad}")

check_magic.py ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” 0 ๋ถ€ํ„ฐ 200๋งŒ๊นŒ์ง€ ์ „ ๊ตฌ๊ฐ„์—์„œ mismatches ๊ฐ€ 0, ์ฆ‰ ๋งค์ง ์ƒ์ˆ˜ 0xdd67c8a7 ๊ณฑ์…ˆ ๊ด€์šฉ๊ตฌ๋Š” v % 74 ์™€ ์™„์ „ํžˆ ๊ฐ™๊ณ  ๋…ธ๋“œ ๊ฐ’์€ ๊ทธ ๋‚˜๋จธ์ง€์— ๋ฌธ์ž 0 ์„ ๋”ํ•œ ๊ฐ’์ด๋‹ค
check_magic.py ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” 0 ๋ถ€ํ„ฐ 200๋งŒ๊นŒ์ง€ ์ „ ๊ตฌ๊ฐ„์—์„œ mismatches ๊ฐ€ 0, ์ฆ‰ ๋งค์ง ์ƒ์ˆ˜ 0xdd67c8a7 ๊ณฑ์…ˆ ๊ด€์šฉ๊ตฌ๋Š” v % 74 ์™€ ์™„์ „ํžˆ ๊ฐ™๊ณ  ๋…ธ๋“œ ๊ฐ’์€ ๊ทธ ๋‚˜๋จธ์ง€์— ๋ฌธ์ž 0 ์„ ๋”ํ•œ ๊ฐ’์ด๋‹ค

๋ถˆ์ผ์น˜ 0. ๊ทธ๋Ÿฌ๋‹ˆ ๋…ธ๋“œ ๊ฐ’์€ (slot % 74) + '0'์ด๊ณ , slot์€ ๋งค ๋…ธ๋“œ๋งˆ๋‹ค cnt์— ๋‹ค์‹œ ์ €์žฅ๋œ๋‹ค. cnt๋Š” .bss๋ผ ์ฒ˜์Œ์—” 0. ๊ฒฐ๊ตญ ์ธ๋ฑ์Šค๋Š” ์–ด๋””์—๋„ ์•ˆ ์“ฐ์ด๊ณ , ์ „์—ญ ํ•˜๋‚˜๋งŒ ๋„๋Š” ์„ ํ˜• ํ•ฉ๋™ ์ ํ™”์‹(LCG)์ด ๋‚จ๋Š”๋‹ค.

cnt_0    = 0
cnt_{i+1} = (27 * cnt_i + 103) mod 2**32
node[i]   = (cnt_{i+1} % 74) + ord('0')

append_list ์˜ ์ˆจ์€ ์ ํ™”์‹ โ€” ๊ณต์œ  ์Šคํƒ ์Šฌ๋กฏ๊ณผ ์ „์—ญ cnt
append_list ์˜ ์ˆจ์€ ์ ํ™”์‹ โ€” ๊ณต์œ  ์Šคํƒ ์Šฌ๋กฏ๊ณผ ์ „์—ญ cnt

27*cnt+103์ด 32๋น„ํŠธ ์•ˆ์—์„œ ๋„๋‹ˆ ๋…ธ๋“œ ๊ฐ’์€ (x % 74) + '0' ๋ฒ”์œ„, ์ฆ‰ '0'(0x30)๋ถ€ํ„ฐ 'y'(0x79)๊นŒ์ง€์˜ ์ถœ๋ ฅ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž๋‹ค. ๊ณต๋ฐฑ์ด ์—†์–ด scanf("%64s")๋กœ 64๋ฐ”์ดํŠธ๊ฐ€ ํ†ต์งธ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.



๐ŸŽฏ just read memory โ€” ํž™์—์„œ ์ •๋‹ต์„ ์ค๋Š”๋‹ค

์ ํ™”์‹์„ ์•Œ์•˜์œผ๋‹ˆ ํŒŒ์ด์ฌ์œผ๋กœ ์ •๋‹ต์„ ๋ฝ‘์•„๋„ ๋˜์ง€๋งŒ, ๋ฌธ์ œ๊ฐ€ ์‹œํ‚ค๋Š” ๋Œ€๋กœ ํ•˜๋Š” ๊ฒŒ ๋” ๋น ๋ฅด๊ณ  ํ™•์‹คํ•˜๋‹ค. main์€ ์ž…๋ ฅ์„ ๋จผ์ € ๋ฐ›์€ ๋’ค ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์ŠคํŠธ ๊ฐ’์€ ์ž…๋ ฅ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ํ•ญ์ƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์ž…๋ ฅ์„ ์•ˆ ์ค˜๋„(๋นˆ stdin) ๋ฆฌ์ŠคํŠธ๋Š” ์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ์ด ๋๋‚˜๋Š” ์ง€์ (main+0xd4, ๋น„๊ต ๋ฃจํ”„ ์ง์ „)์— ๋ธŒ๋ ˆ์ดํฌ๋ฅผ ๊ฑธ๊ณ , head_node->next๋ถ€ํ„ฐ ์ฒด์ธ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๊ฐ ๋…ธ๋“œ์˜ ์ฒซ ๋ฐ”์ดํŠธ๋งŒ ์ด์–ด ์ถœ๋ ฅํ•˜๋ฉด ๊ทธ๊ฒŒ ์ •๋‹ต ์ž…๋ ฅ์ด๋‹ค.

# read_memory.gdb
break *main+0xd4
run < /dev/null
set $node = *(unsigned long *)(*(unsigned long *)&head_node + 8)
while $node != 0
  printf "%c", *(char *)$node
  set $node = *(unsigned long *)($node + 8)
end
gdb -q -batch -x read_memory.gdb --args ./main

gdb ๋ฐฐ์น˜ ์‹คํ–‰ โ€” main+0xd4 ๋ธŒ๋ ˆ์ดํฌ์—์„œ ๋ฉˆ์ถ˜ ๋’ค head_node ํž™ ํฌ์ธํ„ฐ 0x55555555a730 ์„ ์ฐ๊ณ , next ์ฒด์ธ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋…ธ๋“œ ์ฒซ ๋ฐ”์ดํŠธ๋ฅผ ์ด์–ด ๋ถ™์—ฌ 64๋ฐ”์ดํŠธ ์ •๋‹ต ์ž…๋ ฅ์„ ๊ทธ๋Œ€๋กœ ๋ฝ‘์•„๋ƒˆ๋‹ค
gdb ๋ฐฐ์น˜ ์‹คํ–‰ โ€” main+0xd4 ๋ธŒ๋ ˆ์ดํฌ์—์„œ ๋ฉˆ์ถ˜ ๋’ค head_node ํž™ ํฌ์ธํ„ฐ 0x55555555a730 ์„ ์ฐ๊ณ , next ์ฒด์ธ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋…ธ๋“œ ์ฒซ ๋ฐ”์ดํŠธ๋ฅผ ์ด์–ด ๋ถ™์—ฌ 64๋ฐ”์ดํŠธ ์ •๋‹ต ์ž…๋ ฅ์„ ๊ทธ๋Œ€๋กœ ๋ฝ‘์•„๋ƒˆ๋‹ค

head_node๋Š” ๊ฐ’ 0์งœ๋ฆฌ ๋”๋ฏธ๋ผ head->next๋ถ€ํ„ฐ ์ฝ๋Š”๋‹ค. ๋‚˜์˜ค๋Š” 64๋ฐ”์ดํŠธ MxaDc03Lq\clEbET5XEtshc4[Nw:C@;6o0AT=NCJKh;2iV[:E69rS^qPsb7vytO2๊ฐ€ ๊ทธ๋Œ€๋กœ ์ •๋‹ต ์ž…๋ ฅ์ด๋‹ค. ๋ฆฌ๋ฒ„์‹ฑ์€ ์‚ฌ์‹ค์ƒ ์—ฌ๊ธฐ์„œ ๋๋‚œ๋‹ค โ€” ์ ํ™”์‹์„ ์†์œผ๋กœ ์•ˆ ํ’€์–ด๋„, ๊ฐ’์€ ์ด๋ฏธ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค ์žˆ๋‹ค.

main ํ๋ฆ„๊ณผ just read memory ์ง€๋ฆ„๊ธธ
main ํ๋ฆ„๊ณผ just read memory ์ง€๋ฆ„๊ธธ


๐Ÿš€ Full solve

๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ์€ ๊ฐ’๊ณผ ์ ํ™”์‹์œผ๋กœ ๊ณ„์‚ฐํ•œ ๊ฐ’์ด ๊ฐ™์€์ง€ ๊ต์ฐจ ๊ฒ€์ฆํ•˜๊ณ , ๊ทธ ์ž…๋ ฅ์„ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋„๋กœ ๋จน์—ฌ ํ”Œ๋ž˜๊ทธ๊นŒ์ง€ ๋ฐ›๋Š”๋‹ค. ์„ฑ๊ณต ๋ถ„๊ธฐ๊ฐ€ ์ถœ๋ ฅํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๋Š” ๊ฐ ์ž…๋ ฅ ๋ฐ”์ดํŠธ์˜ ๋์ž๋ฆฌ(input[i] % 10, "%d")๋ฅผ ์ด์–ด๋ถ™์ธ ๊ฒƒ์ด๋‹ค.

# solve.py โ€” ์ˆจ์€ ์ ํ™”์‹์„ ์žฌํ˜„ํ•ด ์ •๋‹ต ์ž…๋ ฅ์„ ๋ณต์›ํ•˜๊ณ , ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๊ฒ€์ฆ
import subprocess
 
MASK = 0xFFFFFFFF
 
def node_bytes():
    cnt, out = 0, []
    for _ in range(64):
        slot = cnt
        slot = (slot + 5) & MASK          # unknown_func2
        slot = (slot * 3) & MASK
        slot = (slot - 7) & MASK
        slot = (slot * 9) & MASK
        slot = (slot + 0x1f) & MASK
        cnt = slot                        # generate_flag: cnt = slot
        out.append(((slot % 74) + 0x30) & 0xFF)
    return bytes(out)
 
correct = node_bytes()
print(f"[*] recovered correct input ({len(correct)} bytes):")
print(f"    {correct.decode('latin-1')!r}")
 
# ์„ฑ๊ณต ๋ถ„๊ธฐ๋Š” DH{ + ๊ฐ input[i] % 10 + } ๋ฅผ ์ฐ๋Š”๋‹ค
predicted = "DH{" + "".join(str(b % 10) for b in correct) + "}"
print(f"[*] predicted flag: {predicted}")
 
res = subprocess.run(["./main"], input=correct + b"\n", capture_output=True)
print(f"[*] binary output : {res.stdout.decode('latin-1').strip()}")

solve.py ์‹คํ–‰ ํ™”๋ฉด โ€” ์ ํ™”์‹์œผ๋กœ ๋ณต์›ํ•œ 64๋ฐ”์ดํŠธ ์ž…๋ ฅ์ด gdb ๋กœ ํž™์—์„œ ์ฝ์€ ๊ฐ’๊ณผ ๊ทธ๋Œ€๋กœ ์ผ์น˜ํ•˜๊ณ , ๊ทธ ์ž…๋ ฅ์„ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋„๋กœ ๋จน์ด์ž Correct ์™€ ํ•จ๊ป˜ ์ตœ์ข… ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ถœ๋ ฅ๋๋‹ค
solve.py ์‹คํ–‰ ํ™”๋ฉด โ€” ์ ํ™”์‹์œผ๋กœ ๋ณต์›ํ•œ 64๋ฐ”์ดํŠธ ์ž…๋ ฅ์ด gdb ๋กœ ํž™์—์„œ ์ฝ์€ ๊ฐ’๊ณผ ๊ทธ๋Œ€๋กœ ์ผ์น˜ํ•˜๊ณ , ๊ทธ ์ž…๋ ฅ์„ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋„๋กœ ๋จน์ด์ž Correct ์™€ ํ•จ๊ป˜ ์ตœ์ข… ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ถœ๋ ฅ๋๋‹ค

์ ํ™”์‹์œผ๋กœ ๋งŒ๋“  ์ž…๋ ฅ์ด gdb๋กœ ํž™์—์„œ ์ฝ์€ ๊ฐ’๊ณผ ์ •ํ™•ํžˆ ๊ฐ™๊ณ , ๊ทธ ์ž…๋ ฅ์„ ๋„ฃ์œผ๋ฉด ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ Correct์™€ ํ•จ๊ป˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ฑ‰๋Š”๋‹ค.

flag is DH{7078981632989894389654921898749418541874549056189474343058581690}

์ด ๊ฐ’์„ ๋“œ๋ฆผํ•ต์— ์ œ์ถœํ•˜๋ฉด ์ •๋‹ต ์ฒ˜๋ฆฌ๋œ๋‹ค.



๐Ÿ“ ๊ฒฐ๋ก 

์ •๋‹ต์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋จผ์ € ๋งŒ๋“ค์–ด ๋‘๋ฉด, ๊ทธ๊ฑด ์ด๋ฏธ ์œ ์ถœ์ด๋‹ค.

์ด ๋ฌธ์ œ์˜ ๊ฒ€์ฆ๊ธฐ๋Š” ์ •๋‹ต ๋ฐ”์ดํŠธ์—ด์„ ํž™์— ํ†ต์งธ๋กœ ์˜ฌ๋ ค๋†“๊ณ  ์ž…๋ ฅ๊ณผ ๋น„๊ตํ•œ๋‹ค. ๋น„๊ต ๋Œ€์ƒ์ด ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ์— ํ‰๋ฌธ์œผ๋กœ ์กด์žฌํ•˜๋Š” ์ˆœ๊ฐ„, ์•„๋ฌด๋ฆฌ ์ƒ์„ฑ ๋กœ์ง์„ ๊ผฌ์•„๋„ ๋ธŒ๋ ˆ์ดํฌ ํ•œ ๋ฒˆ์ด๋ฉด ๋๋‚œ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ •๋‹ต/ํ‚ค๋ฅผ ๋“ค๊ณ  ๋น„๊ตํ•˜๋Š” ๊ตฌ์กฐ ์ž์ฒด๊ฐ€ ์•ฝ์ ์ด๋‹ค.

๋‚œ๋…ํ™”๋Š” "์™œ ๊ทธ๋ ‡๊ฒŒ ๋๋‚˜"๋ฅผ ์ˆจ๊ธธ ๋ฟ, "์ง€๊ธˆ ๊ฐ’์ด ๋ญ”๊ฐ€"๋Š” ๋ชป ์ˆจ๊ธด๋‹ค.

unknown_func1/2๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์ดˆ๊ธฐํ™” ์•ˆ ๋œ ์Šคํƒ ์Šฌ๋กฏ ํŠธ๋ฆญ์€ ์ •์  ๋ถ„์„์„ ํ™•์‹คํžˆ ์„ฑ๊ฐ€์‹œ๊ฒŒ ๋งŒ๋“ ๋‹ค. ์ธ์ž๋กœ ๋„˜์–ด์˜ค๋Š” i์— ์‹œ์„ ์„ ๋บ๊ธฐ๋ฉด ํ•œ์ฐธ ํ—ค๋งจ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋ชจ๋“  ๊ณ„์‚ฐ์˜ ๊ฒฐ๊ณผ๋Š” ๊ฒฐ๊ตญ ๋ฆฌ์ŠคํŠธ ๋…ธ๋“œ๋ผ๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ๋Š”๋‹ค. ์ •์ ์œผ๋กœ ์ ํ™”์‹์„ ๋ณต์›ํ•˜๋Š” ๊ธธ๊ณผ, ๋™์ ์œผ๋กœ ๊ฒฐ๊ณผ๋งŒ ์ค๋Š” ๊ธธ โ€” ๋ฆฌ๋ฒ„์‹ฑ์—์„  ๋‘˜ ๋‹ค ์†์— ์ตํ˜€ ๋‘๋Š” ๊ฒŒ ์ข‹๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํ›„์ž๊ฐ€ ํ›จ์”ฌ ์งง๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ ๊ด€์šฉ๊ตฌ๋Š” ํ‘œ๋กœ ์™ธ์›Œ๋‘๋ฉด ๋น ๋ฅด๋‹ค.

imul ๋งค์ง ์ƒ์ˆ˜ + shr + sub ์กฐํ•ฉ์€ ์‹ญ์ค‘ํŒ”๊ตฌ ์ƒ์ˆ˜ ๋‚˜๋ˆ—์…ˆ์˜ ๋‚˜๋จธ์ง€ ๊ณ„์‚ฐ์ด๋‹ค. ๋งค๋ฒˆ ์†์œผ๋กœ ์ „๊ฐœํ•˜์ง€ ๋ง๊ณ , ์˜์‹ฌ๋˜๋ฉด ์˜ค๋Š˜์ฒ˜๋Ÿผ ์ „ ๊ตฌ๊ฐ„์„ ํ•œ ๋ฒˆ ๋Œ๋ ค ํ™•์ธํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค.

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅˆ Silver 1] MixColumns ํ•˜๋‚˜๊ฐ€ ๋น ์ง€๋ฉด AES ๋Š” XOR ํ‘œ๋กœ ๋ฌด๋„ˆ์ง„๋‹ค โ€” DreamHack locked present ํ’€์ด
blog

[๐Ÿฅˆ Silver 1] MixColumns ํ•˜๋‚˜๊ฐ€ ๋น ์ง€๋ฉด AES ๋Š” XOR ํ‘œ๋กœ ๋ฌด๋„ˆ์ง„๋‹ค โ€” DreamHack locked present ํ’€์ด

25๋ฐ”์ดํŠธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” stripped ELF ์•ˆ์— 5x5 ๋ธ”๋ก AES ๋ณ€ํ˜•์ด ํ†ต์งธ๋กœ ๋“ค์–ด ์žˆ๋‹ค. S-box ๋„ Rcon ๋„ ์ง„์งœ AES ์ธ๋ฐ MixColumns ๋งŒ ์—†๋‹ค. ๊ทธ ํ•˜๋‚˜๊ฐ€ ๋น ์ง€์ž ํ™•์‚ฐ์ด ์‚ฌ๋ผ์ ธ ํ‰๋ฌธ ๋ฐ”์ดํŠธ ํ•˜๋‚˜๊ฐ€ ์•”ํ˜ธ๋ฌธ ๋ฐ”์ดํŠธ ํ•˜๋‚˜๋กœ ๊ทธ๋Œ€๋กœ ๋Œ€์‘ํ–ˆ๊ณ , ๋ผ์šด๋“œ๊ฐ€ 10 ์ด๋ผ ์—ด ํšŒ์ „๋งˆ์ € ์ƒ์‡„๋ผ ์ž๋ฆฌ ์ˆœ์—ด๊นŒ์ง€ ํ•ญ๋“ฑ์ด ๋๋‹ค. ์žฌ๊ตฌํ˜„์œผ๋กœ ๋˜๊ฐ์•„ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณต๊ตฌํ•˜๊ณ , ํ‚ค๋ฅผ ์ „ํ˜€ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ๋„ ๊ฐ™์€ ๊ฐ’์ด ๋‚˜์˜ค๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋กœ ์‹ค์ฆํ–ˆ๋‹ค.
#dreamhack#ctf#reversing+7
2026-08-19#dreamhack +4
[๐Ÿฅˆ 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 +4
[๐Ÿฅˆ Silver 3] srand(0xBEEF) ํ•˜๋‚˜๋กœ 6MB ์‚ฌ์ง„์„ ๋˜์ฐพ๋‹ค โ€” DreamHack photographer ํ’€์ด
blog

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

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