GCC如何检测堆栈缓冲区溢出

Mic*_*l D 8 c gcc buffer-overflow fortify-source

由于-fstack-protector-stronggcc中有一个选项可以检测堆栈粉碎.但是,它无法始终检测到堆栈缓冲区溢出.对于第一个函数func,当我输入10个字符串更多字符串时,程序并不总是崩溃.我的问题是有一种方法来检测堆栈缓冲区溢出.

void func()
{
    char array[10];
    gets(array);
}

void func2()
{
    char buffer[10];
    int n = sprintf(buffer, "%s", "abcdefghpapeas");
    printf("aaaa [%d], [%s]\n", n, buffer);
}

int main ()
{
   func();
   func2();
}
Run Code Online (Sandbox Code Playgroud)

Aar*_*lla 8

堆栈上的溢出要么难以检测,要么检测起来非常昂贵 - 选择你的毒药.

简而言之,当你有这个:

 char a,b;
 char *ptr=&a;
 ptr[1] = 0;
Run Code Online (Sandbox Code Playgroud)

那么这在技术上是合法的:在堆栈上分配了属于该函数的空间.这非常危险.

因此,解决方案可能是在a和之间添加间隙,并b用模式填充它.但是,有些人实际上是按照上面的方式编写代码.所以你的编译器需要检测它.

或者,我们可以创建代码实际分配的所有字节的位图,然后检测所有代码以检查此映射.非常安全,非常慢,使您的内存使用量增加.从积极的方面来说,有一些工具可以帮助解决这个问题(比如Valgrind).

看看我要去哪里?

结论:在C语言中,没有很好的方法可以自动检测许多内存问题,因为语言和API通常过于草率.解决方案是将代码移动到辅助函数中,这些函数严格检查它们的参数,始终是正确的,并具有良好的单元测试覆盖率.

snprintf()如果您有选择,请始终使用功能版本.如果旧代码使用不安全版本,请更改它.

  • 语言并不马虎,程序员才是。:) (2认同)
  • 编写语言和库的程序员很草率,这反映在产品中. (2认同)