【问题标题】:Which versions of GCC, or flags, should I use when studying buffer overflows?在研究缓冲区溢出时,我应该使用哪些版本的 GCC 或标志?
【发布时间】:2014-12-02 10:29:48
【问题描述】:

最近,作为计算机工程专业的本科生,我一直在研究缓冲区溢出问题。只是出于兴趣,我开始研究和研究缓冲区溢出,但在尝试在我自己的计算机上使用 GCC 4.9.1(在 Debian Jessie 中)编译的 C 程序中实现它们时遇到了困难。

我听说在较新的编译器中有各种堆栈溢出保护,所以我认为我的问题是我的编译器版本太新了。要么,要么我没有使用正确的标志进行编译(无)。

那么有没有好的 GCC 版本可供我用来测试缓冲区溢出?或者我应该使用特定标志来防止堆栈保护和金丝雀?

感谢您的宝贵时间。

【问题讨论】:

  • 可能只使用最新版本就可以了。 HERE 是一些文档,因此您可以确定 gcc 调用将如何工作。

标签: c linux gcc stack stack-overflow


【解决方案1】:

使用-zexecstack -fno-stack-protector 禁用堆栈帧保护和使用gcc 的不可执行堆栈。

在您的 Linux 系统上,您还必须使用以下方法禁用地址随机化 (ASLR):

echo 0 > /proc/sys/kernel/randomize_va_space

【讨论】:

  • 我尝试将 randomize_va_space 设置为 0,并使用 -zexecstack -fnostackprotector 编译了我的应用程序,但是它仍然无法正常工作。我只是想重现here 列出的结果。
  • @Macslayer 不起作用 不多说。我建议你问一个(新的)更清晰的问题,包括你做了什么(包括一个测试用例)、你期望什么以及你得到什么。
  • 我已经指定我正在运行与提供的链接完全相同的代码。无论如何,here 是指向新问题的链接。
【解决方案2】:

在 gcc 中使用 -fno-stack-protector 选项来禁用堆栈粉碎保护。

【讨论】:

    【解决方案3】:

    最新版本的 GCC (>= 4.8) 包含 AddressSanitizer-fsanitize=address 选项。来自4.8 Realease Notes

    AddressSanitizer 是一种快速内存错误检测器,已添加并 可以通过-fsanitize=address 启用。内存访问指令将 检测堆、堆栈和全局缓冲区溢出 以及释放后使用的错误。要获得更好的堆栈跟踪,请使用 -fno-omit-frame-pointer。 AddressSanitizer 在 IA-32/x86-64/x32/PowerPC/PowerPC64 GNU/Linux 和 x86-64 Darwin 上可用。

    GCC 4.9 增加了对 ARM 平台的支持。

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2017-04-08
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      相关资源
      最近更新 更多