๋ฌธ์ : DreamHack โ fake ๋ถ๋ฅ: Reversing ๋์ด๋: ๐ฅ Silver 4 FLAG:
DH{SMC_R3vers1ng_chall}
ํ์ผ ํ๋์ง๋ฆฌ ํ๋ฒํ ๋ฆฌ๋ฒ์ฑ ๋ฌธ์ ์ฒ๋ผ ๋ณด์๋ค. file๋ก ํ์ธํ๋ฉด ๊ทธ๋ฅ stripped PIE ELF. ๊ทธ๋ฐ๋ฐ ์คํํด๋ด๋, ์
๋ ฅ์ ์ค๋, ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์๋๋ค. ํ๋กฌํํธ๋, ์๋ฌ ๋ฉ์์ง๋, ์ฑ๊ณต/์คํจ ๋ฉ์์ง๋ ์ ํ ์๋ค. ๋ฌธ์ ์ ๋ชฉ์ด "fake"์ธ๋ฐ, ํ๊ณ ๋๋ ์ด ํ๋ก๊ทธ๋จ์ด "๊ฒ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๊ฒ"์ด ํต์งธ๋ก ๊ฐ์ง์๋ค๋ ๋ป์ด์๋ค โ ์ ์ด์ ๋ญ๊ฐ๋ฅผ ๋ณด์ฌ์ค ์๊ฐ ์์ฒด๊ฐ ์๋ ํ๋ก๊ทธ๋จ์ด์๋ค.
๋ฌธ์ ์ค๋ช ๋งจ ์๋์๋ "์ธ์ธํ ์์ ์๋ฃ [2024.12.21]"์ด๋ผ๋ ๋ฌธ๊ตฌ๋ ๋ถ์ด ์์๋ค. ์ถ์ ์๊ฐ ์๋ํ์ง ์์ ์ง๋ฆ๊ธธ(unintended solution)์ด ํ ๋ฒ ๋ฐ๊ฒฌ๋ผ์ ๋งํ๋ค๋ ๋ป์ธ๋ฐ, ์ด๋ค ์ง๋ฆ๊ธธ์ด์๋์ง๋ ์ ๊ธธ์ด ์์์ง๋ง ์ ์ด๋ "์ด ๋ฌธ์ ๋ ์ ๊ณต๋ฒ์ผ๋ก ํ๋ฆฌ๋๋ก ๋ค์ ์๋ด์ก๋ค"๋ ์ ํธ๋ก๋ ๋ฐ์๋ค์ผ ๋งํ๋ค. ์คํ์กฐ์ฐจ ๊ด์ฐฐ ๋ถ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ์์ ์ด๋ค ์ง๋ฆ๊ธธ์ด ์์์์ง ์์ํ๊ธฐ ์ด๋ ค์ ๋๋ฐ, ๋๊น์ง ํ๊ณ ๋์ ๋์ด์ผ๋ณด๋ฉด ์๋ง ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ ์ฐํ์ด์ง ์์์๊น ์ถ๋ค โ ํ์ธํ ๋ฐฉ๋ฒ์ ์์ง๋ง, ์ต์ํ ์ง๊ธ ์ด ๋ฐ์ด๋๋ฆฌ์์๋ ๊ทธ๋ฐ ์๊ฐ ํตํ์ง ์๋๋ค๋ ๊ฒ๋ง์ ๋ถ๋ช ํ๋ค.
๋ฌธ์ ๊ฐ์
๋ฐ์ด๋๋ฆฌ ํ๋๋ง ์ฃผ์ด์ง๋ค. ๋ฌธ์ ์ค๋ช
์ ์งง๋ค: format:DH{...}, "simple reversing challenge". ์ผ๋จ ์คํํด๋ดค๋ค.
๋ณดํธ๊ธฐ๋ฒ์ ์ ๋ถ ์ผ์ ธ ์์ง๋ง ์ด ๋ฌธ์ ์๋ ๋ฌด๊ดํด ๋ณด์ธ๋ค. Full RELRO, ์คํ ์นด๋๋ฆฌ, NX, PIE, ์ฌ์ง์ด ์ต์ CPU ๊ธฐ๋ฅ์ธ Shadow Stack(SHSTK)ยทIndirect Branch Tracking(IBT)๊น์ง โ ์ฌ์ฉ์ ์ ๋ ฅ์ ์์ ๋ฐ์ง ์๋ ํ๋ก๊ทธ๋จ์ ์ด ์ ๋๋ก ์์ ํ ๋ณดํธ๊ธฐ๋ฒ ์ธํธ๋ฅผ ๋ถ์ฌ๋ ๊ฑด ๋ค์ ๊ณผํด ๋ณด์๋ค. ๋์ค์ ์๊ฒ ๋์ง๋ง, ์ด๊ฑด ์๋ง "์ด ๋ฐ์ด๋๋ฆฌ๋ฅผ ๊ณต๊ฒฉ ๋์์ผ๋ก ์ฐฉ๊ฐํ๊ฒ ๋ง๋๋" ๋ ํ๋์ ๋ฏธ๋ผ์์ ๊ฒ์ด๋ค โ ๋ณดํธ๊ธฐ๋ฒ์ด ์ด์ดํ ๊ฑธ ๋ณด๋ฉด ๋ฐ์ฌ์ ์ผ๋ก "๋ฉ๋ชจ๋ฆฌ ์์ ์ทจ์ฝ์ ์ ์ฐพ์์ผ ํ๋"๋ผ๋ ์๊ฐ์ด ๋จผ์ ๋๋๋ฐ, ์ด ๋ฌธ์ ๋ ์ ์ด์ pwn์ด ์๋๋ผ ์์ ๋ฆฌ๋ฒ์ฑ์ด์๋ค.
์ง์ง ๋์ ๋๋ ๊ฑด ์ํฌํธ ๋ชฉ๋ก์ด๋ค. malloc, free, __cxa_finalize, __stack_chk_fail โ ์ด๊ฒ ์ ๋ถ๋ค. read๋, write๋, puts๋, printf๋ ์๋ค. ํ์ค C ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด ์ฌ์ฉ์์ ๋ญ๊ฐ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ์ต์ํ ํ๋๋ ์์ด์ผ ํ ํจ์๋ค์ด ํต์งธ๋ก ๋น ์ ธ ์๋ค. strings๋ก ํ์ด๋ด๋ ํ๋กฌํํธ๋ ์ฑ๊ณต/์คํจ ๋ฉ์์ง ๋ฌธ์์ด์ด ํ๋๋ ์ ๋ณด์ธ๋ค.
๐ฌ ์ ์ฐฐ โ strace๊ฐ ํ์ธํด์ค ์ฌ์ค: ์ด ํ๋ก๊ทธ๋จ์ ์ ๋ง ์๋ฌด๊ฒ๋ ์ ํ๋ค
ํน์ ๋ชป ๋ณด๊ณ ์ง๋์น syscall์ด ์์๊น ์ถ์ด strace๋ก ์ง์ ๊ฐ์ํ๋ค. stdin์ ์๋ฌด ๊ฐ์ด๋ ํ๋ ค๋ณด๋ด๋ฉด์ ์คํํ๋ค.
brk()๋ก ํ์ ๋๋ฆฌ๊ณ , ASLR/์คํ ์นด๋๋ฆฌ์ฉ getrandom()์ ํ ๋ฒ ํธ์ถํ๊ณ , ๊ทธ๋๋ก exit_group(0)์ผ๋ก ๋๋๋ค. stdin์ ๋ฃ์ ๊ฐ์ ๋จ ํ ๋ฐ์ดํธ๋ ์ฝํ์ง ์๋๋ค. ์ด ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ์ ์
๋ ฅ๊ณผ ๋ฌด๊ดํ๊ฒ ํญ์ ๋๊ฐ์ด ๋์ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ด๋์๋ ์ถ๋ ฅํ์ง ์๋๋ค. ๊ทธ๋ ๋ค๋ฉด "์ ๋ต์ ๋งํ๋" ๋ฌธ์ ๊ฐ ์๋๋ผ โ ์ด ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ ์์์ ์กฐ์ฉํ ๊ณ์ฐํด๋ด๋ ๊ฐ์ด ๋ฌด์์ธ์ง๋ฅผ ์ ์ ์ผ๋ก ์ฌ๊ตฌ์ฑํด์ผ ํ๋ ๋ฌธ์ ๋ผ๋ ๋ป์ด๋ค.
objdump -d -M intel๋ก main()๋ถํฐ ๋ฐ๋ผ๊ฐ๋ดค๋ค.
๊ตฌ์กฐ๋ ๋จ์ํ๋ค. init()์ ํธ์ถํด ๋ญ๊ฐ๋ฅผ mallocํ ํฌ์ธํฐ๋ฅผ ๋ฐ๊ณ (NULL์ด๋ฉด ์กฐ๊ธฐ ์ข
๋ฃ), f1357(ptr) โ f1521(ptr) โ f1357(ptr) ์์๋ก ์ธ ๋ฒ ํธ์ถํ ๋ค, free(ptr->data)์ free(ptr)๋ฅผ ํธ์ถํ๊ณ ๋๋๋ค. ์ถ๋ ฅ ํจ์ ํธ์ถ์ ์ด ํ๋ฆ ์ด๋์๋ ์๋ค.
๋ง์ง๋ง ๋ free ํธ์ถ์ ์์๋ ๋์ฌ๊ฒจ๋ณผ ๋งํ๋ค. ์์ชฝ ๋ฒํผ(ptr->data)๋ฅผ ๋จผ์ ํด์ ํ๊ณ , ๊ทธ ๋ค์์ ๋ฐ๊นฅ ๊ตฌ์กฐ์ฒด(ptr)๋ฅผ ํด์ ํ๋ค โ ์์์ ๋จผ์ ์ ๋ฆฌํ๊ณ ๋ถ๋ชจ๋ฅผ ๋์ค์ ์ ๋ฆฌํ๋, ์ค์ฒฉ ํฌ์ธํฐ๋ฅผ ๋ค๋ฃจ๋ ์ ์์ ์ธ ํด์ ์์๋ค. ์์๊ฐ ๋ฐ๋์๋ค๋ฉด(๊ตฌ์กฐ์ฒด๋ฅผ ๋จผ์ ํด์ ํ ๋ค ๊ทธ ๊ตฌ์กฐ์ฒด๋ฅผ ํตํด ptr->data์ ์ ๊ทผํ๋ ค ํ๋ค๋ฉด) use-after-free๊ฐ ๋์ ํ
๋ฐ, ์ด ๋ฐ์ด๋๋ฆฌ๋ ๊ทธ ํจ์ ์ ์ ํํ ํผํด๊ฐ๊ณ ์๋ค. ์ทจ์ฝ์ ์ ์ฌ์ด๋๋ ๋ฌธ์ ๊ฐ ์๋๋ผ ์ ๋ง "๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ฉํ ๋ง๋ค๊ณ ์น์ฐ๋" ๊ฒ ์์ฒด๊ฐ ๋ชฉ์ ์ธ ํ๋ก๊ทธ๋จ์ด๋ผ๋ ์ ํฉ์ด ์ฌ๊ธฐ์๋ ํ์ธ๋๋ค.
โถ๐ณ๏ธ ์ฝ์ง โ f1357์ ์ง์ง ๊ฒ์ฆ ๋ก์ง์ธ ์ค ์๊ณ ํ์ฐธ ๋ถ์ก๊ณ ์์๋ค
f1357์ ์ฒ์ ์ด์ด๋ดค์ ๋๋ ์ด๊ฒ ํต์ฌ ๊ฒ์ฆ ํจ์๋ผ๊ณ ํ์ ํ๋ค. ๋ฒํผ์ ํน์ ๋ฐ์ดํธ ๋ ๊ฐ(data[2]์ data[len-3])๋ฅผ ๋ํ๊ณ , ๋ค๋ฅธ ๋ ๋ฐ์ดํธ(data[0]๊ณผ data[len-1])๋ฅผ XORํ ๋ค, ๊ทธ ๋ ๊ฐ์ ์ด๋ค ํจ์(0x1189)์ ๋๊ธด๋ค โ ๋ฑ "์ฒดํฌ์ฌ์ ๊ณ์ฐํด์ ๊ฒ์ฆํ๋" ์ ํ์ ์ธ ๋ชจ์์ด์๋ค. ๊ทธ๋์ ์ฒ์์ 0x1189๊ฐ ๋ญ ํ๋์ง, ์ด ์ฒดํฌ์ฌ์ด ๋ฒํผ์ ์ด๋ ๋ฐ์ดํธ์ ๋ค์ ๋ฐ์๋๋์ง๋ฅผ ํ์ฐธ ์ถ์ ํ๋ค.
๊ทธ๋ฐ๋ฐ ์๋ฌด๋ฆฌ ๋ฐ๋ผ๊ฐ๋ ์ด ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ ๋ค์ ๋ฒํผ์ ์ฐ์ด๋ ๊ณณ์ด ์์๋ค. sum๊ณผ xor ๊ฐ์ ์ง์ญ ๋ณ์์ ์ ์ฅํ๊ณ 0x1189์ ๋๊ธฐ๋ ๊ฒ ์ ๋ถ์๊ณ , f1357 ํจ์ ์ ์ฒด์์ data[i] = ... ๊ฐ์ ์ฐ๊ธฐ ์ฐ์ฐ์ ๋จ ํ ์ค๋ ์์๋ค. ๊ฒ๋ค๊ฐ ์์ strace๋ก ์ด๋ฏธ ํ์ธํ๋ฏ ํ๋ก๊ทธ๋จ์ด ์ด๋ค ๊ฐ์ ๊ฒ์ฆํด์ ๋ค๋ฅด๊ฒ ํ๋ํ๋(์: ์๋ฌ ์ข
๋ฃ) ํ์ ์์ฒด๊ฐ ์์๋ค โ ํญ์ exit_group(0)์ผ๋ก ๋๋๋ค.
๊ทธ์ ์์ผ ์ด ํจ์๊ฐ ์ง์ง ๊ฒ์ฆ์ด ์๋๋ผ ๋ฆฌ๋ฒ์๋ฅผ ๋ถ์ก์๋๊ธฐ ์ํ ๋ฏธ๋ผ๋ผ๋ ๊ฑธ ๊นจ๋ฌ์๋ค. main()์ด f1357์ ์๋ค๋ก ๋ ๋ฒ์ด๋ ๋ถ๋ฅด๋ ๊ฒ๋ "์ด๊ฒ ๋ญ๊ฐ ์ค์ํ ๋ก์ง์ด๊ฒ ์ง"๋ผ๋ ์ฐฉ๊ฐ์ ๊ฐํํ๋ ค๋ ์ฅ์น์๋ ์
์ด๋ค. f1357์ ์์ ํ ๋ฌด์ํ๊ณ , ์ค์ ๋ก ๋ฒํผ๋ฅผ ๋ฐ๊พธ๋ f1521 ํ๋์๋ง ์ง์คํ๋ ๊ฑธ๋ก ๋ฐฉํฅ์ ๋ฐ๊ฟจ๋ค.
๐ฃ ํต์ฌ โ ์๋ ๋ฒํผ ํ๋๊ฐ ์ธ ๋ฒ ๋ณํ๋๊ณ ๊ทธ๋๋ก ์ฌ๋ผ์ง๋ค
init()(์ฃผ์ 0x140b)๋ถํฐ ๋ค์ ๋ดค๋ค. ์ด ํจ์๊ฐ ํ๋ ์ผ์ malloc๋ 24๋ฐ์ดํธ ๋ฒํผ์ 23๋ฐ์ดํธ์ง๋ฆฌ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฑ์ ๋ฃ๋ ๊ฒ์ด๋ค.
movabs rax, 0x595468565f5b5b4a์ movabs rdx, 0x6841044552064450 ๋ ๊ฐ(8๋ฐ์ดํธ์ฉ 16๋ฐ์ดํธ), ๊ทธ๋ฆฌ๊ณ mov DWORD/WORD/BYTE๋ก 4+2+1=7๋ฐ์ดํธ๋ฅผ ๋ ์ฑ์์ ์ ํํ 23๋ฐ์ดํธ(0x17)๋ฅผ ๋ง๋ ๋ค. ์ด ๊ฐ๋ค์ด ์คํ์์ malloc๋ ํ ๋ฒํผ๋ก ๊ทธ๋๋ก ๋ณต์ฌ๋๋ค โ **์ด๊ฒ ์ด ํ๋ก๊ทธ๋จ์ด ๋ค๋ฃจ๋ ์ ์ผํ "๋ฐ์ดํฐ"**๋ค.
์ด์ f1521(์ง์ง ๋ณํ ํจ์) ์ฐจ๋ก๋ค. ์ด์ด๋ณด๋ฉด ์ธ ๊ฐ์ ํ์ ํจ์๋ฅผ ์์๋๋ก ํธ์ถํ ๋ฟ์ด๋ค.
reverse: ๋ฒํผ ์ ์ฒด๋ฅผ ์๋ค๋ก ๋ค์ง๋๋ค.swap_pairs:(0,1),(2,3),(4,5)... ์ธ์ ํ ๋ ๋ฐ์ดํธ์ฉ ์๋ก ๋ง๋ฐ๊พผ๋ค.xor_key: ๋ชจ๋ ๋ฐ์ดํธ๋ฅผ0x37๋ก XORํ๋ค.
์ธ ํจ์ ๋ค ์ธ์๋ { char *data; size_t len; } ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ ํ๋๋ฟ์ด๊ณ , ์ ๋ถ ๊ทธ ์๋ฆฌ์์ ๋ฒํผ๋ฅผ ์ง์ ๊ณ ์ณ ์ด๋ค(in-place). ์ด ์ธ ๋จ๊ณ๋ฅผ ๊ฑฐ์น ๋ฒํผ๊ฐ ๋ฐ๋ก free()๋ก ๋์ด๊ฐ๋ ๋ง์ง๋ง ์ํ๋ค โ ์ฝ์์ ํ ๊ธ์๋ ์ ์ฐํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ์์์๋ ๋ถ๋ช
ํ ๋ฌด์ธ๊ฐ๊ฐ ์์ฑ๋ผ ์๋ค.
์ฌ๊ธฐ์ ํ ๊ฐ์ง ์ง์ด๋ ๋ถ๋ถ์ xor_key์ ํค ๊ฐ 0x37์ด๋ค. ์ด๋ฒ์ ์ด ๊ฐ์ด ์ฆ์๊ฐ(mov esi, 0x37)์ผ๋ก ์ฝ๋์ ๊ทธ๋๋ก ๋ฐํ ์์ด์ ๋ฐ๋ก ์ฝ์ ์ ์์์ง๋ง, ๋ง์ฝ ํค๊ฐ ๋๋
ํ๋ผ ์์๋ค๋ฉด ์ ๊ทผ์ด ๋ฌ๋ผ์ก์ ๊ฒ์ด๋ค. XOR์ ์๊ธฐ ์์ ์ ์ญ์ฐ์ฐ์ด๋ผ((x ^ k) ^ k = x) ํค๋ฅผ ๋ชฐ๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋์ด ์ฝ์ ์ ์๋ ASCII ๋ฒ์(0x20~0x7e)์ ๋ค์ด์ค๋ ํค๋ฅผ ์ ์์กฐ์ฌ(256๊ฐ์ง๋ฟ์ด๋ ์ฌ์ค์ ์ฆ์ ๋๋๋ค)ํด์ ํ๋ณด๋ฅผ ์ขํ๋ ๋ฐฉ๋ฒ๋ ์ถฉ๋ถํ ํตํ์ ๊ฒ์ด๋ค โ XOR ๋จ์ผ ๋ฐ์ดํธ ํค๋ ์ ์ด์ ๋ธ๋ฃจํธํฌ์ค์ ๊ฐ์ฅ ์ทจ์ฝํ ์ถ์ ์ํ๋ ๋ณํ์ด๋ผ, ๊ตณ์ด ํค ์์ฒด๋ฅผ ์ ์ ์ผ๋ก ์ฐพ์๋ด์ง ๋ชปํ๋๋ผ๋ ํฐ ์ฅ์ ๋ฌผ์ ์๋์์ ๊ฑฐ๋ผ๋ ๋ป์ด๋ค.
๐ฏ ์์ฒด ์๊ฒฐ solve
์๋ ๋ฒํผ 23๋ฐ์ดํธ๋ฅผ ๊ทธ๋๋ก ์ฎ๊ธฐ๊ณ , reverse โ swap_pairs โ xor_key(0x37)๋ฅผ ํ์ด์ฌ์ผ๋ก ์ฌํํ๋ค.
import struct
chunk1 = struct.pack("<Q", 0x595468565F5B5B4A)
chunk2 = struct.pack("<Q", 0x6841044552064450)
chunk3 = struct.pack("<I", 0x4C747A65)
chunk4 = struct.pack("<H", 0x7364)
chunk5 = struct.pack("<B", 0x7F)
buf = bytearray(chunk1 + chunk2 + chunk3 + chunk4 + chunk5)
n = len(buf)
# reverse
i = 0
while i < (n >> 1):
j = n - i - 1
buf[i], buf[j] = buf[j], buf[i]
i += 1
# swap adjacent byte pairs
i = 0
while i + 1 < n:
buf[i], buf[i + 1] = buf[i + 1], buf[i]
i += 2
# xor with key 0x37
for i in range(n):
buf[i] ^= 0x37
print("[+] FLAG:", buf.decode())
DH{SMC_R3vers1ng_chall}์ด ๋์๋ค. DH{๋ก ์์ํด์ }๋ก ๋๋๋ ๊ฒ ์์ฒด๊ฐ ์๋ ๊ฐ๊ณผ ๋ณํ ์์๋ฅผ ์ ๋๋ก ์ฝ์๋ค๋ ๊ฐํ ์ฆ๊ฑฐ์์ง๋ง, ํ๋ก๊ทธ๋จ์ ํ ๋ฒ๋ ์คํํ์ง ์๊ณ ์ด์
๋ธ๋ฆฌ๋ง ์ฝ์ด์ ๋ธ ๊ฒฐ๋ก ์ด๋ผ ํ ๋ฒ์ ์ง์ ํ์ธํด๋ณด๊ณ ์ถ์๋ค. ์ด ๋ฐ์ด๋๋ฆฌ๋ (์์ ํ์ธํ๋ฏ) ์ฝ์์๋ ์๋ฌด๊ฒ๋ ์ ์ฐ์ง๋ง, free()๋ก ๋์ด๊ฐ๊ธฐ ์ง์ ๊ทธ ๋ฉ๋ชจ๋ฆฌ๋ ์ค์ ๋ก ์กด์ฌํ๋ค โ gdb๋ก free()์ ๋ธ๋ ์ดํฌํฌ์ธํธ๋ฅผ ๊ฑธ๊ณ ์ฒซ ๋ฒ์งธ ํธ์ถ์ ์ธ์(rdi, ์ฆ ํด์ ๋ ๋ฒํผ ์ฃผ์)๋ฅผ ๋ฌธ์์ด๋ก ์ฐ์ด๋ดค๋ค.
free() call #1, arg (rdi) = DH{SMC_R3vers1ng_chall} โ ํ์ด์ฌ์ผ๋ก ๊ณ์ฐํ ๊ฐ๊ณผ ํ ๊ธ์๋ ๋ค๋ฅด์ง ์๋ค. ์ด ๋ฐ์ด๋๋ฆฌ๋ ์ค์ค๋ก ๊ทธ ๊ฐ์ ์ ๋ ๋ณด์ฌ์ฃผ์ง ์์ง๋ง, ์ด์์๋ ํ๋ก์ธ์ค์ ํ์ gdb๋ก ๋ค์ฌ๋ค๋ณด๋ฉด ํ์คํ๊ฒ ์กด์ฌ๋ฅผ ํ์ธํ ์ ์๋ค. ์ด flag๋ฅผ ๋๋ฆผํต์ ์ ์ถํด ์ ๋ต์ผ๋ก ํ์ ๋๋ค.
DH{SMC_R3vers1ng_chall}์์ SMC๊ฐ ์ ํํ ๋ญ ์ค์ธ ๋ง์ธ์ง๋ ์ถ์ ์๋ง ์๊ฒ ์ง๋ง, ๋ฌธ๋งฅ์ "Self-Modifying Code"์ ์ฝ์๋ก ์ฝ๋ ๊ฒ ๊ฐ์ฅ ์์ฐ์ค๋ฝ๋ค. ์ด ๋ฐ์ด๋๋ฆฌ๊ฐ ์ ๋ง๋ก ์๊ธฐ ์์ ์ ์ฝ๋๋ฅผ ๊ณ ์ณ ์ฐ๋(์ ํต์ ์ธ ์๋ฏธ์ SMC) ๊ฑด ์๋์ง๋ง, ์์ ์ด ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์ค์ค๋ก ์ธ ๋ฒ ์ฐ์ ๋ณํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ๋ ์ธ๋ถ์ ๋
ธ์ถํ์ง ์์ ์ฑ ์กฐ์ฉํ ํด์ ํ๋ค๋ ๋์ ์์ฒด๊ฐ "๊ฒ์ผ๋ก ๋๋ฌ๋์ง ์๋ ์๊ธฐ ๋ณํ"์ด๋ผ๋ ์ฃผ์ ์ ์ ์ด์ธ๋ฆฐ๋ค. ๋ฆฌ๋ฒ์ ์
์ฅ์์ ์ด๋ฐ ํ๋ก๊ทธ๋จ์ ์๋ํ ๋๋, ํ๋ก๊ทธ๋จ์ด ์ค์ค๋ก๋ฅผ ๋๋ฌ๋ด์ฃผ๊ธธ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๊ทธ ๋ณํ ๊ณผ์ ์์ฒด๋ฅผ ์ฝ๋ ๋ฐ์์ ๊ทธ๋๋ก ์ฌํํด๋ฒ๋ฆฌ๋ ์ชฝ์ด ์ ์ผํ ์ค์ ์ ์ธ ์ ๊ทผ์ด์๋ค.
๐ ๊ฒฐ๋ก
์ด ๋ฌธ์ ๊ฐ ํน์ดํ๋ ์ง์ ์ "์คํํด์ ํ์ธํ๋ค"๋, ๋ฆฌ๋ฒ์ฑ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ฆ ์๋จ ์์ฒด๊ฐ ์ ์ด์ ํตํ์ง ์๋๋ก ์ค๊ณ๋ผ ์์๋ค๋ ์ ์ด๋ค.
- ์ํฌํธ ๋ชฉ๋ก์ ๊ฐ์ฅ ๋จผ์ ํ์ธํ๋ ์ต๊ด์ด ์๊ฐ์ ํฌ๊ฒ ์๊ปด์คฌ๋ค.
read/write๊ณ์ด์ด ํ๋๋ ์๋ค๋ ๊ฑธ ์ฒ์์ ์์๋ค๋ฉด, "์ ๋ ฅ์ ๋ฃ๊ณ ์ถ๋ ฅ์ ๊ธฐ๋ค๋ฆฌ๋" ์์ ์ ๊ทผ์ ์์ ์๋์กฐ์ฐจ ํ์ง ์๊ณ ๋ฐ๋ก ์ ์ ๋ถ์์ผ๋ก ๋ค์ด๊ฐ ์ ์์๋ค. ๋๋ ๋จผ์ ๋ช ๋ฒ ์คํํด๋ณด๊ณ ๋์์ผ ์ํฌํธ๋ฅผ ํ์ธํ๋๋ฐ, ์์๋ฅผ ๋ฐ๊ฟจ๋ค๋ฉด ๋ ๋นจ๋์ ๊ฒ์ด๋ค. ๋ฆฌ๋ฒ์ฑ ๋ฌธ์ ๋ฅผ ๋ฐ์ผ๋ฉด ๋ฐ์ฌ์ ์ผ๋ก./chall๋ถํฐ ์คํํด๋ณด๋ ์ต๊ด์ด ์๋๋ฐ, ์ด ๋ฌธ์ ๋ ๊ทธ ์ต๊ด์ด ํตํ์ง ์๋ ์ฌ๋ก์๊ณ , ์์ผ๋ก๋checksec/file๋ค์ ์์๋ก ์ํฌํธ ๋ชฉ๋ก๋ถํฐ ํ์ธํ๋ ๊ฑธ ๊ธฐ๋ณธ ๋ฃจํด์ ๋ฃ์ด๋๋ ๊ฒ ๋์ ๊ฒ ๊ฐ๋ค. - ๊ทธ๋ด๋ฏํด ๋ณด์ด๋ ๊ณ์ฐ์ด ํญ์ ๊ฒ์ฆ ๋ก์ง์ธ ๊ฑด ์๋๋ค.
f1357์ฒ๋ผ "์ฒดํฌ์ฌ์ ๊ณ์ฐํ๋ ๊ฒ์ฒ๋ผ ์๊ธด" ์ฝ๋๊ฐ ์ค์ ๋ก๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋์๋ ์ฐ์ง ์๋ ๋์ฝ์ด์ผ ์ ์๋ค. ๊ทธ ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ ํ๋ก๊ทธ๋จ์ ๋๋จธ์ง ๋์์ ์ค์ ๋ก ์ํฅ์ ์ฃผ๋์ง(๋ณ์์ ์ ์ฅ๋ผ ์ดํ ๋ถ๊ธฐ๋ ์ฐ๊ธฐ ์ฐ์ฐ์ ์ฐ์ด๋์ง)๋ฅผ ๋๊น์ง ์ถ์ ํด๋ณด๊ธฐ ์ ์๋ "์ด๊ฒ ํต์ฌ์ด๋ค"๋ผ๊ณ ๋จ์ ํ์ง ์๋ ๊ฒ ์์ ํ๋ค. - ์ถ๋ ฅ์ด ์์ด๋ gdb๋ ์ด์์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณด์ฌ์ค๋ค. ์ด ๋ฐ์ด๋๋ฆฌ์ฒ๋ผ ์ฝ์ ์ถ๋ ฅ์ด ์ ํ ์๋ ํ๋ก๊ทธ๋จ์ด๋ผ๋, ํ์ ํ ๋น๋ ๋ฐ์ดํฐ๋ ์ค์ ๋ก ์กด์ฌํ๊ณ
free()๊ฐ์ ํจ์ ํธ์ถ ์์ ์ ์ธ์๋ก ๊ทธ ์ฃผ์๊ฐ ๋์ด๊ฐ๋ค. ํ์ค ์ถ๋ ฅ์ ๊ฐ๋ก์ฑ ์ ์๋ค๊ณ ํด์ ๋ฐํ์ ๊ฒ์ฆ์ด ๋ถ๊ฐ๋ฅํ ๊ฑด ์๋๋ค โ ์ด๋ค ํจ์๊ฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ธ์๋ก ๋ฐ๋์ง๋ง ์ฐพ์ผ๋ฉด ๊ฑฐ๊ธฐ์ ๋ธ๋ ์ดํฌํฌ์ธํธ๋ฅผ ๊ฑธ๋ฉด ๋๋ค.
๋ฐฉ์ด์ ๊ด์ ์์ ๋ณด๋ฉด, ์ด ๋ฌธ์ ๋ "๊ด์ฐฐ ๊ฐ๋ฅํ ์ถ๋ ฅ์ด ์๋ค"๋ ๊ฒ๊ณผ "์์ ํ๋ค"๋ ๊ฒ์ด ์ ํ ๋ค๋ฅธ ์ด์ผ๊ธฐ๋ผ๋ ๊ฑธ ๋ณด์ฌ์ค๋ค. ์ค์ ์์๋ ๋ก๊ทธ๋ฅผ ์ ํ ๋จ๊ธฐ์ง ์๊ฑฐ๋ ์๋ต์ ๋๋ ค์ฃผ์ง ์๋ ํ๋ก์ธ์ค๊ฐ "๋ธ๋๋ฐ์ค๋ผ์ ์์ ํ๋ค"๊ณ ์คํด๋ฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ๋๋ฒ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๋ ์ ๋๊ตฌ ์์์๋ ๊ทธ ์ด๋ค ํ๋ก๊ทธ๋จ๋ ์์ ํ ๋ธ๋๋ฐ์ค๊ฐ ๋ ์ ์๋ค. ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ํ๋ก์ธ์ค๋ผ๋ฉด ์ฝ์ ์ถ๋ ฅ ์ฌ๋ถ์ ๋ฌด๊ดํ๊ฒ, ๊ทธ ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ผ๋ง๋ ์ค๋ ํ๋ฌธ์ผ๋ก ๋จ์์๋์ง, ํ ํ ๋น์์ ์ ๋ฌ๋๋ ์๊ฐ๊น์ง๋ ๋ ธ์ถ ๊ฒฝ๋ก๊ฐ ๋ ์ ์๋ค๋ ๊ฑธ ํจ๊ป ๊ณ ๋ คํด์ผ ํ๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ฒ์ ๋ดค์ ๋๋ "์ถ๋ ฅ์ด ์์ผ๋ฉด ํ ๋ฐฉ๋ฒ๋ ์๋ ๊ฒ ์๋๊ฐ"๋ผ๋ ์๊ฐ์ด ์ ๊น ์ค์ณค๋ค. ํ์ง๋ง ๋ฆฌ๋ฒ์ฑ์ด๋ผ๋ ์์ ์์ฒด๊ฐ ์๋ "ํ๋ก๊ทธ๋จ์ด ์ค์ค๋ก ๋งํด์ฃผ๋ ๊ฒ"์ ์์กดํ๋ ๊ฒ ์๋๋ผ "ํ๋ก๊ทธ๋จ์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ก๋์ง๋ฅผ ์ฝ๋๋ก๋ถํฐ ์ง์ ์ฝ์ด๋ด๋" ์์ ์ด๋ผ๋ ๊ฑธ ์๊ฐํ๋ฉด, ์ถ๋ ฅ์ ์ ๋ฌด๋ ์ฌ์ค ๋ถ์ฐจ์ ์ธ ๋ฌธ์ ์๋ค. ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋์ผ๋ก ํ์ธํ๋ ๊ฑด ์ ์ ๋ถ์์ด ๋ง์๋์ง ๊ฒ์ฆํ๋ ์ฌ๋ฌ ์๋จ ์ค ํ๋์ผ ๋ฟ์ด์ง, ๊ทธ๊ฒ ์ ์ผํ ์ง์ ์ ์ ์๋๋ค โ ์ด๋ฒ์ ๊ทธ ๊ฒ์ฆ ์๋จ์ด ํ์ค ์ถ๋ ฅ ๋์ gdb์์ ๋ฟ์ด๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