0Pricing
Ethical Hacking Academy · 课时

内存与栈

了解溢出原理

内存与栈 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 内存与栈
  2. 通过模糊测试寻找崩溃
  3. 控制 EIP
  4. Shellcode 与漏洞利用
← 返回 Ethical Hacking Academy