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

时间:2010-02-26 08:14:10

标签: c gcc buffer-overflow compiler-optimization

我正在研究homework problem,需要禁用编译器优化保护才能使其正常工作。我在ubuntu linux上使用gcc 4.4.1,但无法弄清楚哪些是正确的。我意识到它依赖于架构 - 我的机器运行32位英特尔处理器。

感谢。

6 个答案:

答案 0 :(得分:85)

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

禁用ASLR:

sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

禁用金丝雀:

gcc overflow.c -o overflow -fno-stack-protector

在禁用金丝雀和ASLR后,它应该像Smashing the Stack for Fun and Profit

中描述的那样直接攻击

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

现在去破解 EIP

答案 1 :(得分:27)

Urm,所有的答案到目前为止都是错误的,因为Rook的回答是正确的。

输入:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

其次是:

gcc -fno-stack-protector -z execstack -o bug bug.c

禁用ASLR,SSP / Propolice和Ubuntu的NoneXec(放在9.10中,并且相当简单,可以使用mprotect(2)技术将页面映射为可执行文件和jmp)应该有所帮助,但是这些“安全性”特征“绝不是绝对可靠的。没有`-z execstack'标志,页面具有不可执行的堆栈标记。

答案 2 :(得分:13)

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

这里有一些命令摘要,一般在本地播放缓冲区溢出练习时会有所帮助:

禁用金丝雀:

select image from airline where airline = '$airline'

停用DEP:

gcc vuln.c -o vuln_disable_canary -fno-stack-protector

禁用PIE:

gcc vuln.c -o vuln_disable_dep -z execstack

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

gcc vuln.c -o vuln_disable_pie -no-pie

对于32位计算机,您还需要添加gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie 参数。

答案 3 :(得分:5)

尝试-fno-stack-protector标记。

答案 4 :(得分:4)

我知道这是一个旧线程,但我想指出你不需要禁用ASLR来进行缓冲区溢出!尽管ASLR已启用(kernel_randomize_va_space = 2),但除非已编译的可执行文件为PIE,否则它将不会生效,因此除非您使用-fPIC -pie标志编译文件,否则ASLR将不会生效。

我认为只使用-fno-stack-protector禁用金丝雀就足够了。 如果要检查ASLR是否正常工作(必须设置位置无关代码),请使用:hardening-check executable_name

答案 5 :(得分: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环境变量。   请参阅env MUDFLAP_OPTIONS = -help a.out   对于它的选择。