You are on page 1of 3

ROP(Return-Oriented Programming)攻击是一种利用现有程序的代码片段(通常称为

gadget)来构造恶意代码执行的攻击方式,用于绕过数据执行保护(DEP)等安全机制。下
面将详细介绍 ROP 攻击的报告。
(一) ROP 攻击简介
ROP 攻击利用程序的已有代码片段(gadgets)来组合执行,绕过数据执行保护(如 DEP)
和代码注入检测(如 W^X),而不是注入新的恶意代码。这些片段是程序中已有的,通常以
返回指令(ret)结尾,因此可以通过构建一个返回地址链来串联这些片段,以实现攻击者
的目标。它主要针对使用栈保护机制的程序,通过利用程序运行时的内存布局,将原有代码
片段(gadget)链接成恶意代码来执行。
(二) ROP 攻击的步骤
1.信息收集:寻找目标程序中的漏洞,例如缓冲区溢出。攻击者需要收集目标程序的信息,
包括内存布局、可执行模块、函数调用等。
2.寻找 gadget:通过分析程序代码,找到可利用的 gadgets,这些片段通常包括 pop、ret
等指令。这些 gadgets 通常以 ret 指令结尾,且能够执行有用的操作。
3.构建 ROP 链:将多个 gadgets 的地址依次放置在栈上,形成 ROP 链,实现一系列恶意操
作。
4.触发 ROP 链:利用漏洞或其他手段改变程序的控制流,跳转到构造好的 ROP 链执行。
(三)静态链接与动态链接
1.静态链接:在编译时将程序的代码和库函数代码合并成一个可执行文件。这样程序在运行
时不需要加载外部库,但会导致可执行文件较大。
2.动态链接:在编译时只包含程序的代码,而库函数的代码在程序运行时才加载。这样可执
行文件较小,但需要依赖外部库。
在 ROP 攻击中,了解目标程序的链接方式是至关重要的。动态链接涉及在运行时加载共享
库,而静态链接则在编译时将库链接到可执行文件中。攻击者需要考虑这两种链接方式,以
确定可用的 gadgets。
(四)延迟绑定
延迟绑定是一种优化技术,允许在运行时解析函数地址。ROP 攻击者可能利用延迟绑定的
特性,通过泄漏或推测目标程序中的函数地址,以构建有效的 ROP 链。延迟绑定在程序运
行时才去解析和绑定函数调用的地址。这样可以提高程序的启动速度,减少内存占用。
(五)Gadget
Gadget 是指程序中短小的代码片段,通常以 ret 指令结束。这些片段由程序本身提供,攻
击者通过巧妙地组合这些 gadgets,构建 ROP 链来实现攻击。在 ROP(Return-Oriented
Programming)攻击中,这些片段通常是已经存在于程序内存中的,由于它们的结构可以被
攻击者利用来实现攻击目的。这些“gadget”片段通常是由程序的代码段中的一系列指令组成,
并且它们并不是程序本身原本预期执行的完整功能。攻击者可以通过在程序内部的这些
“gadget”之间进行跳转,逐步构建出执行恶意操作所需的指令序列,绕过安全防护机制并最
终达到攻击目的。使用这种方式,攻击者可以利用程序原本存在的代码段来实现他们的恶意
行为,而不需要注入新的恶意代码。
(六)利用 ROP 进行栈迁移
ROP 攻击可能需要在攻击过程中进行栈迁移,以确保攻击者有足够的空间来构建 ROP 链。
这可能涉及调整栈指针、利用栈上的数据等技术。
栈迁移通常包括以下步骤:
寻找 gadgets: 在程序的可执行内存中寻找已经存在的代码片段(gadgets),这些片段通
常是一系列指令的序列,它们以返回指令(如 ret 或者函数返回)结束。这些片段可以用于
构建攻击载荷。
构建 ROP 链: 将这些 gadgets 串联在一起,形成 ROP 链。ROP 链是一系列 gadgets 的地
址,它们依次执行以完成攻击者的目的,比如修改栈上的数据、调用特定函数等。
执行栈迁移: 修改程序的栈,使其指向构建好的 ROP 链。这样,当程序执行返回指令时,
控制流会被转移到攻击者构建的 ROP 链上。
(七)例子
假设目标程序存在一个栈溢出漏洞,允许攻击者覆盖程序的返回地址。攻击者可以利用此漏
洞进行 ROP 攻击。
例子 1: 执行/bin/sh 的系统调用
假设程序中已经存在 int 0x80 这样的指令,用于触发系统调用。攻击者可以构造 ROP 链来
执行 execve("/bin/sh", NULL, NULL)。

# ROP 链
pop eax ; 将下一个值弹出到寄存器 eax
pop ebx ; 将下一个值弹出到寄存器 ebx
pop ecx ; 将下一个值弹出到寄存器 ecx
int 0x80 ; 触发系统调用

# 参数
/bin/sh\x00 ; 字符串 "/bin/sh",以 null 结尾

# ROP 链的值
0x080483e1 ; pop eax ; ret
0xb ; 系统调用号(execve)
0x080de001 ; pop ebx ; ret
/bin/sh\x00 ; 参数 1: 文件路径
0x41414141 ; 在实际攻击中,这里可能是填充用的任意值
0x080e306d ; pop ecx ; ret
0x0 ; 参数 2: 环境变量为空
0x0806c943 ; int 0x80 ; ret

例子 2: 关闭文件描述符
这个例子演示如何使用 ROP 链关闭文件描述符。

# ROP 链
pop ebx ; 将下一个值弹出到寄存器 ebx
mov eax, 0x6 ; 将 6 赋值给 eax 寄存器(close 系统调用号)
int 0x80 ; 触发系统调用

# 参数
3 ; 文件描述符

# ROP 链的值
0x08056334 ; pop ebx ; ret
0x3 ; 文件描述符

这里的 ROP 链会关闭文件描述符为 3 的文件。

结论
ROP 攻击作为一种高级的内存攻击技术,利用了现有代码片段构造出恶意执行代码,因此
更难被检测和防御。对于开发人员来说,编写安全的代码、进行输入验证和采用内存保护技
术是防范 ROP 攻击的关键。

You might also like