二进制漏洞利用类别下,利用返回导向编程(Return-Oriented Programming, ROP)技术来绕过现代操作系统和编译器的安全防护机制是非常常见的技巧。下面列出的五种技术都是基于ROP思想的不同变体,它们被用于在不同场景下实现控制流劫持和任意代码执行。
-
Ret2Text (R2T) Ret2Text是一种ROP技术,其中攻击者构建一个ROP链,这个ROP链指向可执行文件的.text段(代码段)中的函数或代码片段。由于.text段通常是可执行的,攻击者可以利用这些代码片段来执行特定的指令序列,从而达到某种目的,如关闭ASLR或跳转到shellcode。
-
Ret2Shellcode (R2S) Ret2Shellcode是最直接的ROP利用方式之一,攻击者构建ROP链的目的是为了跳转到内存中的一段shellcode。shellcode是一小段机器码,能够实现特定功能,例如创建shell或网络连接。通常,shellcode会被放置在堆或栈中,然后ROP链会包含一个调用
pop eax; ret
类型的gadget来将EIP(或RIP)指向shellcode的起始位置。 -
Ret2Libc (R2L) Ret2Libc是一种ROP技术,它不依赖于可执行文件本身或shellcode的存在,而是利用libc(C标准库)中的函数和数据。攻击者寻找libc中的函数,如
system
或execve
,并通过ROP链调用这些函数,通常配合硬编码的字符串(如"/bin/sh"
)作为参数,从而实现任意命令执行。 -
Ret2Dl_resolve (R2DR) Ret2Dl_resolve是一种更高级的ROP技术,主要用于解决动态链接库(如libc)的地址未知的情况。攻击者可以利用
__libc_csu_init
函数,这是一个特殊的初始化函数,可以被用于调用dlopen
和dlsym
,从而动态解析libc中的其他函数地址,如system
。这样就可以在不知道确切libc版本的情况下执行任意代码。 -
Ret2VDSO (R2V) VDSO(Virtual Dynamic Shared Object)是Linux系统中用于提供系统调用的虚拟共享库。在某些情况下,攻击者可能利用VDSO中的代码来构造ROP链,比如调用
clock_gettime
等函数。虽然这种技术通常不会直接导致代码执行,但在某些场景下,如利用定时器溢出漏洞时,VDSO可以提供额外的控制流选项。