[๐Ÿฅ‡ Gold 1] 27455๋ฒˆ ๋ฐ˜๋ณต๋˜๋Š” ๋ˆ„์‚ฐ๋„ ๊ฒฐ๊ตญ ์„ ํ˜•์ด๋‹ค โ€” DreamHack multipoint ํ’€์ด (2๋ฒˆ ๋ณด๋ฅ˜ ๋์— ํ•ด๊ฒฐ)

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

[๐Ÿฅ‡ Gold 1] 27455๋ฒˆ ๋ฐ˜๋ณต๋˜๋Š” ๋ˆ„์‚ฐ๋„ ๊ฒฐ๊ตญ ์„ ํ˜•์ด๋‹ค โ€” DreamHack multipoint ํ’€์ด (2๋ฒˆ ๋ณด๋ฅ˜ ๋์— ํ•ด๊ฒฐ)

38๋ฐ”์ดํŠธ ๋ชฉํ‘œ๊ฐ’๊ณผ memcmpํ•˜๋Š” 39๋ฐ”์ดํŠธ ์ž…๋ ฅ ๊ฒ€์ฆ๊ธฐ. ๊ฒ€์ฆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋Š” ๋‹จ์ˆœํ•œ ๊ณฑ์…ˆ-๋ˆ„์‚ฐ ๋ฃจํ”„์ธ๋ฐ, ๋ช‡ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋„๋Š”์ง€๊ฐ€ ํŒŒ์ผ ์•ˆ์˜ ๋ฐ์ดํ„ฐ๋กœ ๊ฒฐ์ •๋˜๋Š” ๊ตฌ์กฐ๋ผ ์ •์ ์œผ๋กœ ํ›‘๋‹ค๊ฐ€ "๋ง์ด ์•ˆ ๋˜๊ฒŒ ํฌ๋‹ค"๋Š” ํŒ๋‹จ์„ ๋‚ด๋ ค ๋‘ ์„ธ์…˜ ์—ฐ์† ๋ณด๋ฅ˜ํ–ˆ๋˜ ๋ฌธ์ œ๋‹ค. ์‚ฌ์‹ค์€ ํŒ๋‹จ์ด ํ‹€๋ ธ๋˜ ๊ฒƒ๋ฟ์ด์—ˆ๋‹ค โ€” ์ •๋ง๋กœ 27455๋ฒˆ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒŒ ๋งž์•˜๊ณ , ๊ทธ ๋ฐ˜๋ณต์ด ์•„๋ฌด๋ฆฌ ๋งŽ์•„๋„ ๊ฐ ํ•ญ์˜ ๊ณ„์ˆ˜๊ฐ€ ์ „๋ถ€ ์ปดํŒŒ์ผํƒ€์ž„ ์ƒ์ˆ˜๋ผ๋Š” ์‚ฌ์‹ค์„ ๋†“์น˜์ง€ ์•Š์œผ๋ฉด ์ „์ฒด๊ฐ€ GF(251) ์œ„์˜ ์„ ํ˜• ๋ฐฉ์ •์‹ ํ•˜๋‚˜๋กœ ์ •๋ฆฌ๋œ๋‹ค.

๋ฌธ์ œ: DreamHack โ€” multipoint ๋ถ„๋ฅ˜: Reversing ๋‚œ์ด๋„: ๐Ÿฅ‡ Gold 1 FLAG: DH{Poly_m0ly_mult1pl1c4t1on_m0dular~!}

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


๋ฌธ์ œ ๊ฐœ์š”

file๊ณผ checksec๋ถ€ํ„ฐ ํ™•์ธํ–ˆ๋‹ค. PIE, ํ’€ RELRO, ์Šคํƒ ์นด๋‚˜๋ฆฌ, NX โ€” ํŠน๋ณ„ํ•  ๊ฒƒ ์—†๋Š” ๊ธฐ๋ณธ ๋ณดํ˜ธ๊ธฐ๋ฒ• ์กฐํ•ฉ์˜ x86-64 ๋ฐ”์ด๋„ˆ๋ฆฌ๋‹ค. Strip๋ผ ์žˆ์–ด ์‹ฌ๋ณผ์€ ์—†๋‹ค.

file๊ณผ checksec ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” multipoint๋Š” stripped๋œ PIE ์‹คํ–‰ํŒŒ์ผ, Full RELRO/Canary found/NX enabled/PIE enabled ์ „๋ถ€ ์ผœ์ ธ์žˆ๋Š” ํ‘œ์ค€ ๋ณดํ˜ธ๊ธฐ๋ฒ• ์กฐํ•ฉ

main์„ objdump๋กœ ์—ด์–ด๋ณด๋ฉด ๋กœ์ง ์ž์ฒด๋Š” ์งง๋‹ค. read()๋กœ ์ •ํ™•ํžˆ 39๋ฐ”์ดํŠธ(0x27)๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , 39๊ฐ€ ์•„๋‹ˆ๋ฉด ์ฆ‰์‹œ ์‹คํŒจ ๋ฉ”์‹œ์ง€๋ฅผ ์ฐ๊ณ  ์ข…๋ฃŒํ•œ๋‹ค. 39๋ฐ”์ดํŠธ๋ฅผ ๋‹ค ๋ฐ›์œผ๋ฉด ์–ด๋–ค ๋ฃจํ”„๋ฅผ ๋Œ๋ ค 38๋ฐ”์ดํŠธ์งœ๋ฆฌ ๋ฒ„ํผ(buf1)๋ฅผ ์ฑ„์šฐ๊ณ , ๊ทธ๊ฑธ 0x21bd60 ์œ„์น˜์˜ 38๋ฐ”์ดํŠธ ์ •๋‹ต๊ฐ’๊ณผ memcmp๋กœ ๋น„๊ตํ•œ๋‹ค. ๊ทธ ๋น„๊ต๊ฐ€ ํ†ต๊ณผํ•˜๋ฉด Correct, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค โ€” ์ „ํ˜•์ ์ธ "์ž…๋ ฅ โ†’ ๊ฒฐ์ •๋ก ์  ๋ณ€ํ™˜ โ†’ ๋ชฉํ‘œ๊ฐ’๊ณผ ๋น„๊ต" ๊ตฌ์กฐ๋‹ค.

