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

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

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

ํ‚ค ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•˜๋ฉด ๋งž๋Š”์ง€ ํ‹€๋ ธ๋Š”์ง€๋งŒ ์•Œ๋ ค์ฃผ๋Š” ์งง์€ ๋ฆฌ๋ฒ„์‹ฑ ๋ฌธ์ œ. ๊ฒ€์ฆ์— ์“ฐ์ด๋Š” 104๋ฐ”์ดํŠธ "ํ‚ค ๋ธ”๋ก"์ด ํŒŒ์ผ์— ์ ํžŒ ๊ฐ’๊ณผ ์‹คํ–‰ ์ค‘์ธ ๊ฐ’์ด ์™„์ „ํžˆ ๋‹ค๋ฅธ๋ฐ, ๊ทธ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜๋ฅผ ์•„๋ฌด๋ฆฌ ์ฐพ์•„๋„ ์•ˆ ๋‚˜์˜จ๋‹ค โ€” ์ง€๋‚œ ๋‘ ์„ธ์…˜์€ ์—ฌ๊ธฐ์„œ ๋ง‰ํ˜”๋‹ค. ์ง„์งœ ๋ฒ”์ธ์€ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ".rela.tivity"๋ผ๋Š” ์ด๋ฆ„์˜ ๊ฐ€์งœ ์žฌ๋ฐฐ์น˜ ์„น์…˜๊ณผ ๊ทธ๊ฑธ ์ง„์งœ๋กœ ์ฒ˜๋ฆฌํ•ด๋ฒ„๋ฆฌ๋Š” ELF ๋กœ๋” ์ž์‹ ์ด์—ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰ ๊ด€๋ฌธ์—์„œ๋Š” "๋””๋ฒ„๊ฑฐ๋กœ ๊ด€์ฐฐํ•˜๋Š” ํ–‰์œ„ ์ž์ฒด๊ฐ€ ๊ด€์ฐฐ ๋Œ€์ƒ์„ ๋ฐ”๊ฟ”๋ฒ„๋ฆฌ๋Š”" ์ง„์งœ ๋ฌผ๋ฆฌํ•™ ๋†๋‹ด ๊ฐ™์€ ํ•จ์ •๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค.

๋ฌธ์ œ: DreamHack โ€” Theori of Relativity ๋ถ„๋ฅ˜: Reversing ๋‚œ์ด๋„: ๐Ÿฅ‡ Gold 2 FLAG: DH{1d459fbdd85803e8223c2a11604dac728aceaffbc454aedce56b1a8d4e063360}

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


๋ฌธ์ œ ๊ฐœ์š”

file/checksec๋กœ ๊ธฐ๋ณธ ์ •๋ณด๋ถ€ํ„ฐ ํ™•์ธํ–ˆ๋‹ค. PIE, Full RELRO, ์นด๋‚˜๋ฆฌ, NX๊ฐ€ ์ผœ์ง„ ํ”ํ•œ ์กฐํ•ฉ์˜ ์ž‘์€ ๋ฐ”์ด๋„ˆ๋ฆฌ๋‹ค. ์‹คํ–‰ํ•˜๋ฉด ํ‚ค๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  ๋งž์•˜๋Š”์ง€ ํ‹€๋ ธ๋Š”์ง€๋งŒ ์•Œ๋ ค์ค€๋‹ค.

file, checksec ์‹คํ–‰ ๊ฒฐ๊ณผ โ€” relativity๋Š” PIE/Full RELRO/Canary/NX๊ฐ€ ์ผœ์ง„ stripped ๋ฐ”์ด๋„ˆ๋ฆฌ

objdump๋กœ ํ๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€๋ฉด ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํ•˜๋‹ค. main์ด fgets๋กœ ์ตœ๋Œ€ 100๋ฐ”์ดํŠธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  ๊ฐœํ–‰์„ ์ œ๊ฑฐํ•œ ๋’ค, ๊ฒ€์ฆ ํ•จ์ˆ˜ ํ•˜๋‚˜๋ฅผ rdi=&0x6020(์–ด๋–ค 104๋ฐ”์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ์‹œ์ž‘), rsi=์‚ฌ์šฉ์ž ์ž…๋ ฅ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์ด ์ฐธ์ด๋ฉด "Congrats! Flag is DH{%s} ...if you didn't cheat!"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฌธ์ œ๋Š” 0x6020์ด๋ผ๋Š” ์ฃผ์†Œ๋‹ค. ์ด ์ฃผ์†Œ๋Š” .data ์„น์…˜ ์•ˆ์— ์žˆ๋Š”๋ฐ, ํŒŒ์ผ์— ์ €์žฅ๋œ ์›๋ณธ ๋ฐ”์ดํŠธ์™€ ์‹ค์ œ ์‹คํ–‰ ์ค‘์ธ ๊ฐ’์ด ์ „ํ˜€ ๋‹ค๋ฅด๋‹ค. ์ง€๋‚œ๋ฒˆ์—๋Š” ์ด ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ .init_array์— ๋“ฑ๋ก๋œ ์ƒ์„ฑ์ž ๋‘ ๊ฐœ(๋’ค์—์„œ ๋‹ค์‹œ ๋‚˜์˜จ๋‹ค) ์•ˆ์—์„œ ์ฐพ์œผ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ๋๋‚ด ๋ชป ์ฐพ์•˜๋‹ค.


โ–ถ๐Ÿ•ณ๏ธ ์‚ฝ์งˆ โ€” ์ง€๋‚œ ๋‘ ์„ธ์…˜, '๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜'๋ฅผ ์ฐพ๋‹ค๊ฐ€ ๋ชป ์ฐพ๊ณ  ๋ณด๋ฅ˜ํ–ˆ๋‹ค

