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

迈克尔·D

由于-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();
}
亚伦·迪古拉(Aaron Digulla)

堆栈上的溢出很难检测到,或者检测起来非常昂贵-选择毒药。

简而言之,当您拥有此功能时:

 char a,b;
 char *ptr=&a;
 ptr[1] = 0;

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

因此,解决方案可能是在a之间添加一个间隙,b用某种模式填充该间隙但是,好吧,实际上有些人如上所述编写代码。因此,您的编译器需要检测到这一点。

或者,我们可以创建代码已实际分配的所有字节的位图,然后检测所有代码以对照该图进行检查。非常安全,速度非常慢,会占用大量内存。从积极的方面来说,有一些工具可以帮助实现这一点(例如Valgrind)。

看看我要去哪里?

结论:在C语言中,没有自动检测许多内存问题的好方法,因为语言和API通常太草率。解决方案是将代码移入辅助函数,以严格检查其参数,始终正确无误,并具有良好的单元测试覆盖范围。

snprintf()如果可以选择,请始终使用功能的版本。如果旧代码使用了不安全的版本,请对其进行更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

从文件读取时如何停止堆栈缓冲区溢出?

来自分类Dev

堆栈上的缓冲区溢出

来自分类Dev

查找堆栈缓冲区溢出

来自分类Dev

利用堆栈缓冲区溢出

来自分类Dev

利用堆栈缓冲区溢出

来自分类Dev

关于堆栈缓冲区溢出漏洞

来自分类Dev

基于堆栈的缓冲区溢出

来自分类Dev

C 堆栈缓冲区溢出

来自分类Dev

为什么我的Interop代码会引发“堆栈cookie工具代码检测到基于堆栈的缓冲区溢出”异常?

来自分类Dev

如何实现缓冲区溢出

来自分类Dev

此代码如何使缓冲区溢出

来自分类Dev

堆栈地址不对应(试图了解缓冲区溢出)

来自分类Dev

执行不在堆栈上的shellcode(缓冲区溢出)

来自分类Dev

C中的堆栈粉碎/缓冲区溢出

来自分类Dev

sprintf缓冲区全局数据溢出-如何检测到它,Windows

来自分类Dev

Valgrind不会检测到缓冲区溢出

来自分类Dev

尝试缓冲区溢出

来自分类Dev

发生缓冲区溢出

来自分类Dev

防止缓冲区溢出

来自分类Dev

缓冲区溢出实现

来自分类Dev

缓冲区溢出漏洞

来自分类Dev

试验缓冲区溢出

来自分类Dev

缓冲区溢出漏洞

来自分类Dev

试验缓冲区溢出

来自分类Dev

缓冲区溢出 C

来自分类Dev

0x00363A09处未处理的异常,堆栈cookie工具代码检测到基于堆栈的缓冲区溢出

来自分类Dev

缓冲区溢出/溢出说明?

来自分类Dev

缓冲区溢出/溢出说明?