Mic*_*l D 8 c gcc buffer-overflow fortify-source
由于-fstack-protector-strong
gcc中有一个选项可以检测堆栈粉碎.但是,它无法始终检测到堆栈缓冲区溢出.对于第一个函数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)
堆栈上的溢出要么难以检测,要么检测起来非常昂贵 - 选择你的毒药.
简而言之,当你有这个:
char a,b;
char *ptr=&a;
ptr[1] = 0;
Run Code Online (Sandbox Code Playgroud)
那么这在技术上是合法的:在堆栈上分配了属于该函数的空间.这非常危险.
因此,解决方案可能是在a
和之间添加间隙,并b
用模式填充它.但是,有些人实际上是按照上面的方式编写代码.所以你的编译器需要检测它.
或者,我们可以创建代码实际分配的所有字节的位图,然后检测所有代码以检查此映射.非常安全,非常慢,使您的内存使用量增加.从积极的方面来说,有一些工具可以帮助解决这个问题(比如Valgrind).
看看我要去哪里?
结论:在C语言中,没有很好的方法可以自动检测许多内存问题,因为语言和API通常过于草率.解决方案是将代码移动到辅助函数中,这些函数严格检查它们的参数,始终是正确的,并具有良好的单元测试覆盖率.
snprintf()
如果您有选择,请始终使用功能版本.如果旧代码使用不安全版本,请更改它.
归档时间: |
|
查看次数: |
11259 次 |
最近记录: |