์ง€๋‚œ๋ฒˆ ๊ธฐ๋ก์„ ๋‹ค์‹œ ์ฝ์–ด๋ณด๋ฉด, ๋‘ ๊ฐ€์ง€๋ฅผ ์ด๋ฏธ ์ •ํ™•ํžˆ ์•Œ์•„๋‚ธ ์ƒํƒœ์˜€๋‹ค.

  1. .init_array์— ๋“ฑ๋ก๋œ ํ•จ์ˆ˜ ํ•˜๋‚˜๊ฐ€ ptrace(PTRACE_TRACEME, 0, 0, 0)์„ ํ˜ธ์ถœํ•ด์„œ, ์‹คํŒจ(๋””๋ฒ„๊ฑฐ๊ฐ€ ๋ถ™์–ด์žˆ๊ฑฐ๋‚˜ ์ด ์ƒŒ๋“œ๋ฐ•์Šค์˜ ์•Œ ์ˆ˜ ์—†๋Š” ์ œ์•ฝ์œผ๋กœ EPERM)ํ•˜๋ฉด 0x6020 ์ฃผ์†Œ์˜ 1๋ฐ”์ดํŠธ์— +1์„, ์„ฑ๊ณตํ•˜๋ฉด -1์„ ํ•œ๋‹ค.
  2. ๋˜ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๊ฐ€ ์„ธ ํ•จ์ˆ˜(์ž๊ธฐ ์ž์‹  ํฌํ•จ)์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ํ›‘์–ด์„œ 0xCC(์†Œํ”„ํŠธ์›จ์–ด ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ)๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ๊ณ , ์žˆ์œผ๋ฉด ๊ทธ 1๋ฐ”์ดํŠธ์— +2, ๊นจ๋—ํ•˜๋ฉด -2๋ฅผ ํ•œ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€๋Š” ์ •ํ™•ํ–ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ทธ๋‹ค์Œ์ด์—ˆ๋‹ค โ€” gdb๋กœ 0x6020๋ถ€ํ„ฐ 32๋ฐ”์ดํŠธ๋ฅผ ํŒŒ์ผ ์›๋ณธ๊ณผ ๋Œ€์กฐํ•ด๋ณด๋‹ˆ, 1๋ฐ”์ดํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ธ”๋ก ์ „์ฒด๊ฐ€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฐ”๋€Œ์–ด ์žˆ์—ˆ๋‹ค. ๋‘ ์ƒ์„ฑ์ž๋Š” ๋ถ„๋ช… ๋”ฑ 1๋ฐ”์ดํŠธ๋งŒ ยฑ1/ยฑ2 ํ•˜๋Š” ์ฝ”๋“œ์ธ๋ฐ, 104๋ฐ”์ดํŠธ ์ „์ฒด๊ฐ€ ์Šคํฌ๋žจ๋ธ”๋ผ ์žˆ๋‹ค๋Š” ๊ฑด ์ด ๋‘ ํ•จ์ˆ˜ ๋ง๊ณ  ์ œ3์˜ ๋กœ์ง์ด ์žˆ๋‹ค๋Š” ๋œป์ด์—ˆ๋‹ค. .init_array๋ฅผ ๋‹ค์‹œ ํ›‘๊ณ , objdump ์ „์ฒด๋ฅผ ๋‹ค์‹œ ์ฝ๊ณ , ๊ฒ€์ฆ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ๋ณตํ˜ธํ™” ์Šคํ…์ด ์„ž์—ฌ ์žˆ๋Š”์ง€๋„ ํ™•์ธํ–ˆ์ง€๋งŒ ๋๋‚ด ๊ทธ๋Ÿฐ ์ฝ”๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค. "๋„คํŠธ ์กฐ์ •๊ฐ’์ด 0์ผ ๊ฒƒ"์ด๋ผ๋Š” ์ถ”์ธก์œผ๋กœ ๋งŒ๋“  ํ›„๋ณด flag(with_LOVE_from_Dreamhack_:))๋„ ๊ทธ๋Ÿด๋“ฏํ•œ ์˜์–ด ๋ฌธ๊ตฌ์˜€์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์˜ค๋‹ต์ด์—ˆ๋‹ค.

์ด๋ฒˆ์— ๋‹ค์‹œ ํŒŒ์ผ์„ ์—ด์–ด๋ณด๊ณ  ๋‚˜์„œ์•ผ ๋†“์ณค๋˜ ๋ถ€๋ถ„์„ ์ฐพ์•˜๋‹ค. readelf -S๋กœ ์„น์…˜ ๋ชฉ๋ก์„ ์ญ‰ ํ›‘๋‹ค๊ฐ€ ๋‚ฏ์„  ์ด๋ฆ„ ํ•˜๋‚˜๊ฐ€ ๋ˆˆ์— ๋„์—ˆ๋‹ค โ€” .rela.tivity. "Theori of Relativity"๋ผ๋Š” ๋ฌธ์ œ ์ œ๋ชฉ์˜ ๋ง์žฅ๋‚œ์ด ์„น์…˜ ์ด๋ฆ„์—๋„ ๊ทธ๋Œ€๋กœ ๋ฐ•ํ˜€ ์žˆ์—ˆ๋‹ค.

readelf -S ๋กœ ํ™•์ธํ•œ .rela.dyn๊ณผ .rela.tivity ๋‘ ์„น์…˜ โ€” .rela.tivity๋Š” ํฌ๊ธฐ 0x2580(400๊ฐœ ํ•ญ๋ชฉ)์— WA(์“ฐ๊ธฐ+๋กœ๋“œ) ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ถ™์–ด์žˆ๊ณ , readelf -d์˜ DT_RELASZ๊ฐ€ 9864๋ฐ”์ดํŠธ๋กœ ๋‘ ์„น์…˜ ํฌ๊ธฐ์˜ ํ•ฉ๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•จ์„ ๋ณด์—ฌ์คŒ

