栈缓冲区溢出
理解栈布局、溢出 EIP/RIP,并为存在漏洞的 C 二进制程序编写可运行的漏洞利用程序。
栈缓冲区溢出 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
什么是缓冲区溢出
缓冲区溢出发生在写入缓冲区的数据超过其容量时。多余数据会覆盖相邻内存,从而可能破坏控制结构并重定向程序执行。
栈内存布局
调用栈包含:局部变量(缓冲区)、保存的帧指针(SFP)以及返回地址(RIP/EIP)——函数返回后程序将从该地址继续执行。溢出局部缓冲区可能会覆盖返回地址。
经典栈破坏
如果程序调用 gets() 或 strcpy() 时不检查长度,攻击者就可以输入足够多的字节填满缓冲区,并将返回地址覆盖为外壳代码的地址或实用小工具的地址。
// Vulnerable C code:
void vuln() {
char buf[64];
gets(buf); // No bounds checking!
}查找偏移量
请使用模式生成来确定到达返回地址需要多少字节:
# Generate a cyclic pattern:
python3 -c "from pwn import *; print(cyclic(200))" | ./vuln
# After crash, find offset:
python3 -c "from pwn import *; print(cyclic_find(0x61616166))"防护措施:栈金丝雀
栈金丝雀是在局部变量与保存的返回地址之间放置的随机值。在返回前,程序会检查该值;如果它被覆盖,程序将终止。要利用经典溢出,必须绕过这项防护。
防护措施:ASLR
地址空间布局随机化(ASLR)会在每次执行时随机化栈、堆和库的基地址。如果没有当前地址的泄露,在 64 位系统上几乎不可能猜中跳转位置。
防护措施:NX/DEP
NX(不可执行)/ DEP(数据执行保护)会将栈标记为不可执行。注入缓冲区的外壳代码无法直接执行,这迫使攻击者使用面向返回的编程(ROP)。
泄露地址
为了绕过 ASLR,攻击者需要信息泄露:格式字符串漏洞、堆越界读取(例如 Heartbleed),或者被利用函数中可读取的指针。泄露一个地址就能揭示偏移量,从而计算出其他地址。
编写基本漏洞利用程序
无防护措施的基本 32 位栈溢出:
# Python exploit skeleton (pwntools):
from pwn import *
p = process("./vuln")
offset = 76
shellcode = asm(shellcraft.sh())
payload = shellcode + b"A" * (offset - len(shellcode)) + p32(stack_addr)
p.sendline(payload)
p.interactive()ret2libc 技术
ret2libc通过跳转到 libc 函数(例如 system())而不是执行外壳代码来绕过 NX。攻击者会用 system 的地址覆盖返回地址,并将 "/bin/sh" 作为参数传入。
漏洞利用开发工具
必备工具:
- pwntools — Python 漏洞利用库
- GDB + pwndbg/peda — 带有漏洞利用辅助功能的调试器
- checksec — 显示二进制程序的防护措施
- ROPgadget / ropper — 查找 ROP 链
checksec --file=./vuln快速检查:栈溢出
哪种缓解措施会在局部变量和保存的返回地址之间放置一个随机值,并在该值被覆盖时终止程序?
课程回顾
栈缓冲区溢出会通过将数据写入超出缓冲区边界的位置来覆盖返回地址。防护措施包括栈金丝雀(检测覆盖)、ASLR(随机化地址)以及 NX/DEP(使栈不可执行)。ret2libc 可以绕过 NX。信息泄露可以击破 ASLR。pwntools 简化了漏洞利用开发。
常见问题解答
「栈缓冲区溢出」课时是免费的吗?
是的 — 「栈缓冲区溢出」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「栈缓冲区溢出」这节课中我会学到什么?
理解栈布局、溢出 EIP/RIP,并为存在漏洞的 C 二进制程序编写可运行的漏洞利用程序。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「栈缓冲区溢出」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。