如何关闭gcc编译器优化以启用缓冲区溢出


76

我正在处理一个家庭作业问题,该问题需要禁用编译器优化保护才能正常工作。我在ubuntu linux上使用gcc 4.4.1,但无法弄清楚哪个标志是正确的。我意识到这取决于体系结构-我的机器运行32位Intel处理器。

谢谢。

Answers:


104

那是个好问题。为了解决该问题,您还必须禁用ASLR,否则g()的地址将不可预测。

禁用ASLR:

禁用金丝雀:

在禁用金丝雀和ASLR之后,它应该是直接攻击,如“粉碎堆栈以获得乐趣和获利”中所述

以下是ubuntu中使用的安全功能的列表:https : //wiki.ubuntu.com/Security/Features 不必担心NX位,g()的地址将始终位于内存的可执行区域中因为它在TEXT内存段中。NX位仅在您尝试在堆栈或堆上执行shellcode时才起作用,此分配不需要此位。

现在去破坏EIP


5
谢谢,我会那样做的:)哦-如何重新启用保护以取消我的计算机?..我的猜测是sudo echo 1> / proc / sys / kernel / randomize_va_space
sa125 2010年

@ sa125是的,多数民众赞成在如何重新启用它。实际上,这就是您在系统运行时如何打开和关闭其他内核模块的方法;)
rook 2010年

14
似乎值得指出的是,在我的系统上randomize_va_space的默认值为2,而不是1,因此,如果要重新启用它,则需要事先进行检查。
Rushyo 2011年

4
实际上,g()的地址很可能不会被ASLR随机化,因为它是主要二进制文件的一部分。仅当使用-PIE编译二进制文件时,它才会被随机化。
罗伯特·拉尔森

33

乌尔姆(Urm),到目前为止,所有答案都错了,而鲁克(Rook)的答案是正确的。

输入:

其次是:

禁用ASLR,SSP / Propolice和Ubuntu的NoneXec(位于9.10中,并且相当容易解决,请参阅mprotect(2)技术将页面映射为可执行文件和jmp)应该会有所帮助,但是这些“安全功能”是通过绝对没有错误。如果没有-z execstack标志,则页面具有不可执行的堆栈标记。


4
您没有阅读伙计链接。如果您这样做了,您会知道他正在尝试执行g(),该函数已编译为二进制文件。这是函数的地址。当您尝试在堆或堆栈上执行Shellcode时,NX位起作用了,他的攻击要简单得多。
rook 2010年

我同意其他所有人都是完全错误的,很明显,我们是仅有的两个利用缓冲区溢出的人。但是我仍然认为我的答案更正确。
rook 2010年

嗯,只是碰到了链接-我认为这只是另一个通用名称,您是对的。我道歉。

我知道这是一篇旧文章,但是您不能将sudo与> <一起使用,因为它不允许这样做。该命令应为: echo 0 | sudo tee / proc / sys / kernel / randomize_va_space
Boogy

20

在较新的发行版(截至2016年)上,默认情况下似乎启用了PIE,因此在编译时需要显式禁用它。

以下是一些命令摘要,这些命令通常在本地进行缓冲区溢出练习时可能会有所帮助:

禁用金丝雀:

停用DEP:

禁用PIE:

禁用上面列出的所有保护机制(警告:仅用于本地测试):

对于32位计算机,您还需要添加-m32参数。


7

您不需要禁用ASLR即可产生缓冲区溢出!尽管启用了ASLR(kernel_randomize_va_space = 2),但除非编译的可执行文件为PIE,否则它不会生效。因此,除非您使用-fPIC -pieflag编译文件,否则ASLR将不会生效。

我认为仅通过禁用金丝雀-fno-stack-protector就足够了。如果要检查ASLR是否正常工作(必须设置位置独立代码),请使用:



2

我不会引用整个页面,但是可以在此处找到有关优化的完整手册:http : //gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-Options

从声音中,您至少需要-O0,默认值和:

-fmudflap -fmudflapth -fmudflapir

对于支持它的前端(C和C ++),请检测所有有风险的指针/数组取消引用操作,一些标准库字符串/堆函数以及一些其他具有范围/有效性测试的关联构造。如此检测的模块应不受缓冲区溢出,无效堆使用以及其他一些C / C ++编程错误的影响。该工具依赖于单独的运行时库(libmudflap),如果在链接时给出了-fmudflap,则该链接库将链接到程序中。所检测程序的运行时行为由MUDFLAP_OPTIONS环境变量控制。有关其选项,请参见en MUDFLAP_OPTIONS = -help a.out。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.