【发布时间】:2013-09-20 19:57:51
【问题描述】:
我有一个指针 (**A) 指向另一个指针 (*B)。在程序中的某个地方,B 正在损坏。但是,B 在存储在*A 之前已损坏。 B 并不总是位于相同的地址(&B 并不总是相同)。但是 B 总是被相同的值破坏(B 总是相同的)。我知道这一点是因为我有一个损坏检测例程,它查看要存储在 *A 上的 next 值,所以我只知道它已经损坏的点。
我想要(当然)是找出B 被破坏的地方。
我已经在A 上尝试了一个 gdb 观察点,它会在 A 指向 (*A) 的任何位置上自动生成一个观察点,希望在 B 第一次存储在 *A 时捕获它, 在它不再存储在 *A 之前,它会损坏,然后重新存储在 *A 上。
watch A
commands
silent
watch *A
commands
silent
if *A == magicalcorruptedvalue
where
end
end
end
但问题是,对于硬件观察点,太多的中间内容存储在*A 上,所以我很快就用完了观察点。我没有尝试过软件观察点,因为它们不适用于线程。
在这一点上,我认为唯一的解决方案是返回并更仔细地阅读代码(始终是一个不错的选择),构建更多的单元测试,或者创建一个专门的线程来持续扫描所有分配的内存对于这个值。
但是,我怀疑我不是第一个遇到这个问题的人。一个更通用表达这个问题的方式可能是:当所有简单的技术都失败时,有哪些技术可以调试缓冲区溢出?
元参数:
在 Linux 上
这是一个多线程回调样式的应用程序。
【问题讨论】:
-
为什么不在 B 上设置一个写观察点?
-
因为我不知道 B 是什么,直到 after 它已损坏。我只知道 A 是什么,并且它会在某个时候指向某个已损坏的 B。我想实际上我可能已经弄清楚了,但是每当 A 更改时,它需要复杂的 gdb 调试来动态删除和设置新的观察点。如果我确实这样做了,我会在这里为下一个不幸进入调试地狱的人发布答案。
-
另外,我应该提一下,B 肯定会在损坏发生之前 存储在 A 上。否则根本就无法处理 B。
标签: c gdb buffer-overflow