๊ด€๊ฑด์€ ๊ทธ "๊ฒฐ์ •๋ก ์  ๋ณ€ํ™˜"์ด ์ •ํ™•ํžˆ ๋ญ˜ ํ•˜๋А๋ƒ์˜€๋‹ค. ๋ฃจํ”„ ๋ณธ๋ฌธ์„ ํ•˜๋‚˜์”ฉ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ์ฃผ์„์„ ๋‹ฌ์•˜๋‹ค.

objdump ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์†์œผ๋กœ ์ฃผ์„ ๋‹จ ์บก์ณ โ€” ๋ ˆ์ฝ”๋“œ์—์„œ f0,f1,f2,f3 ๋„ค ๋ฐ”์ดํŠธ๋ฅผ ์ฝ์–ด buf1[f0] += f3 * input[f1] * table3[f2] (mod 251) ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , i๋ฅผ ๋Š˜๋ ค ๋‹ค์Œ 4๋ฐ”์ดํŠธ ๋ ˆ์ฝ”๋“œ๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ํ•œ ์ค„์”ฉ ํ‘œ์‹œ

์ •๋ฆฌํ•˜๋ฉด ๋ฃจํ”„ ํ•œ ๋ฒˆ(๋ ˆ์ฝ”๋“œ ํ•˜๋‚˜)์ด ํ•˜๋Š” ์ผ์€ ์ด๋ ‡๋‹ค.

f0, f1, f2, f3 = table[i*4 .. i*4+3]        # ๋ ˆ์ฝ”๋“œ 4๋ฐ”์ดํŠธ
buf1[f0] = (buf1[f0] + f3 * input[f1] * table3[f2]) % 251
i += 1

๊ทธ๋ฆฌ๊ณ  ์ข…๋ฃŒ ์กฐ๊ฑด์€ "์ •ํ•ด์ง„ ํšŸ์ˆ˜๋งŒํผ"์ด ์•„๋‹ˆ๋ผ ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ 4๋ฐ”์ดํŠธ๋ฅผ 32๋น„ํŠธ ์ •์ˆ˜๋กœ ์ฝ์—ˆ์„ ๋•Œ ๊ทธ๊ฒŒ 0์ด๋ฉด ๋ฉˆ์ถ˜๋‹ค์˜€๋‹ค. ์ฒซ ์„ธ์…˜์—๋Š” ์ด๊ฑธ "39๋ฒˆ ๊ณ ์ • ๋ฐ˜๋ณต"์œผ๋กœ ์ž˜๋ชป ์งš์—ˆ์—ˆ๊ณ , ๋‘ ๋ฒˆ์งธ ์„ธ์…˜์—์„œ ์ด ๋ถ€๋ถ„์€ ๋ฐ”๋กœ์žก์•˜๋‹ค. ๋ฌธ์ œ๋Š” ๊ทธ๋‹ค์Œ์ด์—ˆ๋‹ค.


โ–ถ๐Ÿ•ณ๏ธ ์‚ฝ์งˆ โ€” ํ…Œ์ด๋ธ”์ด ์ด์ƒํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ ์ •๋ง ๊ทธ๋งŒํผ ์ปธ๋‹ค

์ข…๋ฃŒ ์กฐ๊ฑด์„ ๋ฐ”๋กœ์žก๊ณ  ๋‚˜์„œ, "๊ทธ๋Ÿผ ์‹ค์ œ๋กœ ๋ช‡ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€" ํ™•์ธํ•˜๋ ค๊ณ  ํŒŒ์ผ์—์„œ ํ…Œ์ด๋ธ” ์‹œ์ž‘ ์ฃผ์†Œ(0x201020)๋ถ€ํ„ฐ 4๋ฐ”์ดํŠธ์”ฉ ์ฝ์œผ๋ฉฐ all-zero ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋Œ๋ ธ๋‹ค. ์ฒ˜์Œ์—” 1000๊ฐœ ๋ ˆ์ฝ”๋“œ(4000๋ฐ”์ดํŠธ)๋งŒ ํ›‘์–ด๋ดค๋‹ค.

for i in range(1000):
    off = table_off + i*4
    if struct.unpack('<I', data[off:off+4])[0] == 0:
        found = True
        break
scan_check.py ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” ์ฒซ 1000๊ฐœ ๋ ˆ์ฝ”๋“œ ์•ˆ์—๋Š” ์ข…๊ฒฐ 0-๋ ˆ์ฝ”๋“œ๊ฐ€ ์ „ํ˜€ ์—†๋‹ค๋Š” ์ถœ๋ ฅ๊ณผ, ์Šค์บ”์„ ๋๊นŒ์ง€ ์ด์–ด๊ฐ€์ž i=27455์—์„œ ์ง„์งœ ์ข…๊ฒฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•˜๋‹ค๋Š” ์ถœ๋ ฅ์ด ํ•จ๊ป˜ ๋‚˜์˜ค๋Š” ํ„ฐ๋ฏธ๋„ ์บก์ณ

