我记得很久以前读过如果我想在我的linux机箱上测试缓冲区溢出,我需要在系统中设置一些东西以允许它发生。我不记得究竟是什么,但我希望有人知道我在说什么。
我希望能够测试我的程序是否存在漏洞,并查看寄存器是否被覆盖。
编辑:我正在运行ubuntu 10.04
答案 0 :(得分:3)
一种选择是使用内存调试器,例如Valgrind。但请注意,Valgrind仅跟踪动态分配的内存上的缓冲区溢出。
如果您可以选择使用C ++而不是C,那么您可以切换到使用容器而不是原始数组,并利用GCC的“已检查容器”模式(请参阅GCC STL bound checking)。我确信其他编译器也提供类似的工具。
答案 1 :(得分:0)
使用gdb
调试程序追踪内存错误时,另一个提示(除Oli's answer之外)是禁用address space layout randomization,例如
echo 0 > /proc/sys/kernel/randomize_va_space
执行此操作后,同一个确定性程序的两次连续运行通常会mmap
个区域位于同一地址(从一个运行到另一个运行),这有助于大量调试gdb
(因为那时malloc
通常会在运行中的同一位置给出从一次运行到另一次运行的相同结果。)
您还可以使用watch
的{{1}}命令。特别是,如果在第一次运行中(禁用ASLR)您认为位置0x123456意外地发生了变化,您可以在第二次运行中给出gdb
以下命令:
gdb
然后 watch * (void**) 0x123456
会在此位置发生变化时中断(遗憾的是,它必须是gdb
- 已经编辑过)。