栈溢出与ROP攻击手册
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/stack-overflow-and-rop-xyu0
技能介绍
要解决的问题
NX 开启后栈不可执行,直接跳转到 shellcode 的老路走不通了;ASLR 让 libc 基址每次运行都变化,PIE 让二进制自身也随机化。现代漏洞利用的核心问题是:在寄存器、栈指针、可用 gadget 都受限的条件下,用已有代码片段拼出可预测的执行流,最终拿到任意地址执行。
技能如何工作
这套 playbook 按攻击链组织,每一层对应一个实际障碍:
- 栈布局基础:明确 32/64 位在返回地址宽度、canary 大小、参数传递方式上的差异,以及 64 位下
system()等调用要求RSP % 16 == 0的对齐约束,对齐不对时插入一个裸retgadget 修正。 - ret2libc:通过
puts@GOT、write系统调用或格式化字符串泄露 libc 基址,再拼入system("/bin/sh");或直接使用 one_gadget,但必须先核对寄存器与栈状态是否满足其约束条件。 - ROP 链构造:覆盖
ROPgadget、ropper、pwntools ROP、xrop四种工具在检索方式与适用场景上的差异,给出pop rdi; ret、pop rsi; pop r15; ret等关键 gadget 模式及其用途。 - ret2csu:利用几乎所有动态链接 ELF 都存在的
__libc_csu_init实现三参数调用,注意r12必须指向目标函数的指针(如 GOT 项),rbx=0、rbp=1用于跳过循环。 - ret2dlresolve:在没有 libc 泄露时伪造
Elf_Rel/Elf_Sym结构,让_dl_runtime_resolve解析出任意函数;64 位下对齐与版本检查更严格。 - SROP 与栈迁移:通过 sigreturn 从伪造的 Signal Frame 一次性恢复全部寄存器,或用
leave; ret、xchg rsp, rax把栈指针移到可控缓冲区。 - canary 绕过:按场景选择爆破、格式化字符串泄露、TLS 覆盖(
fs:[0x28])或信息泄露。
适用边界
ret2dlresolve 依赖在可写段伪造动态链接结构,静态二进制或完全没有可用泄露点时不适用;SROP 需要 glibc 的 sigreturn 支持。若漏洞位于堆而非栈,本技能的栈布局分析不适用,应转向 heap-exploitation。BROP、ret2vdso、JOP/COP 等扩展内容收录在高级参考文档中,适合二进制不公开或 gadget 极度匮乏的远程场景。
使用场景
- CTF pwn 题中目标开启 NX 且无 shellcode 执行点,需要构造 ret2libc 或 ROP 链拿到 shell。
- 拿到一个开启 ASLR 且不泄露 libc 地址的 64 位程序,需要用 ret2dlresolve 伪造动态链接结构解析出 system。
- 溢出可用长度很短,无法直接放下完整 ROP 链,需要先用 leave;ret 把栈迁移到可控缓冲区再执行。
- 程序开启 canary 保护且有格式化字符串漏洞,需要先泄露 canary 再拼接溢出载荷绕过检测。
适合人员
- CTF 战队 pwn 方向选手:比赛中需要在几十分钟内针对给定二进制写出完整利用链。
- 安全研究员:分析真实 CVE 中栈溢出漏洞,需要还原攻击者实际使用的 ROP 与泄露手法。
- 渗透测试工程师:在授权攻防演练中验证某服务是否可被栈溢出远程利用并给出绕过条件。
- 逆向工程师:研究二进制保护机制,需要对比 ret2csu、SROP 等技术在不同编译条件下的可行性。