2011-12-19 52 views
0

我记得很久以前阅读,如果我想测试我的Linux盒缓冲区溢出,我需要在系统中设置一些东西,让它发生。我不记得究竟是什么,但我希望有人知道我在说什么。设置系统为程序调试缓冲区溢出

我希望能够测试我的漏洞程序,并查看寄存器是否被覆盖。

编辑:我运行Ubuntu 10.04

+2

valgrind,也许? – fge 2011-12-19 00:07:55

+0

你似乎在问两件事:“缓冲区溢出”和“寄存器覆盖”。你可以在术语中多加小心一点吗? – dmckee 2011-12-19 00:56:00

+0

你坚持使用基于ubuntu的解决方案吗?用于'-D_GLIBCXX_DEBUG'的 – 2011-12-19 05:51:51

回答

3

一种选择是使用内存调试如Valgrind。但是,请注意,Valgrind仅跟踪动态分配内存上的缓冲区溢出。

如果您可以选择使用C++而不是C,那么您可以切换到使用容器而不是原始数组,并利用GCC的“检查容器”模式(请参阅GCC STL bound checking)。我相信其他编译器也提供类似的工具。

+0

+1 – 2011-12-19 00:13:29

0

当使用gdb调试器追踪内存错误时,另一个提示(另外Oli's answer)将禁用address space layout randomization,例如,

echo 0 > /proc/sys/kernel/randomize_va_space 

这样做之后,连续两次相同的确定性计划的运行通常会在同一地址(从一次运行到另一个),这有助于gdb(因为那时malloc通常给人的很多调试mmap地区从一次运行到另一次运行的相同结果,在运行中的相同给定位置)。

您也可以使用gdbwatch命令。特别是,如果在第一次运行(与ASLR禁用),你的身影,该位置为0x123456被unexepectedly改变,你可以在它的第二轮给gdb以下命令:

watch * (void**) 0x123456 

然后gdb将打破此位置发生变化时(不幸的是,它必须是mmap -ed已经)。