๋ฌธ์ : DreamHack โ Check Return Value ๋ถ๋ฅ: Reversing ๋์ด๋: ๐ฅ Bronze 4 FLAG:
DH{0e82b5c5082e44a74dbb6d05e91387ee}
๋ฌธ์ ์ด๋ฆ์ด ๊ณง ํํธ๋ค. ๋ฐ์ด๋๋ฆฌ๋ ํ๋๊ทธ๋ฅผ ๋ง๋ค์ด ๋ฐํ(return) ํ๋๋ฐ, main์ ๊ทธ ๋ฐํ๊ฐ์ ์ฐ์ง ์๊ณ ๋ฒ๋ฆฐ๋ค. ๊ทธ๋์ ํ๋ก๊ทธ๋จ์ ์๋ฌด๋ฆฌ ์คํํด๋ "ํ๋๊ทธ๋ฅผ ๋๋ ค์คฌ๋ค"๋ ๋ฉ์์ง๋ง ๋์ค๊ณ ์ ์ ํ๋๊ทธ๋ ํ๋ฉด์ ์ฐํ์ง ์๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ ์ผ์ ๊ทธ ๋ฒ๋ ค์ง๋ ๋ฐํ๊ฐ์ ์ค๊ฐ์ ๋์์ฑ๋ ๊ฒ์ด๋ค.

๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฌธ์ ๋ช | Check Return Value |
| ๋์ด๋ | ๐ฅ Bronze 4 |
| ๋ถ๋ฅ | Reversing (x86-64 ELF) |
| ์ ๊ณต ํ์ผ | check_return_value (64-bit, stripped, non-PIE) |
| ํต์ฌ ๊ธฐ๋ฒ | ๋ฒ๋ ค์ง๋ ํจ์ ๋ฐํ๊ฐ(rax)์ gdb ๋ธ๋ ์ดํฌํฌ์ธํธ๋ก ํ์ |
ํ์ด ํ๋ฆ์ ์ธ ๊ฑธ์์ด๋ค. ์คํํด๋ ํ๋๊ทธ๊ฐ ์ ๋์ค๋ ๊ฑธ ํ์ธํ๊ณ โ main์ ๋์ค์ด์
๋ธํด ๋ฐํ๊ฐ์ด ์ด๋์ ๋ฒ๋ ค์ง๋์ง ์ง๊ณ โ ๊ทธ ์ง์ ์ gdb๋ฅผ ๊ฑธ์ด $rax๋ฅผ ์ฝ๋๋ค.
๐ฌ ์ ์ฐฐ โ ์คํํด๋ ํ๋๊ทธ๊ฐ ์ ๋์จ๋ค
๋จผ์ ๊ทธ๋ฅ ์คํํด ๋ณด๊ณ , ํ๋๊ทธ๊ฐ ๋ฐ์ด๋๋ฆฌ์ ๋ฌธ์์ด๋ก ๋ฐํ ์๋์ง strings๋ก ํ์ธํ๋ค.
./check_return_value
strings -a check_return_value | grep -iE "flag|DH\{"
์คํํ๋ฉด OK. I will return flag.์ I have returned the flag :) ๋ ์ค๋ง ๋์จ๋ค. ํ๋๊ทธ๋ ์๋ค. strings๋ก ๋ค์ ธ๋ ์ด ์๋ด ๋ฌธ๊ตฌ๋ง ๊ฑธ๋ฆฌ๊ณ DH{๋ก ์์ํ๋ ๋ฌธ์์ด์ ์๋ค. ์ฆ ํ๋๊ทธ๋ ์ ์ ์ผ๋ก ๋ฐํ ์๋ ๊ฒ ์๋๋ผ ์คํ ์ค์ ๋ง๋ค์ด์ง๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ง๋ค์ด์ง๋ ์๊ฐ์ ์ก์์ผ ํ๋ค.
๐ main ๋ถ์ โ ๋ฐํ๊ฐ์ ๋ง๋ค๊ณ ๊ณง๋ฐ๋ก ๋ฒ๋ฆฐ๋ค
main์ radare2๋ก ๋์ค์ด์
๋ธํ๋ค. ํจ์๊ฐ ์งง์ ํ๋ฆ์ด ํ๋์ ๋ค์ด์จ๋ค. -A๊ฐ ๋ฑ๋ ๋ถ์ ์งํ ๋ก๊ทธ(INFO: Analyze โฆ)๊ฐ ํ๋ฉด์ ๋ฎ์ด์ log.quiet=true๋ก ๋๋ฌ ๋๋ค.
r2 -q -e log.quiet=true -A -c "s main; pdf" check_return_value
ํต์ฌ์ ๋ฑ ๋ ์ค์ด๋ค.
call fcn.0040152b ; rax = ํ๋๊ทธ๋ฅผ ์กฐ๋ฆฝํด ๊ทธ ํฌ์ธํฐ๋ฅผ ๋ฐํ
lea rax, str.I_have_returned_the_flag ; rax๋ฅผ ์๋ด ๋ฌธ์์ด๋ก ๋ฎ์ด์ (!)fcn.0040152b๊ฐ ๋ฒํผ์ ํ๋๊ทธ๋ฅผ ์กฐ๋ฆฝํ๊ณ ๊ทธ ํฌ์ธํฐ๋ฅผ rax๋ก ๋๋ ค์ค๋ค. ๊ทธ๋ฐ๋ฐ main์ ๊ทธ rax๋ฅผ ์ด๋์๋ ์ฐ์ง ์๊ณ , ๋ฐ๋ก ๋ค์ ๋ช
๋ น์์ lea rax, "I have returned the flag :)"๋ก ๋ฎ์ด์จ ๋ฒ๋ฆฐ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์๋ด ๋ฌธ์์ด๋ง puts๋ก ์ถ๋ ฅํ๋ค. ๋ฐํ๊ฐ์ ํ์ธ(check)ํ์ง ์๊ณ ํ๋ ค๋ณด๋ด๋ ๊ฒ, ๊ทธ๊ฒ ์ด ๋ฌธ์ ์ ์ ๋ถ๋ค.
๊ทธ๋ ๋ค๋ฉด call์ด ๋๋๊ณ lea๊ฐ ์คํ๋๊ธฐ ์ง์ , ์ฆ ์ฃผ์ 0x4015dc์์ rax๋ ์์ง ํ๋๊ทธ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค. ์ฌ๊ธฐ์ ๋ธ๋ ์ดํฌํฌ์ธํธ๋ฅผ ๊ฑธ๋ฉด ๋๋ค.
๐ฏ ํ์ด โ ๋ฎ์ด์ฐ๊ธฐ ์ง์ $rax๋ฅผ ์ฝ๋๋ค
๋ฐ์ด๋๋ฆฌ๋ non-PIE๋ผ ์ฃผ์๊ฐ ๊ณ ์ (0x4015dc)์ด๋ค. gdb๋ก ๊ทธ ์ง์ ์ ๋ฉ์ถฐ rax๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ค.
gdb -q -batch -ex "break *0x004015dc" -ex "run" -ex 'printf "returned rax -> flag:\n"' -ex 'x/s $rax' ./check_return_value
0x4015dc์์ ๋ฉ์ถฐ x/s $rax๋ก ์ฝ์ผ๋ฉด ์กฐ๋ฆฝ์ด ๋๋ ๋ฌธ์์ด์ด ๊ทธ๋๋ก ๋์จ๋ค.
ooh you figured out me :) Flag is DH{0e82b5c5082e44a74dbb6d05e91387ee}์กฐ๋ฆฝ ํจ์ ์์ XORยท์นํ ๋จ๊ณ๋ฅผ ์์ผ๋ก ๋ค ๋์ง์ ์๋ ์์ง๋ง, ์ด์ฐจํผ ๋ก์ปฌ์์ ๋๋ ๋ฐ์ด๋๋ฆฌ๋ผ ๊ฒฐ๊ณผ ๋ฒํผ๋ฅผ ์คํ ์ค์ ์ฝ๋ ํธ์ด ํจ์ฌ ๋น ๋ฅด๋ค. ์ ์ ๋ถ์์ผ๋ก "์ด๋์ ๋ฒ๋ ค์ง๋์ง"๋ง ์ ํํ ์ง๊ณ , ๊ทธ ์ง์ ์ ๋ฐํ์์ผ๋ก ํ์ธํ ์ ์ด๋ค.
FLAG: DH{0e82b5c5082e44a74dbb6d05e91387ee}
๐ ๊ฒฐ๋ก
๋ฐํ๊ฐ๋ ๊ฒฐ๊ตญ ๋ฉ๋ชจ๋ฆฌ ์ด๋๊ฐ์ ์๋ค.
ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ํ๋ฉด์ ์ ๋ฟ๋ฆฐ๋ค๊ณ ๊ทธ ๊ฐ์ด ์๋ ๊ฒ ์๋๋ค. rax์ ์ค๋ ค ์์๊ณ , ๋ฎ์ด์ฐ๊ธฐ ์ ํ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ด์ ์์๋ค. ๊ทธ ํ์๊ฐ์ ๋ธ๋ ์ดํฌํฌ์ธํธ๋ก ์ก์ผ๋ฉด ๋๋ค.
์ ์ ์ผ๋ก ์ง์ ์ ์ง๊ณ , ๋ฐํ์์ผ๋ก ํ์ธํ๋ค.
main์ ๋์ค์ด์
๋ธํด "๋ฐํ๊ฐ์ด 0x4015dc์์ ๋ฒ๋ ค์ง๋ค"๋ ๊ฑธ ๋จผ์ ์ ํํ ์ง์ ๋์, gdb๋ ๋ฑ ํ ์ค(x/s $rax)๋ก ๋๋ฌ๋ค. ์กฐ๋ฆฝ ๋ก์ง ์ ์ฒด๋ฅผ ์ญ์ฐํ์ง ์๊ณ ๋ ๊ฒฐ๊ณผ๋ง ์ ํํ ํ์ํ๋ ๊ฒ ์ด๋ฐ ๋ฌธ์ ์ ์๋ น์ด๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