在研究缓冲区溢出时,我应该使用哪些版本的 GCC 或标志?
Posted
技术标签:
【中文标题】在研究缓冲区溢出时,我应该使用哪些版本的 GCC 或标志?【英文标题】:Which versions of GCC, or flags, should I use when studying buffer overflows? 【发布时间】:2014-12-02 10:29:48 【问题描述】:最近,作为计算机工程专业的本科生,我一直在研究缓冲区溢出问题。只是出于兴趣,我开始研究和研究缓冲区溢出,但在尝试在我自己的计算机上使用 GCC 4.9.1(在 Debian Jessie 中)编译的 C 程序中实现它们时遇到了困难。
我听说在较新的编译器中有各种堆栈溢出保护,所以我认为我的问题是我的编译器版本太新了。要么,要么我没有使用正确的标志进行编译(无)。
那么有没有好的 GCC 版本可供我用来测试缓冲区溢出?或者我应该使用特定标志来防止堆栈保护和金丝雀?
感谢您的宝贵时间。
【问题讨论】:
可能只使用最新版本就可以了。 HERE 是一些文档,因此您可以确定 gcc 调用将如何工作。 【参考方案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 平台的支持。
【讨论】:
以上是关于在研究缓冲区溢出时,我应该使用哪些版本的 GCC 或标志?的主要内容,如果未能解决你的问题,请参考以下文章