我正在处理一道作业问题,需要禁用编译器优化保护才能使其正常工作。我正在使用 Ubuntu Linux 上的 gcc 4.4.1,但无法确定正确的参数。我意识到这取决于架构 - 我的机器运行在32位英特尔处理器上。
谢谢。
我正在处理一道作业问题,需要禁用编译器优化保护才能使其正常工作。我正在使用 Ubuntu Linux 上的 gcc 4.4.1,但无法确定正确的参数。我意识到这取决于架构 - 我的机器运行在32位英特尔处理器上。
谢谢。
这是一个很好的问题。为了解决这个问题,你还需要禁用ASLR,否则g()的地址将无法预测。
禁用ASLR:
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
禁用 canaries:
gcc overflow.c -o overflow -fno-stack-protector
嗯,到目前为止所有的答案都是错误的,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`标志,页面具有非可执行堆栈标记。
在新的发行版中(截至2016年),PIE似乎已经默认启用,因此在编译时需要显式地禁用它。
以下是一些常见本地缓冲区溢出练习中有用的命令摘要:
禁用canary:
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
禁用上述列出的所有保护机制(警告:仅供本地测试使用):
gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie
对于32位机器,您还需要添加-m32
参数。
-m32
。此外,您可以使用-fno-pie
让编译器生成不涉及PIE的汇编代码,也可以使用-no-pie
来防止将该机器码链接到PIE中。对于32位模式,-fno-pie
将显着简化汇编代码,删除像call __x86.get_pc_thunk.bx
这样的垃圾。对于64位模式,主要允许使用mov
-immediate而不是RIP相对LEA用于静态地址,并且更有效地索引静态数组。 - Peter Cordes尝试使用-fno-stack-protector
标志。
kernel_randomize_va_space = 2
),但除非编译的可执行文件是PIE,否则它将不会生效。因此,除非您使用-fPIC -pie
标志编译文件,否则ASLR将不会生效。-fno-stack-protector
禁用堆栈保护就足够了。如果您想检查ASLR是否起作用(必须设置位置无关代码),请使用:hardening-check executable_name
-O0
(默认值) 以及以下选项:
-fmudflap -fmudflapth -fmudflapir
对于支持它的前端(C 和 C++),使用范围/有效性测试仪器化所有风险指针/数组解引用操作、一些标准库字符串/堆函数和一些其他相关结构。这样仪器化的模块应该免疫缓冲区溢出、无效的堆使用以及一些其他类的 C/C++ 编程错误。该仪器依赖于一个单独的运行时库(libmudflap),如果在链接时给出了 -fmudflap,则会将其链接到程序中。仪器化程序的运行时行为由 MUDFLAP_OPTIONS 环境变量控制。有关其选项,请参见 env MUDFLAP_OPTIONS=-help a.out。
gcc overflow.c -fno-stack-protector -fno-pie -no-pie
来创建传统的ELF可执行文件,而不是共享对象。这样您就不必为非栈段禁用ASLR,无论是系统范围还是针对此可执行文件,这是GDB做的事情。完全不需要系统范围内禁用。@RobertLarsen(和未来的读者)。 - Peter Cordes