์ •์ƒ์ ์ธ ELF๋ผ๋ฉด ์žฌ๋ฐฐ์น˜ ํ…Œ์ด๋ธ”(RELA ํƒ€์ž…)์€ ์ฝ๊ธฐ ์ „์šฉ์ด๊ณ , ์‹คํ–‰์— ํ•„์š”ํ•œ ๊ฐœ์ˆ˜๋งŒํผ๋งŒ ์žˆ์–ด์•ผ ํ•œ๋‹ค. .rela.tivity๋Š” 400๊ฐœ(!)์˜ ํ•ญ๋ชฉ์„ ๋‹ด๊ณ  ์žˆ๊ณ  WA(์“ฐ๊ธฐ ๊ฐ€๋Šฅ+๋กœ๋“œ๋จ) ํ”Œ๋ž˜๊ทธ๊นŒ์ง€ ๋ถ™์–ด ์žˆ๋‹ค โ€” ์ „ํ˜•์ ์ด์ง€ ์•Š๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ์ •์ ์ธ ๋‹จ์„œ๋Š” .dynamic ์„ธ๊ทธ๋จผํŠธ์˜ DT_RELASZ ๊ฐ’์ด์—ˆ๋‹ค. 9864๋ฐ”์ดํŠธ โ€” ์ด๊ฑด .rela.dyn(264๋ฐ”์ดํŠธ, ์ง„์งœ ์žฌ๋ฐฐ์น˜ 11๊ฐœ)๊ณผ .rela.tivity(9600๋ฐ”์ดํŠธ, 400๊ฐœ)๋ฅผ ๋”ํ•œ ๊ฐ’๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค. ์ฆ‰ ๋™์  ๋ง์ปค(ld.so)๋Š” ์ด ๋‘˜์„ ํ•˜๋‚˜๋กœ ์ด์–ด์ง„ ์žฌ๋ฐฐ์น˜ ํ…Œ์ด๋ธ”๋กœ ์ธ์‹ํ•˜๊ณ , .rela.tivity์˜ 400๊ฐœ ํ•ญ๋ชฉ๊นŒ์ง€ ์ „๋ถ€ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

์ง€๋‚œ ๋‘ ์„ธ์…˜์ด ์ฐพ์•„ ํ—ค๋งธ๋˜ "104๋ฐ”์ดํŠธ๋ฅผ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ"๋Š” ์• ์ดˆ์— ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค โ€” ๋ฐ”๊พธ๋Š” ์ฃผ์ฒด๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๊ธฐ๋„ ์ „์— ๋™์ž‘ํ•˜๋Š” ๋™์  ๋ง์ปค ์ž์‹ ์ด์—ˆ๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ 1 โ€” ๋กœ๋”๊ฐ€ ์‹คํ–‰๋˜๊ธฐ๋„ ์ „์— ์ด๋ฏธ "์•”ํ˜ธํ™”"๊ฐ€ ๋๋‚˜ ์žˆ๋‹ค

์ด ๊ฐ€์„ค์„ ์ง์ ‘ ํ™•์ธํ•ด๋ดค๋‹ค. gdb๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์ง„์ž…์ (.init_array ์ƒ์„ฑ์ž๋“ค์ด ์‹คํ–‰๋˜๊ธฐ ์ „, ์‚ฌ์‹ค์ƒ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ง€์ )์— ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๋ฅผ ๊ฑธ๊ณ , ๊ทธ ์‹œ์ ์˜ 0x6020 ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํŒŒ์ผ ์›๋ณธ๊ณผ ๋‚˜๋ž€ํžˆ ๋น„๊ตํ–ˆ๋‹ค.

ํŒŒ์ผ์— ์ €์žฅ๋œ 0x6020์˜ ์›๋ณธ ๋ฐ”์ดํŠธ(77 68 70 5f 4f 33 2b 25...)์™€, gdb๋กœ ์ง„์ž…์ ์—์„œ ๋ฉˆ์ถฐ ์ฝ์€ ๋Ÿฐํƒ€์ž„ ๊ฐ’(33 63 30 2c 29 4d 3e 33...)์ด ์™„์ „ํžˆ ๋‹ค๋ฆ„์„ ๋‚˜๋ž€ํžˆ ๋ณด์—ฌ์ฃผ๋Š” ์บก์ณ โ€” ์ด ์‹œ์ ์—” ์–ด๋–ค ์ƒ์„ฑ์ž๋„ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋‹ค

์ด ์‹œ์ ์—” .init_array์˜ ์–ด๋–ค ํ•จ์ˆ˜๋„ ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋Š”๋ฐ๋„ ๊ฐ’์ด ์ด๋ฏธ ๋ฐ”๋€Œ์–ด ์žˆ๋‹ค. ์ง€๋‚œ๋ฒˆ์—” ์•„๋ฌด๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋’ค์ ธ๋„ "๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜"๋ฅผ ๋ชป ์ฐพ์€ ๊ฒŒ ๋‹น์—ฐํ–ˆ๋‹ค โ€” ld.so๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์ „์—, ์žฌ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๋‹จ๊ณ„์—์„œ ์ด๋ฏธ ์ด ๋ธ”๋ก์„ ์ž์‹ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜(๊ฐ ํ•ญ๋ชฉ์˜ r_offset, r_addend๋ฅผ ์ด์šฉํ•œ ์œ„์น˜ ๊ณ„์‚ฐ)์œผ๋กœ ๋ฎ์–ด์จ๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค. ์ € 400๊ฐœ์˜ "๊ฐ€์งœ ์žฌ๋ฐฐ์น˜ ํ•ญ๋ชฉ"์ด ๋ฐ”๋กœ ์ด 104๋ฐ”์ดํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์•”ํ˜ธ๋ฌธ/ํ‚ค ์ŠคํŠธ๋ฆผ์ด์—ˆ๋˜ ์…ˆ์ด๋‹ค.

