【问题标题】:setting up system for program debugging buffer overflow设置程序调试缓冲区溢出系统
【发布时间】:2011-12-19 00:05:26
【问题描述】:

我记得很久以前读过,如果我想在我的 linux 机器上测试缓冲区溢出,我需要在系统中设置一些东西以允许它发生。我不记得它的确切用途,但我希望有人知道我在说什么。

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

编辑:我正在运行 ubuntu 10.04

【问题讨论】:

  • 您似乎要求两件事:“缓冲区溢出”和“寄存器覆盖”。你能在你的术语上更小心一点吗?
  • 你坚持使用基于 ubuntu 的解决方案吗?

标签: c linux ubuntu buffer buffer-overflow


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

     echo 0 > /proc/sys/kernel/randomize_va_space
    

    这样做之后,同一确定性程序的两次连续运行通常会mmap 位于相同地址的区域(从一次运行到另一次运行),这有助于使用gdb 进行大量调试(因为通常malloc在运行中的同一给定位置,从一次运行到另一次运行给出相同的结果)。

    您也可以使用gdbwatch 命令。特别是,如果在第一次运行(禁用 ASLR)中,您发现位置 0x123456 发生了意外变化,您可以在第二次运行时向 gdb 提供以下命令:

     watch * (void**) 0x123456
    

    然后gdb 将在此位置更改时中断(遗憾的是,它必须已经是mmap-ed)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-02
      • 2012-05-19
      • 2011-12-19
      • 2015-12-16
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多