1000๊ฐœ๋ฅผ ํ›‘์–ด๋„ ์ข…๊ฒฐ ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜๋„ ์•ˆ ๋‚˜์™”๋‹ค. ์—ฌ๊ธฐ์„œ "์ด๊ฑด ๋ญ”๊ฐ€ ์ด์ƒํ•˜๋‹ค โ€” ์ง„์งœ ์ด๋ ‡๊ฒŒ ํฐ ํ…Œ์ด๋ธ”์ผ ๋ฆฌ๊ฐ€ ์—†๋‹ค, ๋‚ด๊ฐ€ ์ฃผ์†Œ๋ฅผ ์ž˜๋ชป ์งš์—ˆ๊ฑฐ๋‚˜ ๋ ˆ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์˜ค๋…ํ•œ ๊ฒŒ ๋ถ„๋ช…ํ•˜๋‹ค"๊ณ  ํŒ๋‹จํ•ด๋ฒ„๋ ธ๋‹ค. ๊ทธ ํŒ๋‹จ์„ ๊ทผ๊ฑฐ๋กœ GDB์—์„œ ์‹ค์ œ ์‹คํ–‰ ์ค‘์ธ buf1 ๊ฐ’์„ ์ž„์˜ ์ž…๋ ฅ(input[i] = i+1)์— ๋Œ€ํ•ด ์ฐ์–ด๋ณด๊ณ  ๋‚ด ํŒŒ์ด์ฌ ๋ชจ๋ธ์˜ ์˜ˆ์ธก๊ฐ’๊ณผ ๋น„๊ตํ–ˆ๋Š”๋ฐ, ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฐ’์ด ๋‚˜์™”๋‹ค. ์ด ๋ถˆ์ผ์น˜๋ฅผ "์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ชจ๋ธ ์ž์ฒด๊ฐ€ ํ‹€๋ ธ๋‹ค"๋Š” ์ฆ๊ฑฐ๋กœ ๋ฐ›์•„๋“ค์ด๊ณ  ๋‘ ๋ฒˆ์งธ ์„ธ์…˜๋„ ๊ทธ๋Œ€๋กœ ๋ณด๋ฅ˜ํ–ˆ๋‹ค.

๋Œ์ด์ผœ๋ณด๋ฉด ์ด GDB ๋น„๊ต ์ž์ฒด๊ฐ€ ์ž˜๋ชป๋œ ์‹คํ—˜์ด์—ˆ๋‹ค โ€” ์• ์ดˆ์— ๋ชจ๋ธ์ด "39๋ฒˆ๋งŒ ๋ฐ˜๋ณตํ•œ๋‹ค"๊ณ  (์•”๋ฌต์ ์œผ๋กœ) ๊ฐ€์ •ํ•œ ์ฑ„๋กœ ๋งŒ๋“  ์˜ˆ์ธก๊ฐ’๊ณผ ์‹ค์ธก์„ ๋น„๊ตํ–ˆ์œผ๋‹ˆ, ๋ฃจํ”„๊ฐ€ ์‹ค์ œ๋กœ๋Š” ํ›จ์”ฌ ๋” ๊ธธ๊ฒŒ ๋„๋Š” ์ด์ƒ ์•ˆ ๋งž๋Š” ๊ฒŒ ๋‹น์—ฐํ–ˆ๋‹ค. ์ง„์งœ ์›์ธ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž˜๋ชป ์ฝ์€ ๊ฒŒ ์•„๋‹ˆ๋ผ ์Šค์บ”์„ ์ค‘๊ฐ„์— ๋ฉˆ์ถ”๊ณ  "์ด์ƒํ•˜๋‹ค"๋Š” ๊ฐ(ๆ„Ÿ)์„ ๊ทผ๊ฑฐ๋กœ ๊ฒฐ๋ก ์„ ๋‚ด๋ ค๋ฒ„๋ฆฐ ๊ฒƒ์ด์—ˆ๋‹ค.

์ด๋ฒˆ์—” ๊ทธ ์˜์‹ฌ์„ ๋ฒ„๋ฆฌ๊ณ  ์Šค์บ”์„ ๋๊นŒ์ง€ ์ด์–ด๊ฐ”๋‹ค. table3๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์ฃผ์†Œ(0x21bd20)๊นŒ์ง€ ํŒŒ์ผ์„ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๊ณ„์† ์ฝ์—ˆ๋”๋‹ˆ, ์ •ํ™•ํžˆ i=27455์—์„œ ์ง„์งœ ์ข…๊ฒฐ ๋ ˆ์ฝ”๋“œ(4๋ฐ”์ดํŠธ ๋ชจ๋‘ 0)๊ฐ€ ๋‚˜์™”๋‹ค. table ์‹œ์ž‘๋ถ€ํ„ฐ table3 ์‹œ์ž‘๊นŒ์ง€์˜ ๊ฐ„๊ฒฉ์€ 109824๋ฐ”์ดํŠธ โ€” 27455 ร— 4 + 4(์ข…๊ฒฐ ๋ ˆ์ฝ”๋“œ) ์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค. ํ…Œ์ด๋ธ”์€ ์ด์ƒํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ •๋ง๋กœ ๊ทธ๋งŒํผ ์ปธ์„ ๋ฟ์ด์—ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” GDB๋กœ ๋‹ค๋ฃฐ ๋•Œ๋„ ํ•œ ๊ฐ€์ง€ ๋” ํ•จ์ •์ด ์žˆ์—ˆ๋‹ค โ€” PIE ๋ฒ ์ด์Šค๊ฐ€ ํ†ต์ƒ ๊ฐ€์ •ํ•˜๋Š” 0x555555554000์ด ์•„๋‹ˆ๋ผ .text๋Š” 0x555555400000, .data๋Š” 0x555555600000์œผ๋กœ ๋”ฐ๋กœ ๋กœ๋“œ๋œ๋‹ค(.data๊ฐ€ ๋ณ„๋„์˜ ํฐ LOAD ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์š”๊ตฌํ•  ๋งŒํผ ํฌ๊ธฐ ๋•Œ๋ฌธ). ํŒŒ์ผ ์˜คํ”„์…‹ ๊ทธ๋Œ€๋กœ ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๋ฅผ ๊ฑธ๋ฉด ๊ณง๋ฐ”๋กœ ์‹คํŒจํ•œ๋‹ค.

gdb -batch๋กœ ํŒŒ์ผ ์˜คํ”„์…‹ 0x610์— ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๋ฅผ ๊ฑธ์—ˆ์„ ๋•Œ Cannot access memory at address 0x610 ๋กœ ์‹คํŒจํ•œ ์งํ›„, info proc mappings๋กœ ์‹ค์ œ ๋งคํ•‘์„ ํ™•์ธํ•˜๋‹ˆ .text๊ฐ€ 0x555555400000, .data๊ฐ€ 0x555555600000 ์ด๋ผ๋Š” ํ†ต์ƒ๊ณผ ๋‹ค๋ฅธ ๋ฒ ์ด์Šค์— ๋กœ๋“œ๋˜์–ด ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๋Š” ์บก์ณ