์ด ํŠธ๋ฆญ ์ž์ฒด๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์—ญ์‚ฐํ•ด์„œ ์™„์ „ํžˆ ์žฌํ˜„ํ•˜๋Š” ๊ฑด ์ƒ๋‹นํžˆ ์†์ด ๋งŽ์ด ๊ฐ€์ง€๋งŒ(๊ฐ R_X86_64_PC32 ํ•ญ๋ชฉ์˜ S+A-P ๊ณ„์‚ฐ์„ ํ•ญ๋ชฉ๋ณ„๋กœ ๋˜์งš์–ด์•ผ ํ•œ๋‹ค), ๋‹คํ–‰ํžˆ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†๋‹ค โ€” ld.so๊ฐ€ ์ด๋ฏธ ์ •ํ™•ํ•˜๊ฒŒ ๊ณ„์‚ฐํ•ด์ค€ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ฝ์œผ๋ฉด ๋œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ผ์€ ๊ทธ ์™„์„ฑ๋œ 104๋ฐ”์ดํŠธ๋ฅผ gdb๋กœ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ๋ฟ์ด๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ 2 โ€” ๊ฒ€์ฆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‚ฌ์‹ค "input[i] == b1[i]"๋กœ ์š”์•ฝ๋œ๋‹ค

๊ฒ€์ฆ ํ•จ์ˆ˜(main์ด ํ˜ธ์ถœํ•˜๋Š” ๊ณณ)๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ •๋…ํ–ˆ๋‹ค.

๊ฒ€์ฆ ํ•จ์ˆ˜๋ฅผ ์†์œผ๋กœ ์ฃผ์„ ๋‹จ ์บก์ณ โ€” key ๋ฐ”์ดํŠธ์™€ i์ œ๊ณฑ์„ ๋”ํ•ด b1 ์„ ๋งŒ๋“ค๊ณ , i ์˜ ํ™€์ง์— ๋”ฐ๋ผ ์ฐจ์ด๋‚˜ XOR ์„ 128๋น„ํŠธ ๋ˆ„์‚ฐํ•ฉ์— ๋”ํ•œ๋‹ค. ๋ชจ๋“  ํ•ญ์ด ์Œ์ด ์•„๋‹ˆ๋ผ ํ•ฉ์ด 0 ์ด๋ ค๋ฉด ํ•ญ๋งˆ๋‹ค 0 ์ด์–ด์•ผ ํ•˜๊ณ , ๊ฒฐ๊ตญ ์ž…๋ ฅ ๋ฐ”์ดํŠธ๊ฐ€ b1 ๊ณผ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒฐ๋ก ์œผ๋กœ ์ •๋ฆฌ๋œ๋‹ค

ํ•ต์‹ฌ์€ ์„ธ ๊ฐ€์ง€๋‹ค.

  1. b1 = (i*i + key[i]) & 0xff โ€” key[i]๋Š” ๋ฐฉ๊ธˆ ํ™•๋ณดํ•œ 104๋ฐ”์ดํŠธ ๋ธ”๋ก์˜ i๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋‹ค.
  2. ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค i๊ฐ€ ์ง์ˆ˜๋ฉด (b1 - input[i]) & 0xff๋ฅผ, ํ™€์ˆ˜๋ฉด b1 ^ input[i]๋ฅผ 128๋น„ํŠธ ๋ˆ„์‚ฐํ•ฉ์— ๋”ํ•œ๋‹ค. ๋‘ ์—ฐ์‚ฐ ๋‹ค ๊ฒฐ๊ณผ๊ฐ€ 0์ด ๋˜๋Š” ์กฐ๊ฑด์€ ๋˜‘๊ฐ™๋‹ค โ€” input[i] == b1[i]. (๋บ„์…ˆ์ด 0์ด๋ ค๋ฉด ๋‘ ๊ฐ’์ด ๊ฐ™์•„์•ผ ํ•˜๊ณ , XOR์ด 0์ด๋ ค๋„ ๋‘ ๊ฐ’์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค.)
  3. popcnt(b1) == 0(์ฆ‰ b1์ด ์ •ํ™•ํžˆ 0)์ด ๋˜๋Š” ์ˆœ๊ฐ„ ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค. ์ด๋•Œ๋Š” input[i]๋ฅผ ๋น„๊ตํ•˜๋Š” ๋Œ€์‹  popcnt(input[i])๋ฅผ ๊ทธ๋Œ€๋กœ ๋”ํ•œ๋‹ค โ€” ์ด๊ฒŒ 0์ด ๋˜๋ ค๋ฉด input[i]๊ฐ€ ์ •ํ™•ํžˆ 0x00์ด์–ด์•ผ ํ•œ๋‹ค.

