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

时间:2017-03-10 12:37:18

标签: security gcc stack overflow

编译并运行以下内容:

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

这是我的理解堆栈溢出。

GCC似乎没有发现问题。

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

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

1 个答案:

答案 0 :(得分:1)

首先,许多现代发行版默认启用-fstack-protector和其他安全措施(_FORTIFY_SOURCE-fPIE等),这样即使您没有询问,程序也会得到一些保护为了它。

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

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

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