最近,我一直在研究缓冲区溢出作为计算机工程的本科生。仅仅出于兴趣,我开始研究和研究缓冲区溢出,但是当我在我的计算机上使用GCC 4.9.1(在Debian Jessie中)编译时,在我自己的C程序中实现它们时遇到了困难。
我听说新编译器中存在各种堆栈溢出保护,所以我认为我的问题是我的编译器版本太新了。要不然,或者我没有用正确的标志编译(无)。
为了测试缓冲区溢出,我是否有好的GCC版本?或者我应该使用特定的标志来防止堆栈保护和金丝雀?
感谢您的时间。
答案 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平台上增加了支持。