๋ˆ„์‚ฐํ•ฉ์— ๋“ค์–ด๊ฐ€๋Š” ๋ชจ๋“  ํ•ญ์ด ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์—†๋Š” ๋ฐ”์ดํŠธ๊ฐ’์ด๋ผ๋Š” ๊ฒŒ ๊ฒฐ์ •์ ์ด๋‹ค. ์ตœ์ข… ํŒ์ •์€ "๋ˆ„์‚ฐํ•ฉ์ด ์ •ํ™•ํžˆ 0์ธ๊ฐ€"์ด๋ฏ€๋กœ, ๋”ํ•ด์ง„ ๋ชจ๋“  ํ•ญ์ด ์˜ˆ์™ธ ์—†์ด 0์ด์–ด์•ผ๋งŒ ํ†ต๊ณผํ•œ๋‹ค. ์ •๋ฆฌํ•˜๋ฉด: b1์ด 0์ด ์•„๋‹Œ ๋ชจ๋“  ์œ„์น˜์—์„œ๋Š” ์ž…๋ ฅ ๋ฌธ์ž๊ฐ€ b1๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์•„์•ผ ํ•˜๊ณ , b1์ด ์ฒ˜์Œ์œผ๋กœ 0์ด ๋˜๋Š” ์œ„์น˜์—์„œ๋Š” ์ž…๋ ฅ์ด ์ •ํ™•ํžˆ ๋„ ๋ฐ”์ดํŠธ์—ฌ์•ผ ํ•œ๋‹ค โ€” ์ด๊ฑด fgets + strcspn์œผ๋กœ ๊ฐœํ–‰์„ ์ œ๊ฑฐํ•œ ๋ฌธ์ž์—ด์˜ **์ž์—ฐ์Šค๋Ÿฌ์šด ๋(๋„ ์ข…๋‹จ์ž)**๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ์ž๋ฆฌ๋‹ค. ์ฆ‰ flag์˜ ๊ธธ์ด ์ž์ฒด๊ฐ€ ํ‚ค ์ŠคํŠธ๋ฆผ์— ์˜ํ•ด ๊ฒฐ์ •๋˜๊ณ , flag ๋‚ด์šฉ์€ ๊ทธ ๊ธธ์ด๋งŒํผ b1 ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋‚˜์—ดํ•œ ๊ฒƒ์ด๋‹ค.

์ „์ฒด ํ’€์ด ํ๋ฆ„ ๋‹ค์ด์–ด๊ทธ๋žจ โ€” ๊ฐ€์งœ .rela.tivity ์žฌ๋ฐฐ์น˜ ์„น์…˜๊ณผ ld.so์˜ ์ฒ˜๋ฆฌ, gdb entry ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๋กœ ํ™•๋ณดํ•œ ์žฌ๋ฐฐ์น˜ ๊ฒฐ๊ณผ๊ฐ’, ๊ฒ€์ฆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ input[i]==b1[i] ์š”์•ฝ, LD_PRELOAD๋กœ ptrace๋ฅผ ์•ˆ ๊ฑด๋“œ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰ 1๋ฐ”์ดํŠธ๋ฅผ ํ™•์ธํ•˜๋Š” ์šฐํšŒ๊นŒ์ง€ 4๋‹จ๊ณ„

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

gdb๋กœ ํ™•๋ณดํ•œ 104๋ฐ”์ดํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ํŒŒ์ด์ฌ์— ๋„ฃ๊ณ , ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ–ˆ๋‹ค.

key = open('/tmp/keyblock.bin', 'rb').read()   # gdb dump binary memory ๋กœ ํ™•๋ณดํ•œ 104๋ฐ”์ดํŠธ
flag = bytearray()
for i in range(len(key)):
    b1 = (i * i + key[i]) & 0xff
    if b1 == 0:
        break                     # ์—ฌ๊ธฐ๊ฐ€ ๊ณง flag ๊ธธ์ด
    flag.append(b1)

์ด ๊ฐ’์„ ๊ฒ€์ฆ ํ•จ์ˆ˜ ์•ˆ์—์„œ ํ•œ ์Šคํ…์”ฉ ์‹ค์ธกํ•˜๋ฉฐ ์ •ํ™•ํžˆ ๋งž๋Š”์ง€ ์ง์ ‘ ํ™•์ธํ–ˆ๋‹ค โ€” i๋งˆ๋‹ค key[i]๋กœ ๊ณ„์‚ฐํ•œ b1๊ณผ ์‹ค์ œ๋กœ main์ด ์ฝ์–ด๋“ค์ธ ์ž…๋ ฅ ๋ฐ”์ดํŠธ๊ฐ€ ๋งค ์ˆœ๊ฐ„ ์ผ์น˜ํ•˜๋Š”์ง€, ๋ฃจํ”„๊ฐ€ ์ •๋ง i=64์—์„œ ๋๋‚˜๋Š”์ง€๊นŒ์ง€.

gdb ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฒ€์ฆ ๋ฃจํ”„๋ฅผ ํ•œ ๋‹จ๊ณ„์”ฉ ์ถ”์ ํ•œ ๋กœ๊ทธ โ€” ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค ๊ณ„์‚ฐํ•œ b1๊ฐ’๊ณผ ์‹ค์ œ ์ž…๋ ฅ ๋ฐ”์ดํŠธ(ibyte)๊ฐ€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๊ณ , i=64์—์„œ key[64]=0์œผ๋กœ b1=0์ด ๋˜์–ด ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉฐ Congrats ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ flag๊ฐ€ ์ถœ๋ ฅ๋จ

์—ฌ๊ธฐ๊นŒ์ง€๋Š” ๋ฌธ์ œ์—†์ด ๋งž์•„๋–จ์–ด์กŒ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ํ๋ฆ„์œผ๋กœ ๋งŒ๋“  flag๋ฅผ gdb ์—†์ด ๊ทธ๋ƒฅ ํ„ฐ๋ฏธ๋„์—์„œ ์ง์ ‘ ์‹คํ–‰ํ–ˆ๋”๋‹ˆ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