์ด๋ฒˆ ํ’€์ด ์ž์ฒด์—” ๊ฒฐ๊ตญ GDB๊ฐ€ ํ•„์š” ์—†์—ˆ์ง€๋งŒ(ํŒŒ์ผ์—์„œ ์ง์ ‘ ์ฝ์–ด ์ •์ ์œผ๋กœ ํ’€๋ ธ๋‹ค), ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๋งŒ์งˆ ์ผ์ด ์žˆ๋‹ค๋ฉด info proc mappings๋ถ€ํ„ฐ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ™•์ธํ•œ ์…ˆ์ด๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ โ€” 27455๋ฒˆ ๋ˆ„์‚ฐ๋ผ๋„, ๊ณ„์ˆ˜๊ฐ€ ์ƒ์ˆ˜๋ฉด ๊ทธ๋ƒฅ ์„ ํ˜•์ด๋‹ค

๋ ˆ์ฝ”๋“œ ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์„ ๋‹ค์‹œ ๋ณด์ž.

buf1[f0] += f3 * input[f1] * table3[f2]     (mod 251)

์—ฌ๊ธฐ์„œ f0, f1, f2, f3๋Š” ์ „๋ถ€ ํ…Œ์ด๋ธ”์— ๋ฐ•ํ˜€ ์žˆ๋Š” ๊ณ ์ • ๋ฐ”์ดํŠธ๊ณ , table3[f2]๋„ ํŒŒ์ผ ์•ˆ์˜ ์ •์  ๋ฃฉ์—… ํ…Œ์ด๋ธ” ๊ฐ’์ด๋‹ค. ์ฆ‰ f3 * table3[f2]๋Š” ๋งค ๋ ˆ์ฝ”๋“œ๋งˆ๋‹ค ์ปดํŒŒ์ผ ์‹œ์ ์— ์ด๋ฏธ ์ •ํ•ด์ง„ ํ•˜๋‚˜์˜ ์ƒ์ˆ˜๋‹ค. ์ด ์ƒ์ˆ˜๋ฅผ c๋ผ๊ณ  ํ•˜๋ฉด ๋ ˆ์ฝ”๋“œ ํ•˜๋‚˜๊ฐ€ ํ•˜๋Š” ์ผ์€ ๊ฒฐ๊ตญ buf1[f0] += c * input[f1] ๋ฟ์ด๋‹ค โ€” input[f1]์— ๋Œ€ํ•ด ์™„์ „ํžˆ 1์ฐจ์‹์ด๋‹ค.

mod 251์€ ๋ง์…ˆ์— ๋ถ„๋ฐฐ๋œ๋‹ค((a+b) mod n = ((a mod n) + (b mod n)) mod n์ด ๋ฐ˜๋ณต ์ ์šฉ๋˜๋ฏ€๋กœ). ๊ทธ๋Ÿฌ๋‹ˆ 27455๋ฒˆ์„ ๋„๋Š” ๋™์•ˆ ์ค‘๊ฐ„์— ๋งค๋ฒˆ mod๋ฅผ ์ทจํ•˜๋“ , ๋‹ค ๋”ํ•œ ๋‹ค์Œ ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ๋งŒ mod๋ฅผ ์ทจํ•˜๋“  ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค. ๊ฒฐ๊ตญ buf1[f0]์˜ ์ตœ์ข…๊ฐ’์€ ๊ทธ f0๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์˜ c * input[f1] ํ•ญ์„ ์ „๋ถ€ ๋”ํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

์ด๊ฑด ์ •ํ™•ํžˆ ํ–‰๋ ฌ-๋ฒกํ„ฐ ๊ณฑ์ด๋‹ค.

buf1 = M ยท input   (mod 251)

์—ฌ๊ธฐ์„œ M์€ 38ร—39 ํ–‰๋ ฌ์ด๊ณ , M[f0][f1]์€ "๊ทธ (f0, f1) ์กฐํ•ฉ์„ ๊ฐ–๋Š” ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์˜ f3 * table3[f2] ๊ฐ’์„ ๋‹ค ๋”ํ•œ ๊ฒƒ"์ด๋‹ค. 27455๊ฐœ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉฐ ์ด ํ–‰๋ ฌ์„ ๊ทธ๋Œ€๋กœ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๋‹ค.

M = [[0]*39 for _ in range(38)]
i = 0
while True:
    rec = data[table_off + i*4 : table_off + i*4 + 4]
    if struct.unpack('<I', rec)[0] == 0:
        break
    f0, f1, f2, f3 = rec
    M[f0][f1] = (M[f0][f1] + f3 * table3[f2]) % 251
    i += 1

์ด์ œ M ยท input โ‰ก target (mod 251)์„ ํ‘ธ๋Š” ํ‘œ์ค€ ์„ ํ˜•๋Œ€์ˆ˜ ๋ฌธ์ œ๋กœ ๋ฐ”๋€๋‹ค. 251์€ ์†Œ์ˆ˜๋ผ์„œ ๋‚˜๋ˆ—์…ˆ(๋ชจ๋“ˆ๋Ÿฌ ์—ญ์›)์ด ํ•ญ์ƒ ์กด์žฌํ•˜๊ณ , GF(251) ์œ„์—์„œ ๊ฐ€์šฐ์Šค ์†Œ๊ฑฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

์ „์ฒด ํ’€์ด ํ๋ฆ„ ๋‹ค์ด์–ด๊ทธ๋žจ โ€” ์ง€๋‚œ ๋‘ ์„ธ์…˜์˜ ์Šค์บ” ์ค‘๋‹จ ๋ฌธ์ œ, ๋ ˆ์ฝ”๋“œ ์—ฐ์‚ฐ์ด ์„ ํ˜•์ž„์„ ํ™•์ธ, GF(251) ๊ฐ€์šฐ์Šค์†Œ๊ฑฐ๋กœ 38x39 ํ–‰๋ ฌ ํ’€์ด, PIE ๋ฒ ์ด์Šค ์ฐธ๊ณ ์‚ฌํ•ญ, ์ตœ์ข… flag๊นŒ์ง€ 4๋‹จ๊ณ„

