面向返回的编程(ROP)
面向返回的编程(ROP) 是什么?
面向返回的编程(ROP)ROP 是一种代码复用利用技术,通过把以 RET 结尾的短指令序列(gadget)串成链来执行任意计算,而无需注入新代码。
Hovav Shacham 于 2007 年提出 ROP,用以绕过 DEP/W^X。攻击者破坏栈并写入一串地址,每个地址指向以 RET 结尾的短 gadget;每个 gadget 执行完后 RET 弹出下一个地址,从而仅利用已有可执行字节(libc、库、程序自身)构造出图灵完备的计算。变种包括 JOP(jmp 链)、COP(call 链)和 SROP(信号帧)。ROP 是推动 ASLR、CFI、栈金丝雀、影子栈、Intel CET 与内存安全语言标准化的主要原因,防御策略分别针对 gadget 可用性、控制流完整性或源代码层面的内存安全。
● 示例
- 01
利用 glibc 中的 pop-rdi/syscall gadget 链调用 execve("/bin/sh")。
- 02
通过 KASLR 信息泄露和 ROP 进入 commit_creds(prepare_kernel_cred(0)) 提权。
● 常见问题
面向返回的编程(ROP) 是什么?
ROP 是一种代码复用利用技术,通过把以 RET 结尾的短指令序列(gadget)串成链来执行任意计算,而无需注入新代码。 它属于网络安全的 应用安全 分类。
面向返回的编程(ROP) 是什么意思?
ROP 是一种代码复用利用技术,通过把以 RET 结尾的短指令序列(gadget)串成链来执行任意计算,而无需注入新代码。
面向返回的编程(ROP) 是如何工作的?
Hovav Shacham 于 2007 年提出 ROP,用以绕过 DEP/W^X。攻击者破坏栈并写入一串地址,每个地址指向以 RET 结尾的短 gadget;每个 gadget 执行完后 RET 弹出下一个地址,从而仅利用已有可执行字节(libc、库、程序自身)构造出图灵完备的计算。变种包括 JOP(jmp 链)、COP(call 链)和 SROP(信号帧)。ROP 是推动 ASLR、CFI、栈金丝雀、影子栈、Intel CET 与内存安全语言标准化的主要原因,防御策略分别针对 gadget 可用性、控制流完整性或源代码层面的内存安全。
如何防御 面向返回的编程(ROP)?
针对 面向返回的编程(ROP) 的防御通常结合技术控制与运营实践,详见上方完整定义。
面向返回的编程(ROP) 还有哪些其他名称?
常见的别称包括: ROP, 代码复用攻击, Return-to-libc。
● 相关术语
- appsec№ 064
地址空间布局随机化(ASLR)
ASLR 在每次运行时随机化代码、栈、堆和共享库的内存地址,使攻击者无法可靠预测利用所需的目标地址。
- appsec№ 303
数据执行保护(DEP)
DEP(又称 NX 位或 W^X)将内存页标记为不可执行,使攻击者无法运行注入到栈或堆中的 shellcode。
- appsec№ 217
控制流完整性(CFI)
控制流完整性(CFI)将程序的间接调用和返回限制在预先计算的合法目标集合内,阻断 ROP 与 JOP 等控制流劫持利用。
- appsec№ 1028
影子栈
影子栈是一条独立且受保护的栈,用于保存返回地址副本,使 CPU 能在正常栈被篡改时检测并阻止 ROP 攻击。
- appsec№ 545
Intel CET
Intel CET(控制流强制技术)是一项 CPU 功能,结合硬件影子栈与间接分支跟踪(IBT)以阻断 ROP、JOP 和 COP 利用。
- appsec№ 670
内存安全
内存安全指程序绝不读取、写入或执行未合法分配的内存,从而消除整类漏洞的属性。
● 参见
- № 1095栈金丝雀
- № 1058SMEP / SMAP
- № 671内存安全语言