c - 识别/防止静态缓冲区溢出的工具和方法

标签 c buffer-overflow gcc4

是否有任何工具或方法可以识别静态定义数组中的缓冲区溢出(即 char[1234] 而不是 malloc(1234))?

昨天我花了大部分时间来追踪崩溃和奇怪的行为,最终证明是由以下行引起的:

// ensure string is nul terminated due to stupid snprintf
error_msg[error_msg_len] = '\0';

该索引显然导致写入超出数组范围。这会导致指针变量被破坏,进而导致该指针稍后出现意外行为。

我想到的三件事可以帮助缓解此类问题:

  1. 代码审查

    这还没有完成,但我正在努力。

  2. valgrind

    我在开发过程中经常使用 valgrind 来检测内存问题,但它不处理静态数组。在上面的例子中,它只向我展示了一些症状,例如被破坏的指针的 free() 无效。

  3. -fstack-protector-all

    过去,我曾使用 -fstack-protector-all 来检测像上面这样的溢出,但由于某些奇怪的原因,它在这种情况下没有标记任何内容。

那么任何人都可以提供关于如何识别此类超支的任何想法吗?要么通过改进上面的列表,要么通过全新的东西。

编辑:到目前为止,一些答案提到了相当昂贵的商业产品。在现阶段,我认为我无法说服当局购买这样的工具,因此我想将工具限制为便宜/免费。是的,一分钱一分货,但有所改进总比没有好。

最佳答案

静态分析工具能够检测一些缓冲区溢出。

例如使用以下代码:

char bla[1024];
int i;

for (i = 0; i <= 1024; i++)
    bla[i] = 0;

以下是 PC-Lint/flexelint 的报告:

tst.c 9 Warning 661: Possible access of out-of-bounds pointer (1 beyond end of data) by operator '[' [Reference: file tst.c: lines 8, 9]

关于c - 识别/防止静态缓冲区溢出的工具和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9036826/

相关文章:

c++ - 使用 crypto++ 库验证 openssl 签名

reverse-engineering - 搜索跳转时 WinDbg 范围错误

无法在 gcc ubuntu linux 中正确输入字符串

c++ - G++ 4.5.0 中的 std::forward_as_tuple

c++ - make_shared 创建 std::shared_ptr?海湾合作委员会 4.6.2

C - 不使用 realloc 的动态大小的结构指针数组?

c - 为什么下面的函数被调用了三次

c - InternetReadFile() 破坏 C 中的下载

exploit - 如何用python生成缓冲区溢出的有效负载?

c - 如何为小端编码奇数长度字节地址?