์›์ธ์€ ๋ฐ”๋กœ ๊ทธ 1๋ฐ”์ดํŠธ์งœ๋ฆฌ ์นด์šดํ„ฐ(0x6020)์˜€๋‹ค โ€” ptrace(PTRACE_TRACEME)์˜ ์„ฑ๊ณต/์‹คํŒจ์— ๋”ฐ๋ผ ยฑ1์ด ๊ฐˆ๋ฆฌ๋Š” ๊ทธ ๊ฐ’์ด๋‹ค. gdb๋กœ ์‹คํ–‰ํ•˜๋ฉด gdb ์ž์‹ ์ด ์ด๋ฏธ ์ด ํ”„๋กœ์„ธ์Šค์˜ tracer์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค์‹œ PTRACE_TRACEME๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด "์ด๋ฏธ ์ถ”์  ์ค‘"์ด๋ผ๋Š” ์ด์œ ๋กœ ์‹คํŒจ(EPERM)ํ•œ๋‹ค โ€” ๋””๋ฒ„๊ฑฐ ์œ ๋ฌด์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ด ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ๊ด€์ฐฐ๋๋˜ "์ •์ฒด๋ถˆ๋ช…์˜ ptrace ์‹คํŒจ"๊ฐ€, ์‚ฌ์‹ค์€ gdb ์ž์‹ ์ด ๋งŒ๋“ค์–ด๋‚ธ ํ˜„์ƒ์ด์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ๋ฐ˜๋ฉด ์•„๋ฌด ๋„๊ตฌ๋„ ์—†์ด ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์‹คํ–‰ํ•˜๋ฉด PTRACE_TRACEME๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์„ฑ๊ณตํ•œ๋‹ค โ€” gdb๋กœ ๊ด€์ฐฐํ•œ ๊ฐ’๊ณผ ์‹ค์ œ "์•ผ์ƒ"์˜ ๊ฐ’์ด ๋‹ค๋ฅด๋‹ค๋Š” ๋œป์ด๋‹ค.

๋ฌธ์ œ๋Š” ์ด 1๋ฐ”์ดํŠธ๋ฅผ ptrace๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. strace๋„ ๊ฒฐ๊ตญ ptrace ๊ธฐ๋ฐ˜ ํŠธ๋ ˆ์ด์„œ๋ผ gdb์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ๋‹ค. ๋Œ€์‹  LD_PRELOAD๋กœ fgets๋งŒ ์‚ด์ง ๊ฐ€๋กœ์ฑ„๋Š” ์ž‘์€ ํ›…์„ ๋งŒ๋“ค์—ˆ๋‹ค โ€” ์ด๊ฑด ๋™์  ๋ง์ปค์˜ ์‹ฌ๋ณผ ๋ฐ”์ธ๋”ฉ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ผ ๋ฟ, ptrace ๊ด€๊ณ„๋ฅผ ์ „ํ˜€ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.

static char *(*real_fgets)(char*, int, FILE*) = NULL;
 
char *fgets(char *s, int n, FILE *stream) {
    if (!real_fgets) real_fgets = dlsym(RTLD_NEXT, "fgets");
    if (stream != stdin) return real_fgets(s, n, stream);
 
    FILE *maps = fopen("/proc/self/maps", "r");
    unsigned long base = 0;
    char line[512];
    while (real_fgets(line, sizeof(line), maps)) {
        if (strstr(line, "relativity") && base == 0) {
            sscanf(line, "%lx-", &base);
            break;
        }
    }
    fclose(maps);
    unsigned char *p = (unsigned char*)(base + 0x6020);
    fprintf(stderr, "[peek] base=%p byte0=0x%02x\n", (void*)base, p[0]);
    return real_fgets(s, n, stream);
}

main์ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ ค๊ณ  fgets(stdin, ...)์„ ํ˜ธ์ถœํ•˜๋Š” ์ˆœ๊ฐ„(์ด๋ฏธ ๋‘ ์ƒ์„ฑ์ž๊ฐ€ ๋‹ค ์‹คํ–‰๋˜๊ณ  ๋‚œ ๋’ค) ์ด ํ›…์ด ๋ผ์–ด๋“ค์–ด, /proc/self/maps๋กœ ์ž๊ธฐ ์ž์‹ ์˜ ๋กœ๋“œ ๋ฒ ์ด์Šค๋ฅผ ์•Œ์•„๋‚ธ ๋’ค 0x6020์˜ 1๋ฐ”์ดํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์›๋ž˜ fgets๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

LD_PRELOAD ํ›… ์†Œ์Šค์ฝ”๋“œ์™€, ๊ทธ ํ›…์„ ํ†ตํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ [peek] byte0=0x31 ์ด ์ถœ๋ ฅ๋˜๋Š” ์บก์ณ โ€” gdb๋กœ ๊ด€์ฐฐํ–ˆ์„ ๋•Œ์˜ 0x33๊ณผ ๋‹ค๋ฅธ ๊ฐ’

0x31. gdb๋กœ ๊ด€์ฐฐํ–ˆ์„ ๋•Œ์˜ 0x33๊ณผ ์ •ํ™•ํžˆ 2๋งŒํผ ๋‹ค๋ฅด๋‹ค โ€” +1(ptrace ์‹คํŒจ, gdb ํ™˜๊ฒฝ) ๋Œ€ -1(ptrace ์„ฑ๊ณต, ์ˆœ์ˆ˜ ํ™˜๊ฒฝ)์˜ ์ฐจ์ด๊ฐ€ ๊ทธ๋Œ€๋กœ ๋“œ๋Ÿฌ๋‚œ ๊ฒƒ์ด๋‹ค. ์ด ๊ฐ’์œผ๋กœ key[0]๋งŒ ๊ฐˆ์•„๋ผ์›Œ flag๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ–ˆ๋‹ค.

DH{1d459fbdd85803e8223c2a11604dac728aceaffbc454aedce56b1a8d4e063360}

์ด๋ฒˆ์—” ์–ด๋–ค ๋„๊ตฌ๋„ ์—†์ด, ์ˆœ์ˆ˜ํ•˜๊ฒŒ ํŒŒ์ผ์„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ด์„œ ์‹คํ–‰ํ–ˆ๋‹ค.

