需要有关缓冲区溢出的帮助

时间:2010-04-30 18:43:29

标签: c stack buffer-overflow

我有一个缓冲区溢出我绝对看不出来(在C中)。首先,它只发生在10%的时间左右。它每次从数据库中提取的数据在执行之间似乎并没有那么大的差别......至少在不同的情况下我找不到任何可辨别的模式。来自Visual Studio的确切消息是:

  

发生了缓冲区溢出   hub.exe已经破坏了   程序的内部状态。按   中断调试程序或继续   终止程序。

     

有关详细信息,请参阅帮助主题   '如何调试缓冲区溢出问题'。

如果我调试,我发现它在__report_gsfailure()中被破坏了,我很确定它来自编译器上的/ GS标志,并且还表示这是堆栈上的溢出而不是堆。我也可以看到它在离开时抛出的功能,但我看不到会导致这种行为的任何东西,该功能也存在了很长时间(10年以上,虽然有一些小修改)据我所知,这从未发生过。

我发布了该函数的代码,但是它很长并且引用了很多专有函数/变量/等。

我基本上只是想找一些我应该寻找的东西,我没有或者可能有些工具可能有所帮助。不幸的是,我发现的几乎所有工具只能帮助调试堆上的溢出,除非我弄错了,否则它就在堆栈中。提前谢谢。

5 个答案:

答案 0 :(得分:3)

你可以尝试在缓冲区的任一端放置一些局部变量,或者甚至将标记放入(略微扩展的)缓冲区本身,如果这些值不是你认为的那样,则触发断点。显然,使用数据中不太可能的模式是个好主意。

答案 1 :(得分:2)

虽然它在Windows中无法帮助你,Valgrind是迄今为止检测不良内存行为的最佳工具。

如果你正在调试堆栈,你需要使用低级工具 - 在任何潜在的嫌疑人周围放置一个金丝雀在堆栈框架中(可能是一个填充了类似0xA5的缓冲区)。在调试器中运行该程序,查看哪些canaries不再是正确的大小并包含正确的内容。你会吞噬大量的堆栈,但它可以帮助你准确发现正在发生的事情。

答案 2 :(得分:1)

我过去做过的一件事就是帮助缩小像这样的神秘漏洞,创建一个名为checkpoint的全局可见性变量。在罪魁祸首功能中,我将checkpoint = 0;设置为第一行。然后,我在函数调用或内存操作之前和之后添加了++checkpoint;语句,我甚至远程怀疑它可能会导致越界内存引用(加上其余的代码,以便我有一个检查点)至少每10行左右)。当您的程序崩溃时,checkpoint的值将缩小您需要关注的一系列代码范围。这可能有点矫枉过正,我在嵌入式系统上做这种事情(不能使用像valgrind这样的工具),但它应该仍然有用。

答案 3 :(得分:0)

将其包装在异常处理程序中,并在发生时转储有用信息。

答案 4 :(得分:0)

这个程序是否完全递归?如果是这样,我检查那里以确保你没有无限的递归错误。如果您无法手动查看,有时您可以通过暂停并观察堆栈来在调试器中捕获它。