内存与栈
了解溢出原理
内存与栈 是 CoddyKit 上的免费 Ethical Hacking Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Ethical Hacking Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Ethical Hacking Academy 课程共包含 4 节课。
进程内存布局
程序运行时,操作系统会为它分配一个包含不同区域的内存布局:文本段(代码)、数据段/BSS(全局变量)、堆(动态分配)以及栈。
缓冲区溢出最常利用栈,因此理解栈至关重要。
什么是栈?
栈是一块用于函数调用的内存区域,用来存储局部变量、函数参数和返回地址。
在 x86 架构上,栈会向下增长:压入数据会使栈指针向较低地址移动。发生溢出时,这一方向非常重要。
栈帧
每次函数调用都会创建一个栈帧。栈帧通常包含局部变量、保存的基址指针(EBP)和返回地址(保存的 EIP)。
函数结束后,返回地址会告诉 CPU 应该从哪里继续执行。控制返回地址是栈溢出利用的核心。
关键寄存器
在 32 位 x86 中,重要的寄存器包括:
- ESP:栈指针,指向栈顶。
- EBP:基址指针,是当前栈帧的锚点。
- EIP:指令指针,保存下一条指令的地址。
如果您能够控制 EIP,就能够控制执行流程。
什么是缓冲区?
缓冲区是一块固定大小的内存区域,例如局部字符数组。程序期望数据能够放入其中。
如果程序在未检查长度的情况下复制了超出缓冲区容量的数据,多出的部分就会溢出到相邻内存中。
char buffer[64];
strcpy(buffer, user_input); // no bounds check溢出
当输入超过缓冲区大小并覆盖栈上相邻数据时,就会发生缓冲区溢出。
由于保存的 EBP 和返回地址位于局部缓冲区之后,足够大的输入就可以覆盖返回地址,劫持控制流。
危险函数
溢出通常源于不检查长度的不安全 C 函数:
strcpy、strcat、sprintf、gets。
像 strncpy 或 snprintf 这样的更安全替代函数会限制大小,但旧代码中仍充斥着这些危险函数。
gets(buffer); // never use: no length limit at all覆盖 EIP 后您将获得什么
易受攻击的函数返回时,CPU 会将(此时已由攻击者控制的)返回地址弹入 EIP,然后跳转到该地址。
如果将 EIP 指向您注入的机器代码(外壳代码),CPU 就会以该程序的权限执行它。
小端寻址
x86 使用小端序:多字节值会先存储最低有效字节。要用 0x080414C3 覆盖返回地址,您需要按相反顺序写入这些字节。
弄错字节序是初学者常犯的错误,会导致漏洞利用无声地失败。
address 0x080414C3 -> bytes \xc3\x14\x04\x08现代防护机制
现代系统加入了会增加漏洞利用难度的防御机制:
- DEP/NX:将栈标记为不可执行。
- ASLR:随机化内存地址。
- 栈金丝雀:在返回前检测覆盖。
本课程将重点讲解经典情形(关闭防护机制),以便教授基础知识。
为什么这仍然重要
虽然现代防御机制让经典的栈溢出更加困难,但基础知识仍然至关重要。嵌入式系统、物联网设备和旧版软件通常完全没有这些防护机制。
掌握基本情形也是学习 ROP 等绕过现代缓解措施的高级技术的前提。
快速检查
请回忆攻击者最终想要控制哪个值。
回顾
现在您已经理解了基础知识:
- 栈存储局部变量、保存的 EBP 和返回地址,并且向下增长。
- ESP、EBP、EIP 是 x86 的关键寄存器;控制 EIP 就能控制执行过程。
strcpy和gets等不安全函数会导致溢出。- x86 使用小端序;现代防御机制包括 DEP、ASLR 和金丝雀。
接下来,您将对程序进行模糊测试,以找出崩溃偏移量。
常见问题解答
「内存与栈」课时是免费的吗?
是的 — 「内存与栈」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Ethical Hacking Academy 课程的其余内容,请升级到 CoddyKit PRO。 Ethical Hacking Academy 课程共包含 4 节课。
「内存与栈」这节课中我会学到什么?
了解溢出原理 你通过在浏览器中直接运行的动手代码来练习 Ethical Hacking Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Ethical Hacking Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Ethical Hacking Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「内存与栈」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Ethical Hacking Academy 课中编写并运行代码吗?
能。每节 Ethical Hacking Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。