๋ฌธ์ : DreamHack โ Theori of Relativity ๋ถ๋ฅ: Reversing ๋์ด๋: ๐ฅ Gold 2 FLAG:
DH{1d459fbdd85803e8223c2a11604dac728aceaffbc454aedce56b1a8d4e063360}
์ด ๋ฌธ์ ๋ ์ธ ๋ฒ์งธ ์๋์์ ํ๋ ธ๋ค. ์ง๋ ๋ ์ธ์ ์ ๊ฒ์ฆ์ ์ฐ์ด๋ 104๋ฐ์ดํธ์ง๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ด ํ์ผ์ ์ ์ฅ๋ ๊ฐ๊ณผ ์คํ ์ค ๊ฐ์ด ์์ ํ ๋ค๋ฅด๋ค๋ ๊ฒ๊น์ง๋ ํ์ธํ์ง๋ง, "๊ทธ ๊ฐ์ ๋์ฒด ์ด๋์ ๋ฐ๊พธ๋์ง" ์ฐพ์ง ๋ชปํ๊ณ ๋ ๋ฒ ๋ค ๋ณด๋ฅํ๋ค. ์ค๋ ๋ค์ ๋ถ์ด์ ์๊ฒ ๋ ์ฌ์ค์, ์ ์ด์ ๊ทธ๊ฑธ ๋ฐ๊พธ๋ ํจ์ ์์ฒด๊ฐ ์๋ค๋ ๊ฒ์ด์๋ค โ ๋ฒ์ธ์ ์ฝ๋๊ฐ ์๋๋ผ ELF๋ฅผ ๋ก๋ํ๋ ๊ณผ์ ๊ทธ ์์ฒด์๋ค.
๋ฌธ์ ๊ฐ์
file/checksec๋ก ๊ธฐ๋ณธ ์ ๋ณด๋ถํฐ ํ์ธํ๋ค. PIE, Full RELRO, ์นด๋๋ฆฌ, NX๊ฐ ์ผ์ง ํํ ์กฐํฉ์ ์์ ๋ฐ์ด๋๋ฆฌ๋ค. ์คํํ๋ฉด ํค๋ฅผ ์
๋ ฅ๋ฐ๊ณ ๋ง์๋์ง ํ๋ ธ๋์ง๋ง ์๋ ค์ค๋ค.
objdump๋ก ํ๋ฆ์ ๋ฐ๋ผ๊ฐ๋ฉด ๊ตฌ์กฐ๋ ๋จ์ํ๋ค. main์ด fgets๋ก ์ต๋ 100๋ฐ์ดํธ๋ฅผ ์
๋ ฅ๋ฐ๊ณ ๊ฐํ์ ์ ๊ฑฐํ ๋ค, ๊ฒ์ฆ ํจ์ ํ๋๋ฅผ rdi=&0x6020(์ด๋ค 104๋ฐ์ดํธ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์์), rsi=์ฌ์ฉ์ ์
๋ ฅ์ผ๋ก ํธ์ถํ๋ค. ๋ฐํ๊ฐ์ด ์ฐธ์ด๋ฉด "Congrats! Flag is DH{%s} ...if you didn't cheat!"๋ฅผ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ๋ 0x6020์ด๋ผ๋ ์ฃผ์๋ค. ์ด ์ฃผ์๋ .data ์น์
์์ ์๋๋ฐ, ํ์ผ์ ์ ์ฅ๋ ์๋ณธ ๋ฐ์ดํธ์ ์ค์ ์คํ ์ค์ธ ๊ฐ์ด ์ ํ ๋ค๋ฅด๋ค. ์ง๋๋ฒ์๋ ์ด ์ฐจ์ด๋ฅผ ๋ง๋๋ ์ฝ๋๋ฅผ .init_array์ ๋ฑ๋ก๋ ์์ฑ์ ๋ ๊ฐ(๋ค์์ ๋ค์ ๋์จ๋ค) ์์์ ์ฐพ์ผ๋ ค๊ณ ํ์ง๋ง ๋๋ด ๋ชป ์ฐพ์๋ค.
โถ๐ณ๏ธ ์ฝ์ง โ ์ง๋ ๋ ์ธ์ , '๋ฐ๊พธ๋ ํจ์'๋ฅผ ์ฐพ๋ค๊ฐ ๋ชป ์ฐพ๊ณ ๋ณด๋ฅํ๋ค
์ง๋๋ฒ ๊ธฐ๋ก์ ๋ค์ ์ฝ์ด๋ณด๋ฉด, ๋ ๊ฐ์ง๋ฅผ ์ด๋ฏธ ์ ํํ ์์๋ธ ์ํ์๋ค.
.init_array์ ๋ฑ๋ก๋ ํจ์ ํ๋๊ฐptrace(PTRACE_TRACEME, 0, 0, 0)์ ํธ์ถํด์, ์คํจ(๋๋ฒ๊ฑฐ๊ฐ ๋ถ์ด์๊ฑฐ๋ ์ด ์๋๋ฐ์ค์ ์ ์ ์๋ ์ ์ฝ์ผ๋ก EPERM)ํ๋ฉด0x6020์ฃผ์์ 1๋ฐ์ดํธ์+1์, ์ฑ๊ณตํ๋ฉด-1์ ํ๋ค.- ๋ ๋ค๋ฅธ ์์ฑ์๊ฐ ์ธ ํจ์(์๊ธฐ ์์ ํฌํจ)์ ์ฝ๋๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ํ์ด์
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"๋ผ๋ ๋ฌธ์ ์ ๋ชฉ์ ๋ง์ฅ๋์ด ์น์
์ด๋ฆ์๋ ๊ทธ๋๋ก ๋ฐํ ์์๋ค.