์•„๋ฌด ๋””๋ฒ„๊น… ๋„๊ตฌ ์—†์ด ์ˆœ์ˆ˜ํ•˜๊ฒŒ ./relativity < input.txt ๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ Congrats! Flag is DH{1d459fbdd85803e8223c2a11604dac728aceaffbc454aedce56b1a8d4e063360} ๊ฐ€ ์ถœ๋ ฅ๋จ

์„ธ ๋ฒˆ์„ ๋ฐ˜๋ณต ์‹คํ–‰ํ•ด๋„ ๋™์ผํ•˜๊ฒŒ ํ†ต๊ณผํ•˜๋Š” ๊ฑธ ํ™•์ธํ•œ ๋’ค ๋“œ๋ฆผํ•ต์— ์ œ์ถœํ•ด "์ •๋‹ต! ํ•ด๊ฒฐ ์ฒ˜๋ฆฌ๋จ"์œผ๋กœ ํ™•์ •๋๋‹ค.


๐Ÿ“ ๊ฒฐ๋ก 

์ด ๋ฌธ์ œ๊ฐ€ ๋‚จ๊ธด ๊ตํ›ˆ์€ ๋‘ ์ธต์œ„ ๋ชจ๋‘์—์„œ ํฅ๋ฏธ๋กœ์› ๋‹ค.

  • ์žฌ๋ฐฐ์น˜ ํ…Œ์ด๋ธ”์€ "์•ˆ์ „ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ"๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๊ธฐ๋„ ์ „์— ์ž„์˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฑ„์›Œ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ์‹คํ–‰ ์ง€์ ์ด๋‹ค. .dynamic์˜ DT_RELASZ๊ฐ€ ์–ด๋””๊นŒ์ง€๋ฅผ "์ง„์งœ" ์žฌ๋ฐฐ์น˜ ๋ฒ”์œ„๋กœ ์žก๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉด, ์ด๋Ÿฐ ์‹์œผ๋กœ ์ •์ƒ ์„น์…˜ ์˜†์— ์ด์–ด๋ถ™์ธ ๊ฐ€์งœ ์žฌ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑธ ๋†“์น˜๊ธฐ ์‰ฝ๋‹ค. ์ฝ”๋“œ์—์„œ "์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜"๋ฅผ ์•„๋ฌด๋ฆฌ ์ฐพ์•„๋„ ์•ˆ ๋‚˜์˜จ๋‹ค๋ฉด, ์• ์ดˆ์— ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋กœ๋” ๋‹จ๊ณ„๋ฅผ ์˜์‹ฌํ•ด๋ด์•ผ ํ•œ๋‹ค.
  • "์ฝ”๋“œ ์ž์ฒด๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ๊ด€์ฐฐํ•˜๋Š”" ์šฐํšŒ๋Š” ํŒŒ์ผ ์ •์  ๋ถ„์„๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค โ€” ์ด๋ฒˆ์—” ld.so๊ฐ€ ๊ณ„์‚ฐ์„ ๋Œ€์‹  ํ•ด์ฃผ๋Š” ๊ฒŒ ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. ์†์œผ๋กœ 400๊ฐœ ์žฌ๋ฐฐ์น˜ ํ•ญ๋ชฉ์˜ ์œ„์น˜ ์—ฐ์‚ฐ์„ ์ „๋ถ€ ์žฌํ˜„ํ•˜๋Š” ๋Œ€์‹ , gdb๋กœ "์ด๋ฏธ ๊ณ„์‚ฐ์ด ๋๋‚œ ์‹œ์ "์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฝ๋Š” ๊ฒŒ ํ›จ์”ฌ ์•ˆ์ „ํ•˜๊ณ  ๋นจ๋ž๋‹ค.
  • ptrace ๊ธฐ๋ฐ˜ ์•ˆํ‹ฐ๋””๋ฒ„๊ทธ๋ฅผ ๊ด€์ฐฐํ•  ๋•Œ, ๊ด€์ฐฐ ๋„๊ตฌ ์ž์‹ ์ด ์ด๋ฏธ ํ•˜๋‚˜์˜ ptrace ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ๊ธฐ ์‰ฝ๋‹ค. gdb๋„ strace๋„ ์ „๋ถ€ ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค์˜ tracer๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€์ƒ์ด ์Šค์Šค๋กœ PTRACE_TRACEME๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด "์ด๋ฏธ ์ถ”์ ๋˜๊ณ  ์žˆ๋‹ค"๋Š” ์ด์œ ๋กœ ์‹คํŒจํ•œ๋‹ค โ€” ์ด๊ฑด ์ฝ”๋“œ์— ๋ช…์‹œ๋œ "๋””๋ฒ„๊ฑฐ ํƒ์ง€" ๋กœ์ง์ด ์‹ค์ œ๋กœ ์ž‘๋™ํ•œ ๊ฒฐ๊ณผ์ด์ง€, ๊ด€์ฐฐ ๋ฐฉ๋ฒ•์˜ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์ฒ˜๋Ÿผ ๊ทธ ์„ฑ๊ณต/์‹คํŒจ๊ฐ€ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ’์— ์ง์ ‘ ๋ฐ˜์˜๋˜๋Š” ๊ตฌ์กฐ๋ผ๋ฉด, LD_PRELOAD์ฒ˜๋Ÿผ ptrace ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ด€์ฐฐ ์ˆ˜๋‹จ์œผ๋กœ ๋ฐ”๊ฟ”์•ผ "์ง„์งœ" ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ˆ„์‚ฐํ•ฉ ๊ฒ€์ฆ์—์„œ "๋ชจ๋“  ํ•ญ์ด non-negative"๋ผ๋Š” ์กฐ๊ฑด ํ•˜๋‚˜๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ†ต์งธ๋กœ ๋‹จ์ˆœํ™”์‹œ์ผฐ๋‹ค. i์˜ ํ™€์ง์— ๋”ฐ๋ผ ๋บ„์…ˆ๊ณผ XOR์„ ์„ž์–ด ์จ์„œ ์–ธ๋œป ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ, ๋‘ ์—ฐ์‚ฐ ๋ชจ๋‘ "0์ด ๋˜๋Š” ์กฐ๊ฑด์ด ๊ฐ™๋‹ค"๋Š” ์‚ฌ์‹ค๊ณผ "๋ˆ„์‚ฐํ•ฉ์ด 0์ด๋ ค๋ฉด ๋ชจ๋“  ํ•ญ์ด 0์ด์–ด์•ผ ํ•œ๋‹ค"๋Š” ์‚ฌ์‹ค์„ ๊ฒน์น˜๋ฉด ๊ฒฐ๊ตญ input[i] == b1[i]๋ผ๋Š” ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด ๋น„๊ต๋กœ ๊ท€๊ฒฐ๋œ๋‹ค. ๋ณต์žกํ•ด ๋ณด์ด๋Š” ์‚ฐ์ˆ ์‹์„ ๋งŒ๋‚˜๋ฉด, ๊ทธ ์‹์ด ์ตœ์ข…์ ์œผ๋กœ "0์ธ์ง€ ์•„๋‹Œ์ง€"๋งŒ ๋”ฐ์ง€๋Š” ๋ฌธ๋งฅ์— ๋†“์—ฌ ์žˆ๋Š”์ง€๋ถ€ํ„ฐ ํ™•์ธํ•˜๋Š” ๊ฒŒ ์ง€๋ฆ„๊ธธ์ด ๋  ๋•Œ๊ฐ€ ๋งŽ๋‹ค.