๐ŸŽฏ ์ž์ฒด ์™„๊ฒฐ solve

M์„ ์กฐ๋ฆฝํ•œ ๋’ค [M | target] ์ฆ๊ฐ•ํ–‰๋ ฌ์„ GF(251)์—์„œ ํ‘œ์ค€ ๊ฐ€์šฐ์Šค ์†Œ๊ฑฐ๋กœ ํ–‰ ์‚ฌ๋‹ค๋ฆฌ๊ผด๋กœ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. ๊ฐ ์—ด(ํ”ผ๋ฒ— ์—ด)์—์„œ 0์ด ์•„๋‹Œ ์›์†Œ๋ฅผ ์ฐพ์•„ ๊ทธ ํ–‰์„ ์ •๊ทœํ™”(๋ชจ๋“ˆ๋Ÿฌ ์—ญ์›์„ ๊ณฑํ•ด 1๋กœ ๋งŒ๋“ฆ)ํ•˜๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“  ํ–‰์—์„œ ๊ทธ ์—ด ์„ฑ๋ถ„์„ ์ œ๊ฑฐํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.

def inv(a):
    return pow(a, 251 - 2, 251)   # ํŽ˜๋ฅด๋งˆ ์†Œ์ •๋ฆฌ๋กœ ๋ชจ๋“ˆ๋Ÿฌ ์—ญ์›
 
A = [row[:] + [target[r]] for r, row in enumerate(M)]
pivot_cols = []
r = 0
for c in range(39):
    piv = next((rr for rr in range(r, 38) if A[rr][c] % 251), None)
    if piv is None:
        continue
    A[r], A[piv] = A[piv], A[r]
    iv = inv(A[r][c])
    A[r] = [(x * iv) % 251 for x in A[r]]
    for rr in range(38):
        if rr != r and A[rr][c]:
            f = A[rr][c]
            A[rr] = [(A[rr][k] - f * A[r][k]) % 251 for k in range(40)]
    pivot_cols.append(c)
    r += 1

์‹คํ–‰ํ•ด๋ณด๋ฉด ๋žญํฌ๊ฐ€ 38๋กœ ๋‚˜์˜จ๋‹ค โ€” ๋ฐฉ์ •์‹ 38๊ฐœ(buf1์˜ 38๋ฐ”์ดํŠธ)๊ฐ€ ์ „๋ถ€ ๋…๋ฆฝ์ด๋ผ๋Š” ๋œป์ด๋‹ค. ๋ฏธ์ง€์ˆ˜๋Š” 39๊ฐœ(input์˜ 39๋ฐ”์ดํŠธ)์ด๋ฏ€๋กœ ์ž์œ ๋„๊ฐ€ ์ •ํ™•ํžˆ 1 ๋‚จ๋Š”๋ฐ, ๊ทธ ์ž์œ ๋ณ€์ˆ˜๊ฐ€ ํ•˜ํ•„ input[38](์ž…๋ ฅ์˜ ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ) ๊ทธ ์ž์ฒด์˜€๋‹ค. ์–ด๋–ค ๋ ˆ์ฝ”๋“œ๋„ f1=38์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ์ด ๋ฐ”์ดํŠธ๋Š” ์• ์ดˆ์— ๊ฒ€์ฆ ๋กœ์ง์— ์ „ํ˜€ ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

solve.py ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” records processed: 27455, rank = 38 / 38, free (unconstrained) input byte(s): [38], recovered flag bytes: DH{Poly_m0ly_mult1pl1c4t1on_m0dular~!} ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ๋จ

input[0..37]์€ ์œ ์ผํ•˜๊ฒŒ ๊ฒฐ์ •๋˜๊ณ , input[38]์€ ๋ญ˜ ๋„ฃ์–ด๋„ ๊ฒ€์ฆ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค โ€” read()๊ฐ€ ์š”๊ตฌํ•˜๋Š” 39๋ฐ”์ดํŠธ๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•œ ์ž๋ฆฌ์ผ ๋ฟ์ด๋‹ค(ํ„ฐ๋ฏธ๋„์— flag๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Enter๋ฅผ ์น˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ทธ ๊ฐœํ–‰ ๋ฌธ์ž๊ฐ€ 39๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋กœ ์ฑ„์›Œ์ง€๋Š” ๊ตฌ์กฐ๋กœ ๋ณด์ธ๋‹ค). ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋กœ์ปฌ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋„ฃ์–ด ์‹ค์ œ๋กœ ๊ฒ€์ฆํ–ˆ๋‹ค.

DH{Poly_m0ly_mult1pl1c4t1on_m0dular~!}
printf๋กœ flag ๋’ค์— ๊ฐœํ–‰์„ ๋ถ™์—ฌ ํŒŒ์ดํ”„๋กœ ๋„˜๊ธด ๊ฒฐ๊ณผ multipoint ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ Input : Correct ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  exit=0์œผ๋กœ ์ข…๋ฃŒํ•˜๋Š” ์บก์ณ โ€” ๋กœ์ปฌ์—์„œ ์‹ค์ œ ๊ฒ€์ฆ ๋กœ์ง์„ ํ†ต๊ณผํ–ˆ๋‹ค๋Š” ํ™•์ฆ

Input : Correct, exit=0. ์ด ๋ฌธ์ œ๋Š” needs_vm=False๋ผ ๋ณ„๋„ ์›๊ฒฉ ์„œ๋ฒ„ ์—†์ด ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž์ฒด๊ฐ€ ๊ณง ์ฑ„์ ๊ธฐ๋‹ค โ€” ๋กœ์ปฌ์—์„œ ํ†ต๊ณผํ•œ ๊ฒŒ ๊ณง ์ •๋‹ต์ด๋ผ๋Š” ๋œป์ด๋‹ค. ๋“œ๋ฆผํ•ต์— ์ œ์ถœํ•ด "์ •๋‹ต! ํ•ด๊ฒฐ ์ฒ˜๋ฆฌ๋จ"์œผ๋กœ ํ™•์ •๋๋‹ค.


