ret2text ret2syscall ret2libc
ROP的介绍
_**Return Oriented Programming(面向返回的编程) **_主要是在栈溢出的基础上,利用程序中已有的小片段(gadgets)来改变某些寄存器或者变量的值,从而控制程序的执行流程,绕过 NX 的防御。
什么是gedget?
在二进制漏洞利用比如 ROP 攻击中,Gadget(中文常称指令片段)是指以 ret 指令结尾的、长度很短的连续机器指令序列.这些指令片段并不是程序刻意编写的,而是从程序的现有代码段(.text 段)中拼凑出来的。
在漏洞利用中,很多防护机制(比如 DEP/NX,即数据执行保护)会禁止直接执行栈上的恶意代码。此时攻击者无法直接注入 shellcode,只能通过拼接程序自身的 Gadget,构造一条「指令执行链」(即 ROP 链),间接实现攻击目的(比如调用 system(“/bin/sh”) 获取 shell)。
ret2text
_ret2text 控制程序本身已有的.text 代码 _属于 ROP 攻击中最基础的攻击方法,当程序存在完整的后门函数的时候,我们可以直接手动测出偏移,进行缓冲区溢出填充到 rbp/ebp 进而跳转到后门函数获取 shell。
_**BUUCTF[ jarvisoj_level0 ] **_用一道题目来讲解 ret2text
1 | int __fastcall main(int argc, const char **argv, const char **envp) |
通过 IDA 分析,可以任意读取 0x200 个字节的字符串,但和 rbp 的距离只有 0x80,是一个最基础的栈溢出。
有经验的可以一眼看出来输入 0x80+8 个字符串去覆盖即可(这道题好像没办法手动测量),找到后门函数地址
1 | from pwn import * |
构造 exp 后,我们直接运行ret2text.py可以拿到shell
ret2syscall
ret2sycall 就是通过执行 gadgets 改变寄存器的值然后控制程序执行系统调用。 当我们在程序中找不到可用的 system 函数但可以寻找到/bin/sh 的情况下,原理和 Shellcode 一样,不过是需要自己去寻找 gadgets。
ropper 的使用(寻找 gadgets)
1 | ropper -f ./ret2syscall --search "pop|ret" |
obdjump 的使用(寻找 /bin/sh)
1 | objdump -s -j .rodata ./your_pwn_file | grep -i "sh" |
32位程序的条件
对于ret2syscall来说,我们需要让程序调用execve(“/bin/sh”,NULL,NULL)去拿到shell
对于三十二位程序来说调用execve的函数步骤:
1)eax=0xb 2)ebx指向/bin/sh的地址 3)ecx=0 4)edx=0
最后执行int 0x80触发终端就可以成功会自行execve( )获取到shell
1 | from pwn import * |
64位程序的条件
1)将 RAX 寄存器的值设置为 0x3b; 2)将 RDI 寄存器的值设置为”/bin/sh”字符串的地址;3)将 RSI 和 RDX 寄存器的值都设置为 0;4) 最终触发 syscall 获得 shell
1 | from pwn import * |
找不到pop rax; ret怎么办?
用xor rax, rax + mov al, 0x3b替代:
1 | # 新增gadget地址 |
ret2syscall exp(另一种 gadgets)
1 | from pwn import * |
ret2libc
当程序中存在可执行的 libc 函数(如 system 等)我们可以选择 ret2libc 进行获取 shell。通常我们会选择寻找 system 函数和/bin/sh 字符串的地址进行攻击。在这里我们需要注意的问题是:如何在栈当中正确的布置函数和参数的位置。在 32 和 64 位程序调用的过程亦有不同。以下是存在 system 和 binsh 的情况
32 位程序 re2libc
在 32 位程序中,我们要按照调用顺序依次把函数压入栈中,所以我们构造的payload应该是这样的结构与顺序:
1 | b'a'*n(栈溢出直到返回地址) + p32(system函数地址) + b'xxxx' + p32("/bin/sh"字符串地址) |
1 | from pwn import * |
64 位程序 ret2libc
1 | from pwn import * |
延迟绑定
当我们在程序中无法寻找到 system 函数和”/bin/sh”字符串的时候,我们就需要用到 plt 和 got 表的延迟绑定。
更新: 2026-01-26 17:53:20
原文: https://www.yuque.com/idcm/wnemg9/qeoruymelg66r96p