C++ 栈溢出保护(Stack Canary):编译期与运行时防御机制

哈喽,各位好!今天咱们来聊聊C++里的一项重要安全特性:栈溢出保护,也就是大名鼎鼎的Stack Canary。别被这名字吓到,其实它就像矿井里的金丝雀一样,用来提前预警危险。 一、什么是栈溢出?(先打个预防针) 在深入Canary之前,咱们先快速回顾一下什么是栈溢出。想象一下,你的程序在内存里开辟了一块叫做“栈”的地方,用来存放函数调用时的局部变量、返回地址等信息。栈就像一摞盘子,后放的在上边,先放的在下边。 栈溢出,简单来说,就是你往这个盘子里放的东西太多了,超过了盘子的容量,溢出来了!更糟糕的是,如果这个溢出的东西覆盖了栈上的返回地址,那么当函数执行完毕准备返回时,就会跳转到被覆盖的地址,这可能会导致程序崩溃,甚至被恶意利用执行恶意代码。 举个例子: #include <iostream> #include <cstring> void vulnerable_function(char *input) { char buffer[10]; strcpy(buffer, input); // 危险!strcpy不检查边界 std::cout << …