๐Ÿ“ ๊ฒฐ๋ก 

์ด ๋ฌธ์ œ๊ฐ€ ์ค€ ์ง„์งœ ๊ตํ›ˆ์€ ๋ฆฌ๋ฒ„์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋ณด๋‹ค "์ด์ƒํ•˜๋‹ค"๋Š” ์ง๊ฐ์„ ๊ฒ€์ฆ ์—†์ด ๊ฒฐ๋ก ์œผ๋กœ ์Šน๊ฒฉ์‹œํ‚ค๋ฉด ์•ˆ ๋œ๋‹ค๋Š” ์ชฝ์— ๋” ๊ฐ€๊นŒ์› ๋‹ค.

  • "๋ง์ด ์•ˆ ๋˜๊ฒŒ ํฌ๋‹ค/์ด์ƒํ•˜๋‹ค"๋Š” ํŒ๋‹จ์ด ๋“ค๋ฉด, ๊ทธ ํŒ๋‹จ ์ž์ฒด๋ฅผ ์˜์‹ฌํ•˜๊ธฐ ์ „์— ๋จผ์ € ๋๊นŒ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. 1000๊ฐœ ๋ ˆ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•ด์„œ ์ข…๊ฒฐ ์กฐ๊ฑด์„ ๋ชป ์ฐพ์•˜์„ ๋•Œ, "ํ…Œ์ด๋ธ”์ด 27000๊ฐœ๊ฐ€ ๋„˜์„ ๋ฆฌ ์—†๋‹ค"๋Š” ์ „์ œ๋ฅผ ์„ธ์šฐ๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜ค๋… ์ชฝ์œผ๋กœ ๋ฐฉํ–ฅ์„ ํ‹€์—ˆ๋˜ ๊ฒŒ ๋‘ ์„ธ์…˜์„ ๋‚ ๋ฆฐ ๊ทผ๋ณธ ์›์ธ์ด์—ˆ๋‹ค. ํŒŒ์ผ์—์„œ ์ง์ ‘ ๋๊นŒ์ง€ ์ฝ์–ด๋ณด๋Š” ๋ฐ๋Š” ๋ช‡ ์ดˆ๋„ ์•ˆ ๊ฑธ๋ฆฐ๋‹ค โ€” ๊ฒ€์ฆ ๋น„์šฉ์ด ์ด๋ ‡๊ฒŒ ๋‚ฎ์„ ๋• ๊ฐ์œผ๋กœ ํŒ๋‹จ์„ ๋‚ด๋ฆด ์ด์œ ๊ฐ€ ์—†๋‹ค.
  • ๋ˆ„์‚ฐ ๋ฃจํ”„๊ฐ€ ์•„๋ฌด๋ฆฌ ๊ธธ์–ด๋„, ๊ฐ ํ•ญ์˜ ๊ณ„์ˆ˜๊ฐ€ ์ž…๋ ฅ๊ณผ ๋ฌด๊ด€ํ•œ ์ƒ์ˆ˜๋ผ๋ฉด ์ „์ฒด๋Š” ์„ ํ˜•์ด๋‹ค. "๋ณต์žกํ•ด ๋ณด์ด๋Š” ๋ฐ˜๋ณต๋ฌธ"๊ณผ "์‹ค์ œ๋กœ ๋ณต์žกํ•œ ๋ฌธ์ œ"๋Š” ๋‹ค๋ฅด๋‹ค. 27455๋ฒˆ ๋ฐ˜๋ณต์ด๋ผ๋Š” ์ˆซ์ž ์ž์ฒด์— ๊ฒ๋จน์ง€ ์•Š๊ณ  ๊ฐ ํ•ญ์˜ ๊ตฌ์กฐ(f3 * input[f1] * table3[f2]์—์„œ input์„ ๋บ€ ๋‚˜๋จธ์ง€๊ฐ€ ์ „๋ถ€ ์ƒ์ˆ˜)๋ฅผ ์งš์–ด๋‚ด๋ฉด, ๋ฌธ์ œ๋Š” ์ˆœ์‹๊ฐ„์— ํ‘œ์ค€ ์„ ํ˜•๋Œ€์ˆ˜๋กœ ํ™˜์›๋œ๋‹ค. ์ด๋Ÿฐ ํŒจํ„ด์€ ๋‹คํ•ญ์‹ ํ‰๊ฐ€, ์ฒดํฌ์„ฌ, ํ•ด์‹œ๋ฅ˜ ๊ฒ€์ฆ๊ธฐ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค โ€” "๊ฐ’์„ ๋ˆ„์ ํ•œ๋‹ค"๋Š” ๊ฒƒ๊ณผ "๊ทธ ๋ˆ„์ ์ด ์ž…๋ ฅ์— ๋Œ€ํ•ด ๋น„์„ ํ˜•์ด๋‹ค"๋Š” ๊ฒƒ์€ ๋ณ„๊ฐœ์˜ ์ด์•ผ๊ธฐ๋‹ค.
  • ์ž์œ ๋„๊ฐ€ ๋‚จ๋Š” ์‹œ์Šคํ…œ์—์„œ๋Š” "๊ฒ€์ฆ๋˜์ง€ ์•Š๋Š” ๋ฐ”์ดํŠธ"๊ฐ€ ์–ด๋””์ธ์ง€๋ถ€ํ„ฐ ํ™•์ธํ•˜๋Š” ๊ฒŒ ๋น ๋ฅด๋‹ค. ๋žญํฌ๊ฐ€ ๋ฏธ์ง€์ˆ˜ ๊ฐœ์ˆ˜๋ณด๋‹ค ํ•˜๋‚˜ ์ž‘์„ ๋•Œ, ๊ทธ ์ž์œ ๋ณ€์ˆ˜๊ฐ€ ์ •ํ™•ํžˆ ์–ด๋–ค ์ž…๋ ฅ ๋ฐ”์ดํŠธ์— ๋Œ€์‘ํ•˜๋Š”์ง€ ๋ณด๋ฉด(์ด๋ฒˆ์—” input[38]) ๊ทธ ๋ฐ”์ดํŠธ๊ฐ€ ๊ฒ€์ฆ ๋กœ์ง์—์„œ ์™„์ „ํžˆ ๋ฐฐ์ œ๋๋‹ค๋Š” ๊ฑธ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค โ€” ์ž„์˜๊ฐ’์„ ๋„ฃ์–ด๋„ ๋˜๋Š” ์ด์œ ๋ฅผ ์ถ”์ธกํ•  ํ•„์š” ์—†์ด ์‹œ์Šคํ…œ์ด ์Šค์Šค๋กœ ์•Œ๋ ค์ค€๋‹ค.
  • GDB๋กœ ์‹ค์ธกํ•˜๋Š” ์Šต๊ด€์€ ์ข‹์ง€๋งŒ, ๋น„๊ต ๋Œ€์ƒ์ด ๋˜๋Š” "์˜ˆ์ธก ๋ชจ๋ธ" ์ž์ฒด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ๋ถˆ์ผ์น˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ฆ๋ช…ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ๋™์•ˆ์€ GDB ์‹ค์ธก๊ณผ ์˜ˆ์ธก์˜ ๋ถˆ์ผ์น˜๋ฅผ "์ •์ ๋ถ„์„์ด ํ‹€๋ ธ๋‹ค"๋Š” ํ™•์ฆ์œผ๋กœ ์‚ผ์•˜๋Š”๋ฐ, ์‚ฌ์‹ค ์˜ˆ์ธก ๋ชจ๋ธ์ด ์• ์ดˆ์— ๋ฃจํ”„ ๊ธธ์ด๋ฅผ ์ž˜๋ชป ๊ฐ€์ •ํ•œ ์ฑ„๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋‹ˆ ์•ˆ ๋งž๋Š” ๊ฒŒ ๋‹น์—ฐํ–ˆ๋‹ค. ๋™์  ๊ฒ€์ฆ์€ "์ด ๋ชจ๋ธ์ด ๋งž๋Š”์ง€"๋ฅผ ํ™•์ธํ•˜๋Š” ๋„๊ตฌ์ง€, ๋ชจ๋ธ์˜ ์ „์ œ ์ž์ฒด๊ฐ€ ์ž˜๋ชป๋์„ ๋•Œ ์›์ธ์„ ์•Œ๋ ค์ฃผ๋Š” ๋„๊ตฌ๋Š” ์•„๋‹ˆ๋‹ค.

