面向返回的编程(ROP)
串联 ROP 小工具,绕过 NX/DEP,构建无需 Shellcode 的漏洞利用程序。
面向返回的编程(ROP) 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
ROP 的由来
有了 NX/DEP,注入的外壳代码无法执行。面向返回的编程(ROP)通过串联现有的小段代码序列(小工具)来绕过这一限制,这些序列以 ret 指令结尾。不会注入新代码——只使用栈和现有代码。
什么是 ROP 小工具?
小工具是一小段以 ret 结尾的指令序列,可以在二进制程序或已加载的库中找到。例如:pop rdi; ret、pop rsi; ret、mov eax, 0; ret。小工具是 ROP 链的基础构件。
查找小工具
用于在二进制程序中查找 ROP 小工具的工具:
# ROPgadget:
ROPgadget --binary ./vuln --rop
# ropper:
ropper -f ./vuln --search "pop rdi"
# pwntools:
from pwn import *
elf = ELF("./vuln")
rop = ROP(elf)
rop.find_gadget(["pop rdi", "ret"])构建 ROP 链
ROP 链是栈上的返回地址序列。当执行到被覆盖的返回地址时,程序会跳转到小工具 1(完成有用操作后执行 ret 返回);该小工具会弹出下一个地址并跳转到小工具 2,依此类推。
ret2plt 与 GOT 覆盖
ret2plt通过 PLT(过程链接表)调用函数——这对于调用 puts() 来泄露 libc 地址很有用,随后可以利用这些地址调用 system()。即使启用了 ASLR,PLT/GOT 结构对于 main 二进制程序来说仍然是可预测的(未启用 PIE 时)。
使用 ROP 绕过 ASLR
ROP 可以利用调用 puts(GOT_entry) 的小工具,从 GOT 中泄露 libc 函数地址。泄露的地址会揭示 libc 基址。计算 system() 的偏移量:system_addr = leak - libc.symbols["puts"] + libc.symbols["system"]。
SROP:面向信号返回的编程
SROP使用 sigreturn 系统调用加载伪造的信号上下文帧,从而通过一个小工具将所有寄存器设置为攻击者控制的值。当可用的小工具很少时,这种方法非常有用。
JOP 和 COP 变体
除了 ROP 之外:
- JOP(面向跳转的编程) — 串联以
jmp而不是ret结尾的小工具 - COP(面向调用的编程) — 串联以
call结尾的小工具
CFI(控制流完整性)等防御措施旨在阻止所有这些技术。
控制流完整性(CFI)
CFI强制要求间接分支(调用和返回)只能跳转到有效目标。它会通过将返回目标与影子栈或允许列表进行验证来破坏 ROP。Intel CET(控制流强制技术)在硬件层面实现了 CFI。
ROP 实际示例
通过 ROP 实现的 64 位 ret2libc:
# pwntools ROP chain example:
from pwn import *
p = process("./vuln")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf = ELF("./vuln")
rop = ROP(elf)
# Leak puts GOT to get libc base
rop.puts(elf.got["puts"])
rop.main()缓解措施总结
针对 ROP 的防护措施:
- CFI — 验证分支目标
- 影子栈(CET) — 受硬件保护的返回地址副本
- RELRO(完整) — 使 GOT 变为只读,防止覆盖
- PIE — 随机化二进制程序基址,需要信息泄露才能找到小工具
快速检查:ROP
什么是 ROP 小工具?
课程回顾
ROP 通过串联现有代码序列(以 ret 结尾的小工具)来绕过 NX/DEP,无需注入外壳代码。查找小工具的工具包括:ROPgadget、ropper。ret2plt 会泄露 libc 地址,从而击破 ASLR。防御措施包括:CFI、影子栈(Intel CET)、PIE 和完整 RELRO。ROP 是现代二进制漏洞利用的基础。
常见问题解答
「面向返回的编程(ROP)」课时是免费的吗?
是的 — 「面向返回的编程(ROP)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「面向返回的编程(ROP)」这节课中我会学到什么?
串联 ROP 小工具,绕过 NX/DEP,构建无需 Shellcode 的漏洞利用程序。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「面向返回的编程(ROP)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 栈缓冲区溢出
- 面向返回的编程(ROP)
- 格式化字符串漏洞
- 堆利用:释放后使用与堆喷射