๋ฐฉ์–ด์ž ๊ด€์ ์—์„œ ๋ณด๋ฉด, ์žฌ๋ฐฐ์น˜ ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•œ ์ด ๋ฐ์ดํ„ฐ ์€๋‹‰ ๊ธฐ๋ฒ•์€ ์ƒ๋‹นํžˆ ์ฐฝ์˜์ ์ด๋ฉด์„œ๋„ ๊ฒฌ๊ณ ํ–ˆ๋‹ค โ€” ํŒŒ์ผ ์ •์  ๋ถ„์„์œผ๋กœ๋Š” "๋ฌด์Šจ ํ•จ์ˆ˜๊ฐ€ ์ด ๊ฐ’์„ ๋งŒ๋“œ๋Š”์ง€" ์ฐพ์„ ๋ฐฉ๋ฒ•์ด ์•„์˜ˆ ์—†๊ณ , ๋กœ๋” ๋™์ž‘๊นŒ์ง€ ์ดํ•ดํ•ด์•ผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ptrace ๊ธฐ๋ฐ˜ ์•ˆํ‹ฐ๋””๋ฒ„๊ทธ์™€ ์กฐํ•ฉํ•˜๋ฉด์„œ ์ƒ๊ธด "๊ด€์ฐฐ ๋„๊ตฌ๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๊พผ๋‹ค"๋Š” ๋ถ€์ž‘์šฉ์€, ์—ญ์œผ๋กœ ๋ฌธ์ œ ํ’€์ด์ž์—๊ฒŒ LD_PRELOAD ๊ฐ™์€ ๋น„-ptrace ๊ด€์ฐฐ ์ˆ˜๋‹จ์„ ์“ฐ๋„๋ก ๊ฐ•์ œํ•˜๋Š” ์žฌ๋ฏธ์žˆ๋Š” ๊ณ๊ฐ€์ง€ ํผ์ฆ์ด ๋˜์–ด ์žˆ์—ˆ๋‹ค.

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

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 +4
[๐Ÿฅ‡ Gold 4] ๋””๋ฒ„๊ฑฐ๋ฅผ ๋ถ™์ด๋ฉด ์ •๋‹ต์ด ๋ฐ”๋€๋‹ค โ€” DreamHack Times ํ’€์ด
blog

[๐Ÿฅ‡ Gold 4] ๋””๋ฒ„๊ฑฐ๋ฅผ ๋ถ™์ด๋ฉด ์ •๋‹ต์ด ๋ฐ”๋€๋‹ค โ€” DreamHack Times ํ’€์ด

์ƒ์„ฑ์ž๊ฐ€ ptrace(PTRACE_TRACEME) ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์ „์—ญ ์›Œ๋“œ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š”๋ฐ, ๊ทธ ์ „์—ญ์ด memcmp ๋น„๊ต ๋Œ€์ƒ์˜ ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ๋ฅผ ๊ฒธํ•œ๋‹ค. MD5 XOR ์ธต์€ ๊ฐ™์€ ์ดˆ์— ๋‘ ๋ฒˆ ๊ฑธ๋ ค ์Šค์Šค๋กœ ์ƒ์‡„๋˜๊ณ , ๋‚จ๋Š” ๋ณ€ํ™˜์€ dword ๋น„ํŠธ๋ฐ˜์ „ ํ•˜๋‚˜๋ฟ์ด์—ˆ๋‹ค.
#dreamhack#ctf#reversing+6
2026-08-02#dreamhack +4
[๐Ÿฅ‡ Gold 1] 27455๋ฒˆ ๋ฐ˜๋ณต๋˜๋Š” ๋ˆ„์‚ฐ๋„ ๊ฒฐ๊ตญ ์„ ํ˜•์ด๋‹ค โ€” DreamHack multipoint ํ’€์ด (2๋ฒˆ ๋ณด๋ฅ˜ ๋์— ํ•ด๊ฒฐ)
blog

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

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