๋ฌธ์ : DreamHack โ Check Function Argument ๋ถ๋ฅ: Reversing ๋์ด๋: ๐ฅ ๋ธ๋ก ์ฆ 3 FLAG:
DH{63db030352ca9f9f5e6b8a59c0527bee}
๋ฌธ์ ์ค๋ช ์ด ํ์ด ๋ฐฉ๋ฒ์ ๊ทธ๋๋ก ์๋ ค์ค๋ค.
์ด ๋ฌธ์ ๋ ๋ฉ์ธ ํจ์์์ ์ด๋ค ํจ์๋ฅผ ํธ์ถํ๋ ํ๋ก๊ทธ๋จ์ด ์ฃผ์ด์ง๋๋ค. ํด๋น ํจ์๋ ํ๋๊ทธ๊ฐ ๋ด๊ธด ๋ฌธ์์ด์ ์ฃผ์๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. ํ์ง๋ง ๊ทธ ๋ฌธ์์ด์ ์ถ๋ ฅํ์ง๋ ์์ต๋๋ค. ๋์ ๋๋ฒ๊น ์ ํตํด ํจ์์ ์ธ์๋ฅผ ํ์ธํ์ฌ ํ๋๊ทธ๋ฅผ ํ๋ํ์ธ์!
์ ๋ฆฌํ๋ฉด, flag๋ ์ด๋ค ํจ์์ ์ธ์๋ก๋ง ์กด์ฌํ๊ณ ํ๋ฉด์ ๋์ค์ง ์๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ํจ์๊ฐ ๋ถ๋ฆฌ๋ ์๊ฐ์ GDB๋ก ๋ถ์ก์ ์ธ์๋ฅผ ์ฝ์ผ๋ฉด ๋๋ค. ํจ์ ์ธ์๋ฅผ ์ฝ๋ ์ฐ์ต์ฉ ๋ฌธ์ ๋ค.

๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฌธ์ ๋ช | Check Function Argument |
| ๋์ด๋ | ๐ฅ ๋ธ๋ก ์ฆ 3 |
| ๋ถ๋ฅ | Reversing (x86-64 ELF) |
| ์ ๊ณต ํ์ผ | check_function_argument (stripped, non-PIE) |
| ๋ชฉํ | ํจ์์ ๋์ด๊ฐ๋ flag ์ธ์๋ฅผ ๋์ ์ผ๋ก ํ์ธ |
| ํต์ฌ ๊ธฐ๋ฒ | ํธ์ถ ๊ท์ฝ(rdi = 1๋ฒ์งธ ์ธ์) + GDB ๋์ ๋๋ฒ๊น |
์ ์ ๋ถ์์ผ๋ก "์ด๋ ํจ์๊ฐ flag๋ฅผ ์ธ์๋ก ๋ฐ๋์ง"๋ฅผ ์ฐพ๊ณ , ๊ทธ ์ง์ ์์ GDB๋ก ์ธ์๋ฅผ ์ฝ๋ ๋ ๋จ๊ณ๋ค.
๋ฐฐ๊ฒฝ โ x86-64 ํธ์ถ ๊ท์ฝ๊ณผ ๋์ ๋๋ฒ๊น
๋ฆฌ๋ ์ค x86-64(System V AMD64 ABI)์์ ํจ์์ ์ธ์๋ฅผ ๋๊ธธ ๋ ์ ํด์ง ์์๋ก ๋ ์ง์คํฐ๋ฅผ ์ด๋ค.
- ์ ์/ํฌ์ธํฐ ์ธ์๋ ์์๋๋ก
rdi,rsi,rdx,rcx,r8,r9์ ๋ด๊ธด๋ค. - ๊ทธ๋ฌ๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ ์ธ์ ๋
rdi๋ค. ํจ์๋ฅผcallํ๊ธฐ ์ง์ (๋๋ ํจ์ ์ง์ ์งํ)์rdi๋ฅผ ์ฝ์ผ๋ฉด ๊ทธ ํจ์์ ์ฒซ ์ธ์๋ฅผ ๊ทธ๋๋ก ๋ณผ ์ ์๋ค.
์ด ๋ฌธ์ ๋ flag๋ฅผ ์ด๋ค ํจ์์ ์ธ์๋ก ๋๊ธฐ๊ธฐ๋ง ํ๊ณ ์ถ๋ ฅํ์ง ์์ผ๋ฏ๋ก, ์ ์ ์ผ๋ก ์์ค๋ฅผ ์ฝ๋ ๊ฒ๋ง์ผ๋ก ๊ฐ์ ๋ชป ๋ณธ๋ค. ๋์ ๋์ ๋๋ฒ๊น
์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ค์ ๋ก ๋๋ฆฌ๋ค๊ฐ ๊ทธ ํจ์ ํธ์ถ ์๊ฐ์ ๋ฉ์ถฐ rdi๋ฅผ ๋ค์ฌ๋ค๋ณด๋ฉด flag๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ํต์งธ๋ก ๋ค์ด ์๋ค. ์ด ๋ฐ์ด๋๋ฆฌ๋ non-PIE๋ผ ํจ์ ์ฃผ์๊ฐ ๊ณ ์ (0x4015e2)์ด์ด์ ๋ธ๋ ์ดํฌํฌ์ธํธ๋ฅผ ๊ฑธ๊ธฐ๋ ์ฝ๋ค.
๐ฌ ์ ์ฐฐ โ ์คํํด๋ flag๋ ์ ๋์จ๋ค
file๋ก ๋ณด๋ฉด stripped, non-PIE ์คํ ํ์ผ์ด๋ค. ๋ฌธ์์ด์ ํํธ๋ง ์๋ค.
file check_function_argument
strings check_function_argument | grep -E "flag|Flag|argument|see that"
"Below function takes the flag as an argument :)", "Can you see that?" โ ์ ํํ ๋ฌธ์ ์ค๋ช ๋๋ก๋ค. ์ค์ ๋ก ์คํํ๋ฉด ์ด ๋ ์ค๋ง ์ฐ๊ณ ๋๋๋ค.