๋ฐฉ์–ด์ž ๊ด€์ ์—์„œ ๋ณด๋ฉด, ์ด๋Ÿฐ "ํ‘œ๋ฉด์ ์œผ๋กœ๋Š” ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์„ ํ˜•์ธ" ๊ฒ€์ฆ ๋กœ์ง์€ ๋ฆฌ๋ฒ„์‹ฑ ๋‚œ์ด๋„๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๋ฐ ๊ทธ๋‹ค์ง€ ํšจ๊ณผ์ ์ด์ง€ ์•Š๋‹ค. ์ง„์งœ ๋น„์„ ํ˜•์„ฑ(S-box, ๋ผ์šด๋“œ ํ•จ์ˆ˜์˜ ๋น„ํŠธ์—ฐ์‚ฐ, ์กฐ๊ฑด ๋ถ„๊ธฐ์— ๋”ฐ๋ฅธ ๊ฒฝ๋กœ ๋‹ค์–‘ํ™”)์ด ์„ž์ด์ง€ ์•Š๋Š” ํ•œ, ์•„๋ฌด๋ฆฌ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ๋Š˜๋ ค๋„ ์„ ํ˜•๋Œ€์ˆ˜ ํ•œ ๋ฐฉ์œผ๋กœ ํ’€๋ฆฌ๋Š” ๊ตฌ์กฐ๋ผ๋Š” ๊ฑธ ์ด๋ฒˆ ๋ฌธ์ œ๊ฐ€ ์ž˜ ๋ณด์—ฌ์ค€๋‹ค.

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‡ Gold 3] 42๋งŒ ์ค„์งœ๋ฆฌ XOR ์ง€์˜ฅ์ด ์‚ฌ์‹ค์€ ํ–‰๋ ฌ ํ•œ ์žฅ โ€” DreamHack XOR Disaster ํ’€์ด
blog

[๐Ÿฅ‡ Gold 3] 42๋งŒ ์ค„์งœ๋ฆฌ XOR ์ง€์˜ฅ์ด ์‚ฌ์‹ค์€ ํ–‰๋ ฌ ํ•œ ์žฅ โ€” DreamHack XOR Disaster ํ’€์ด

15MB์งœ๋ฆฌ disaster.py ์•ˆ์— ์‹œํ”„ํŠธยทXOR ์—ฐ์‚ฐ์ด 320,000์ค„ ํฉ๋ฟŒ๋ ค์ ธ ์žˆ๊ณ  ํ•จ์ˆ˜ 32๊ฐœ๊ฐ€ ๊ฐ๊ฐ 8๋น„ํŠธ๋งŒ ๋Œ๋ ค์ค€๋‹ค. ์„ธ ์—ฐ์‚ฐ ๋ชจ๋‘ ์ž๋ฆฌ์˜ฌ๋ฆผ์ด ์—†์–ด GF(2) ์œ„์—์„œ ์„ ํ˜•์ด๋ผ, ์ „์ฒด๊ฐ€ f(v) = Aยทv + c ๋ผ๋Š” ์•„ํ•€์‚ฌ์ƒ ํ•˜๋‚˜๋กœ ์ ‘ํžŒ๋‹ค. f(0)์œผ๋กœ ์ƒ์ˆ˜๋ฅผ, f(e_i)๋กœ ์—ด๋ฒกํ„ฐ๋ฅผ ๋ฝ‘์•„ 257๋ฒˆ ํ˜ธ์ถœ๋งŒ์— 256ร—256 ํ–‰๋ ฌ์„ ๋ณต์›ํ•˜๊ณ  ๊ฐ€์šฐ์Šค ์†Œ๊ฑฐ ํ•œ ๋ฒˆ์œผ๋กœ ๋๋‚ฌ๋‹ค.
#dreamhack#ctf#crypto+7
2026-08-22#dreamhack +4
[๐Ÿฅ‡ Gold 2] .rela.tivity โ€” ์žฌ๋ฐฐ์น˜ ํ…Œ์ด๋ธ”์ด ๊ณง ์•”ํ˜ธ๋ฌธ์ด์—ˆ๋‹ค, DreamHack Theori of Relativity ํ’€์ด (2๋ฒˆ ๋ณด๋ฅ˜ ๋์— ํ•ด๊ฒฐ)
blog

