如何closuresgcc编译器优化来启用缓冲区溢出

我正在做一个家庭作业问题 ,需要禁用编译器优化保护才能正常工作。 我在Ubuntu的Linux上使用gcc 4.4.1,但不知道哪个标志是正确的。 我意识到这是依赖于架构 – 我的机器运行W / 32位英特尔处理器。

谢谢。

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

禁用ASLR:

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

禁用金丝雀:

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

在金丝雀和ASLR被禁用后,它应该是一个简单的攻击,就像在粉碎乐趣和利润堆栈中描述的那样

这里是一个在Ubuntu中使用的安全function的列表: https : //wiki.ubuntu.com/Security/Features你不必担心NX位,g()的地址将永远在一个可执行的内存区域因为它在TEXT内存段内。 NX位只有在您尝试在堆栈或堆上执行shellcode时才会起作用,这对于此任务来说不是必需的。

现在去揍那个EIP

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

input:

 sudo echo 0 > /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)应该会有所帮助,但是这些“安全function”没有办法可靠。 如果没有`-z execstack'标志,页面就会有不可执行的堆栈标记。

在较新的发行版(截至2016年),PIE似乎默认启用,因此您需要在编译时明确禁用它。

下面是对一些缓冲区溢出练习在本地播放时可能有用的命令的总结:

禁用金丝雀:

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

禁用DEP:

 gcc vuln.c -o vuln_disable_dep -z execstack 

禁用PIE:

 gcc vuln.c -o vuln_disable_pie -no-pie 

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

 gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie 

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

试试-fno-stack-protector标志。

我知道这是一个旧的线程,但我想指出,你不需要禁用ASLR来做一个缓冲区溢出! 虽然ASLR是Enabled(kernel_randomize_va_space = 2),但是除非编译的可执行文件是PIE,否则它不会生效,所以除非你用-fPIC -pie标志编译你的文件,否则ASLR不会生效。

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

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

从它的声音你至less要-O0 ,默认和:

-fmudflap -fmudflapth -fmudflapir

对于支持它的前端(C和C ++),testing所有有风险的指针/数组解引用操作,一些标准库string/堆函数以及一些其他与范围/有效性testing相关联的结构。 如此装备的模块应该不受缓冲区溢出,无效堆使用以及一些其他类的C / C ++编程错误的影响。 该工具依赖于一个单独的运行时库(libmudflap),如果在链接时给出-fmudflap,它将链接到一个程序中。 仪器化程序的运行时行为由MUDFLAP_OPTIONS环境variables控制。 请参阅env MUDFLAP_OPTIONS = -help a.out的选项。