flag๋ ํ๋ฉด์ ์๋ค. ๊ทธ๋ผ ์ด๋ ์๋? ์ ์ ๋ถ์์ผ๋ก flag๊ฐ ์ด๋๋ก ํ๋ฌ๊ฐ๋์ง ๋ฐ๋ผ๊ฐ ๋ณธ๋ค.
๐งญ ์ ์ ๋ถ์ โ flag๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์ ์ฐพ๊ธฐ
main์ ๋์ค์ด์
๋ธํ๋ฉด ํ๋ฆ์ด ์งง๊ณ ๋ช
ํํ๋ค.
puts("...takes the flag as an argument :)")
rdi = [0x4040d0] ; ์ ์ญ์ ์ ์ฅ๋ flag ๋ฌธ์์ด ์ฃผ์
call 0x4015e2 ; ์ด ํจ์๊ฐ flag๋ฅผ ์ธ์(rdi)๋ก ๋ฐ๋๋ค
puts("Can you see that?")![ํด๋ฆญํ์ฌ ํ๋ main ๋์ค์ด์
๋ธ โ ์ ์ญ [0x4040d0]์ flag ์ฃผ์๋ฅผ rdi์ ์ฃ๊ณ 0x4015e2 ํจ์๋ฅผ ํธ์ถ](/_next/image?url=%2Fimages%2Fblog%2Fdreamhack-check-function-argument-writeup%2F03_main.png&w=3840&q=75)
main์ ์๋ด ๋ฉ์์ง๋ฅผ ์ฐ์ ๋ค, ์ ์ญ ๋ณ์ 0x4040d0์ ๋ด๊ธด ํฌ์ธํฐ๋ฅผ rdi์ ์ฃ๊ณ 0x4015e2 ํจ์๋ฅผ ํธ์ถํ๋ค. ์ด rdi๊ฐ ๋ฐ๋ก flag ์ฃผ์๋ค. ๊ทธ ํจ์๋ flag๋ฅผ ๋ฐ์ ๋ฌด์ธ๊ฐ ํ์ง๋ง ์ถ๋ ฅ์ ์ ํ๋ค.
โถ ์ฝ์ง: strings๋ก flag๋ฅผ ์ฐพ์ผ๋ ค๋ค ํํ, flag๋ ๋ฐํ์์ ์กฐ๋ฆฝ๋๋ค
์ฒ์์ ์ต๊ด์ ์ผ๋ก strings | grep DH{๋ก flag๋ฅผ ์ฐพ์ผ๋ ค ํ๋ค. ๊ฒฐ๊ณผ๋ 0๊ฑด. flag๊ฐ ๋ฐ์ด๋๋ฆฌ์ ํ๋ฌธ์ผ๋ก ๋ฐํ ์์ง ์๋ค๋ ๋ป์ด๋ค.

์ด์ ๋ .init_array์ ์์๋ค. ์์ฑ์(main๋ณด๋ค ๋จผ์ ์คํ๋๋ ์ด๊ธฐํ ํจ์)๊ฐ ๋ ๊ฐ ๋ฑ๋ก๋ผ ์๊ณ , ์ด๋ค์ด ๋ฐ์ด๋๋ฆฌ์ ์๋ฒ ๋๋ ๋ฐ์ดํฐ๋ฅผ XOR(๋ฐ๋ณต ํค)ยท๋ง์
์ผ๋ก ๋ณํํด flag ๋ฌธ์์ด์ ๋ฐํ์์ ์กฐ๋ฆฝํ๋ค. ๊ทธ๋์ ์ ์ ์ผ๋ก ํ์ผ์ ๋ค์ ธ์ flag๊ฐ ์ ๋ณด์ด๊ณ , ํ๋ก๊ทธ๋จ์ ์ค์ ๋ก ์คํํด ์กฐ๋ฆฝ์ด ๋๋ ๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ด์ผ ํ๋ค. ๊ฒฐ๊ตญ ๋์ ๋๋ฒ๊น
์ด ์ ๋ต์ด๋ผ๋ ๊ฑธ ์ด ์ฝ์ง๋ก ํ์ธํ ์
์ด๋ค.
๐ฃ ํต์ฌ โ GDB๋ก ์ธ์ ์ฝ๊ธฐ
0x4015e2 ํธ์ถ ์์ ์ rdi๊ฐ flag ์ฃผ์๋ค. non-PIE๋ผ ์ฃผ์๊ฐ ๊ณ ์ ์ด๋ ๊ทธ ํจ์์ ๋ธ๋ ์ดํฌ๋ฅผ ๊ฑธ๊ณ rdi๋ฅผ ๋ฌธ์์ด๋ก ์ฝ๋๋ค.
# solve.gdb
break *0x4015e2
run
printf "๋ด์ฉ: %s\n", (char*)$rdi
๋ธ๋ ์ดํฌ์ ๊ฑธ๋ฆฐ ์๊ฐ rdi๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ฉด flag๊ฐ ๊ทธ๋๋ก ๋์จ๋ค.
ooh you figured out me :) Flag is DH{63db030352ca9f9f5e6b8a59c0527bee}"ooh you figured out me :)" โ ํจ์ ์ธ์๋ก๋ง ์จ๊ฒจ ๋๋ flag๊ฐ ๊ฑธ๋ ค๋ ๋ค.
๐ Full Exploit
ํ ์ค์ง๋ฆฌ GDB ๋ฐฐ์น๋ก ๋๋๋ค.
gdb -q -batch \
-ex 'break *0x4015e2' \
-ex 'run' \
-ex 'printf "%s\n", (char*)$rdi' \
./check_function_argument0x4015e2๋ main์ด flag ์ฃผ์๋ฅผ rdi์ ๋ฃ๊ณ ํธ์ถํ๋ ํจ์์ ์ฃผ์๋ค. ๊ทธ ์ง์ ์์ rdi๋ฅผ ์ฝ์ผ๋ฉด ์กฐ๋ฆฝ์ด ๋๋ flag ๋ฌธ์์ด์ด ๋์จ๋ค.
ooh you figured out me :) Flag is DH{63db030352ca9f9f5e6b8a59c0527bee}๐ ๊ฒฐ๋ก
ํ๋ฉด์ ์ ๋์ค๋ ๊ฐ๋ ํจ์ ์ธ์์์ ๊ฐ๋ก์ฑ ์ ์๋ค.
์ด ๋ฌธ์ ์ ์์ ์ "์ถ๋ ฅ๋์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ณผ ๊ฒ์ธ๊ฐ"์๋ค. ๋ต์ ๊ทธ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ ๊ฑฐ์น๋ ์ง์ โ ํจ์ ํธ์ถ์ ์ธ์ ๋ ์ง์คํฐ โ ๋ฅผ ์ก๋ ๊ฒ์ด๋ค. x86-64์์ ์ฒซ ์ธ์๋ rdi์ด๋ฏ๋ก, ํธ์ถ ์ง์ /์งํ์ rdi๋ง ์ฝ์ผ๋ฉด ๋๋ค. ์ด๋ ์ค์ ๋ฆฌ๋ฒ์ฑ์์ ๋ณตํธํ ๋ฃจํด์ ๋์ด๊ฐ๋ ํ๋ฌธ, ๋คํธ์ํฌ๋ก ๋๊ฐ๊ธฐ ์ง์ ์ ๋ฐ์ดํฐ, ๋ก๊ทธ์ ์ ์ฐํ๋ ๋น๋ฐ๊ฐ ๋ฑ์ ๊ด์ฐฐํ๋ ๊ธฐ๋ณธ ๊ธฐ์ ์ด๋ค.
์ ์ ๋ถ์๊ณผ ๋์ ๋ถ์์ ์ญํ ์ด ๋ค๋ฅด๋ค.
strings๋ก flag๋ฅผ ๋ชป ์ฐพ์ ๊ฑด flag๊ฐ ๋ฐํ์์ ์กฐ๋ฆฝ๋๊ธฐ ๋๋ฌธ์ด์๋ค. ์ ์ ๋ถ์์ "์ด๋๋ฅผ ๋ด์ผ ํ๋์ง"(์ด๋ ํจ์๊ฐ flag๋ฅผ ๋ฐ๋์ง)๋ฅผ ์๋ ค์ฃผ๊ณ , ๋์ ๋ถ์์ "๊ทธ ์๊ฐ ์ค์ ๊ฐ์ด ๋ฌด์์ธ์ง"๋ฅผ ๋ณด์ฌ์ค๋ค. ๋์ ํจ๊ป ์จ์ผ ํ๋ค โ ์ ์ ์ผ๋ก ๋ชฉํ ์ง์ ์ ์ฐพ๊ณ , ๋์ ์ผ๋ก ๊ทธ ์ง์ ์ ๊ฐ์ ํ์ธํ๋ ํ๋ฆ์ด ์ด ๋ฌธ์ ์ ์ ์ ํ์ด๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