1

我的项目中有一个严重的错误。当我使用 gdb 打开 .core 时,它​​向我显示了类似的内容(为了便于阅读,我没有放置所有 gdb 输出):

这是非常非常可疑的,新编写的部分代码::

0x00000000004579fe in http_chunk_count_loop 
 (f=0x82e68dbf0, pl=0x817606e8a Address 0x817606e8a out of bounds)

这是代码中非常成熟的部分,可以正常工作很长时间::

0x000000000045c8a5 in packet_handler_http 
 (f=0x82e68dbf0, pl=0x817606e8a Address 0x817606e8a out of bounds)

好的,现在让我心烦意乱的是pl=0x817606e8a Address 0x817606e8a out of bounds,gdb 显示它在到达新的书面代码之前已经超出了界限。这让我想到了调用函数引起的问题packet_handler_http

但是packet_handler_http非常成熟,长时间工作没有问题。这让我误解了 gdb 输出。

问题出在packet_handler_http我猜,但由于这已经是工作代码,我很困惑,我的猜测是对的还是我错过了什么?

4

3 回答 3

4

要检测“内存错误”,您可能希望在 Valgrind 下运行该程序:http: //valgrind.org

如果使用符号(-g对于 gcc)编译程序,您可以非常可靠地检测到“越界”情况,直至发生错误的代码行,以及分配内存的代码行(如果有的话)。

于 2013-08-20T15:10:55.293 回答
2

问题出在 packet_handler_http 我猜

这种猜测不太可能是正确的:如果packet_handler_http真的接收到无效的指针,那么损坏就发生在它的“上游”。

这是代码中非常成熟的部分,可以运行很长时间没有问题

经常在代码中发现“没有问题”工作了 10 年以上的错误。此外,损坏可能发生在新添加的代码中,但会在其他地方引起问题。堆和堆栈缓冲区溢出通常就是这样。

正如之前建议的那样,在ValgrindAddress Sanitizer(也包含在 GCC-4.8 中)下运行您的可执行文件,并修复他们发现的任何问题。

于 2013-08-21T07:13:26.890 回答
2

谢谢你们的贡献,甚至 gdb 说相反,结果指针很好。

新代码中有一部分会导致越界问题。

有像 :: (goodpointer + offset) 这样的行,这个偏移量是 http 块大小,我从网络中获取它(数据嗅探)。还有一种攻击是这个偏移量非常大,导致整数溢出。这导致了越界问题。

我的结论:永远不要从网络中插入参数,并且 gdb 可能并不总是将参数正确地指向 coredump,因为在崩溃的那一刻,堆栈中的事情可能会变得混乱。

于 2013-08-22T07:49:14.287 回答