学习文献:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/basic_rop/
1. 栈溢出基本原理就不写了
列举一下常见的危险函数:
- 输入
- gets,直接读取一行,忽略'\x00'
- scanf
- vscanf
- 输出
- sprintf
- 字符串
- strcpy,字符串复制,遇到'\x00'停止
- strcat,字符串拼接,遇到'\x00'停止
- bcopy
2. 基础rop
ret2text
开启NX,无栈保护,32位文件
IDA中打开可以发现system以及/bin/sh,存在危险函数gets,直接修改ret
计算需要覆盖的偏移量
知道ebp和esp之后,结合s相对于esp的偏移量
exp
payload='a'*(0x6c+0x04)
cn.sendline(payload+p32(0x0804863A))
cn.interactive()
ret2shellcode
ret2shellcode,即控制程序执行 shellcode 代码。shellcode 指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统的 shell。一般来说,shellcode 需要我们自己填充。这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码。
在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限。
这是学习文献中的原话,链接上面有,之前我们看见有那个NX保护,也就是说相应区域的NX保护没开启,我们自己手动打shellcode来夺取权限