堆栈缓冲区溢出检测机制?

Mechanisms for stack buffer overflow detection?

编译并运行以下内容:

 void main() {
  int array[10];
  array[10] = 2;
}

根据我的理解,这是堆栈运行。

GCC 似乎没有检测到问题。

只有当我使用附加标志 -fstack-protector-all 进行编译时,我才能获得堆栈跟踪。

对于没有 gcc 标志 -fstack-protector-all 编译和链接的二进制文件,有没有办法检测错误的非法内存访问 -fstack-protector-all,或者它将 运行 正常,然后进程将访问内存属于它吗?

首先,许多现代发行版将默认启用 -fstack-protector 和其他安全措施(_FORTIFY_SOURCE-fPIE 等),因此即使没有,您的程序也会得到一些保护你自找的。

其次,如果不是这种情况并且缓冲区溢出导致非常严重的错误(例如访问无效内存或覆盖return地址),内核将终止应用程序和转储核心。

更细微的错误(导致程序故障但不是以明显的方式),将不会被发现。没有例如,没有办法诊断它们。用 ASan 重新编译。

P.S。请记住,像您问题中的那样简单的单行缓冲区溢出往往会被编译器优化。我的 GCC 5.4.0 只是放弃了对 array[10].

的访问