arrow_back返回现场笔记
WEB SECURITY 已发布 9 Aug 2026

什么是缓冲区溢出?实战演练

通过实际的 C 代码示例、栈图和工具了解缓冲区溢出的工作原理。

缓冲区溢出发生在程序向一个固定大小的内存块写入超过该块容量的数据时。多余的字节会溅入相邻的内存,取决于缓冲区旁边存放的内容,你可能会破坏变量、导致程序崩溃或完全劫持执行流。它是软件安全中最古老的漏洞类之一,至今仍出现在 CTF、CVE 和嵌入式固件中。

存在漏洞的模式

这是 C 中的经典例子:

#include <string.h>

void greet(char *name) {
    char buffer[64];
    strcpy(buffer, name);
}

int main(int argc, char **argv) {
    greet(argv[1]);
    return 0;
}

strcpy 将你传给它的任何字符串复制到 buffer 中,不进行边界检查。如果 argv[1] 长度超过 64 字节,复制会继续越过数组末尾。在栈上,buffer 位于其他局部变量、已保存的寄存器,最后是返回地址下方——返回地址告诉 CPU 在 greet() 完成后跳到哪里。用你控制的地址覆盖返回地址,你就控制了接下来运行的内容。

为什么这仍然能编译和运行

C 和 C++ 对原始数组不进行自动边界检查。strcpygetssprintfstrcat 等函数会乐意写入缓冲区末尾之外,因为它们只关心空终止符或源长度,而不关心目标的实际大小。相比之下,strncpysnprintf 接收显式的大小参数并在此处停止。这个漏洞其实不是

本文由人工智能协助撰写,经 Michal Pilch(CISSP)审核并发布,Korra Studio。

准备好更进一步了吗?

这是来自 Korra Studio 知识库的笔记之一——该平台将每个主题与一对一指导相结合。

免费开始arrow_forward