[๐Ÿฅ‡ Gold 2] .rela.tivity โ€” ์žฌ๋ฐฐ์น˜ ํ…Œ์ด๋ธ”์ด ๊ณง ์•”ํ˜ธ๋ฌธ์ด์—ˆ๋‹ค, DreamHack Theori of Relativity ํ’€์ด (2๋ฒˆ ๋ณด๋ฅ˜ ๋์— ํ•ด๊ฒฐ)

ํ‚ค ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•˜๋ฉด ๋งž๋Š”์ง€ ํ‹€๋ ธ๋Š”์ง€๋งŒ ์•Œ๋ ค์ฃผ๋Š” ์งง์€ ๋ฆฌ๋ฒ„์‹ฑ ๋ฌธ์ œ. ๊ฒ€์ฆ์— ์“ฐ์ด๋Š” 104๋ฐ”์ดํŠธ "ํ‚ค ๋ธ”๋ก"์ด ํŒŒ์ผ์— ์ ํžŒ ๊ฐ’๊ณผ ์‹คํ–‰ ์ค‘์ธ ๊ฐ’์ด ์™„์ „ํžˆ ๋‹ค๋ฅธ๋ฐ, ๊ทธ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜๋ฅผ ์•„๋ฌด๋ฆฌ ์ฐพ์•„๋„ ์•ˆ ๋‚˜์˜จ๋‹ค โ€” ์ง€๋‚œ ๋‘ ์„ธ์…˜์€ ์—ฌ๊ธฐ์„œ ๋ง‰ํ˜”๋‹ค. ์ง„์งœ ๋ฒ”์ธ์€ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ".rela.tivity"๋ผ๋Š” ์ด๋ฆ„์˜ ๊ฐ€์งœ ์žฌ๋ฐฐ์น˜ ์„น์…˜๊ณผ ๊ทธ๊ฑธ ์ง„์งœ๋กœ ์ฒ˜๋ฆฌํ•ด๋ฒ„๋ฆฌ๋Š” ELF ๋กœ๋” ์ž์‹ ์ด์—ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰ ๊ด€๋ฌธ์—์„œ๋Š” "๋””๋ฒ„๊ฑฐ๋กœ ๊ด€์ฐฐํ•˜๋Š” ํ–‰์œ„ ์ž์ฒด๊ฐ€ ๊ด€์ฐฐ ๋Œ€์ƒ์„ ๋ฐ”๊ฟ”๋ฒ„๋ฆฌ๋Š”" ์ง„์งœ ๋ฌผ๋ฆฌํ•™ ๋†๋‹ด ๊ฐ™์€ ํ•จ์ •๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค.
#dreamhack#ctf#reversing+5
2026-07-21#dreamhack +3
[๐Ÿฅˆ Silver 4] 10ยฒยฒ๋…„์งœ๋ฆฌ ์ž ์„ 0.3์ดˆ๋กœ ์ค„์ด๊ธฐ โ€” DreamHack Long Sleep ํ’€์ด (2๋ฒˆ ๋ณด๋ฅ˜ ๋์— ํ•ด๊ฒฐ)
blog

[๐Ÿฅˆ Silver 4] 10ยฒยฒ๋…„์งœ๋ฆฌ ์ž ์„ 0.3์ดˆ๋กœ ์ค„์ด๊ธฐ โ€” DreamHack Long Sleep ํ’€์ด (2๋ฒˆ ๋ณด๋ฅ˜ ๋์— ํ•ด๊ฒฐ)

์‹คํ–‰ํ•˜๋ฉด "flag๋ฅผ ์ƒ์„ฑ ์ค‘"์ด๋ผ๋ฉฐ ๋œธ์„ ๋“ค์ด๋‹ค๊ฐ€ ์ ์  ๋” ๊ธธ๊ฒŒ ์ž ๋“œ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ. sleep()์ด ์•„๋‹ˆ๋ผ libc ์‹ฌ๋ณผ๋„ ์—†๋Š” raw syscall์ด๋ผ LD_PRELOAD ํ›„ํ‚น์ด ์•ˆ ํ†ตํ•˜๊ณ , ํŒŒ์ผ์„ ํŒจ์น˜ํ•˜๊ฑฐ๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๋ฅผ ๊ฑธ๋ฉด ๊ณง๋ฐ”๋กœ "integrity_check(): file has been corrupted"๊ฐ€ ๋œฌ๋‹ค. ์ง€๋‚œ ๋‘ ์„ธ์…˜์€ ์ด ๋‘ ๋ฐฉ์–ด๊ฐ€ ์„œ๋กœ "๊ฐ™์€ ๊ฒƒ"์„ ๊ฒ€์‚ฌํ•œ๋‹ค๊ณ  ์ฐฉ๊ฐํ•ด ๋ง‰ํ˜”๋‹ค. ์‚ฌ์‹ค์€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋‘ ์ธต์ด์—ˆ๋‹ค โ€” ํ•˜๋‚˜๋Š” ์ฝ”๋“œ ๋ฐ”์ดํŠธ ์ž์ฒด์˜ ๋ฌด๊ฒฐ์„ฑ, ํ•˜๋‚˜๋Š” ๊ทธ์ € ์‹คํ–‰ ์†๋„. ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  syscall ์ธ์ž๊ฐ’๋งŒ ๋ฐ”๊พธ๋ฉด ๋‘ ๋ฐฉ์–ด ๋‹ค ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ง€๋‚˜๊ฐ„๋‹ค.
#dreamhack#ctf#reversing+4
2026-07-21#dreamhack +3