0Pricing
Cyber Security Academy · 课时

面向返回的编程(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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 栈缓冲区溢出
  2. 面向返回的编程(ROP)
  3. 格式化字符串漏洞
  4. 堆利用:释放后使用与堆喷射
← 返回 Cyber Security Academy