在研究缓冲区溢出时,我应该使用哪些版本的GCC或标志?

时间:2014-10-07 21:16:44

标签: c linux gcc stack stack-overflow

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

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

为了测试缓冲区溢出,我是否有好的GCC版本?或者我应该使用特定的标志来防止堆栈保护和金丝雀?

感谢您的时间。

3 个答案:

答案 0 :(得分:4)

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

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

echo 0 > /proc/sys/kernel/randomize_va_space

答案 1 :(得分:3)

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

答案 2 :(得分: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平台上增加了支持。