์ ์์ ์ธ 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 ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ผ ์๋ณธ๊ณผ ๋๋ํ ๋น๊ตํ๋ค.
์ด ์์ ์ .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์ด ํธ์ถํ๋ ๊ณณ)๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ์ ๋
ํ๋ค.
ํต์ฌ์ ์ธ ๊ฐ์ง๋ค.
b1 = (i*i + key[i]) & 0xffโkey[i]๋ ๋ฐฉ๊ธ ํ๋ณดํ 104๋ฐ์ดํธ ๋ธ๋ก์i๋ฒ์งธ ๋ฐ์ดํธ๋ค.- ๋งค ๋ฐ๋ณต๋ง๋ค
i๊ฐ ์ง์๋ฉด(b1 - input[i]) & 0xff๋ฅผ, ํ์๋ฉดb1 ^ input[i]๋ฅผ 128๋นํธ ๋์ฐํฉ์ ๋ํ๋ค. ๋ ์ฐ์ฐ ๋ค ๊ฒฐ๊ณผ๊ฐ 0์ด ๋๋ ์กฐ๊ฑด์ ๋๊ฐ๋ค โinput[i] == b1[i]. (๋บ์ ์ด 0์ด๋ ค๋ฉด ๋ ๊ฐ์ด ๊ฐ์์ผ ํ๊ณ , XOR์ด 0์ด๋ ค๋ ๋ ๊ฐ์ด ๊ฐ์์ผ ํ๋ค.) 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 ๊ฐ์ ๊ทธ๋๋ก ๋์ดํ ๊ฒ์ด๋ค.
๐ฏ ์์ฒด ์๊ฒฐ 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์์ ๋๋๋์ง๊น์ง.
์ฌ๊ธฐ๊น์ง๋ ๋ฌธ์ ์์ด ๋ง์๋จ์ด์ก๋ค. ๊ทธ๋ฐ๋ฐ ์ด ํ๋ฆ์ผ๋ก ๋ง๋ 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๋ก ๋์ด๊ฐ๋ค.
0x31. gdb๋ก ๊ด์ฐฐํ์ ๋์ 0x33๊ณผ ์ ํํ 2๋งํผ ๋ค๋ฅด๋ค โ +1(ptrace ์คํจ, gdb ํ๊ฒฝ) ๋ -1(ptrace ์ฑ๊ณต, ์์ ํ๊ฒฝ)์ ์ฐจ์ด๊ฐ ๊ทธ๋๋ก ๋๋ฌ๋ ๊ฒ์ด๋ค. ์ด ๊ฐ์ผ๋ก key[0]๋ง ๊ฐ์๋ผ์ flag๋ฅผ ๋ค์ ๊ณ์ฐํ๋ค.
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
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