81

我正在处理一个需要禁用编译器优化保护才能工作的作业问题。我在 ubuntu linux 上使用 gcc 4.4.1,但不知道哪些标志是正确的。我意识到它依赖于架构 - 我的机器运行 w/ 32 位英特尔处理器。

谢谢。

4

6 回答 6

115

这是个好问题。为了解决这个问题,您还必须禁用 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 内存段内。NX 位仅在您尝试在堆栈或堆上执行 shellcode 时发挥作用,这不是此分配所必需的。

现在去破坏那个EIP吧!

于 2010-02-26T09:05:16.213 回答
35

嗯,到目前为止,所有答案都是错误的,而 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 中,并且工作起来相当简单,请参阅将页面映射为可执行文件和 jmp 的mprotect(2)技术)应该有所帮助,但是这些“安全功能”是由绝不意味着绝对可靠。如果没有 `-z execstack' 标志,页面将具有不可执行的堆栈标记。

于 2010-02-26T11:51:28.777 回答
25

在较新的发行版上(截至 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

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

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

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

于 2016-11-29T14:11:12.763 回答
7

试试-fno-stack-protector国旗。

于 2010-02-26T08:17:00.877 回答
6

您无需禁用 ASLR 即可进行缓冲区溢出!虽然启用了 ASLR ( kernel_randomize_va_space = 2),但除非编译的可执行文件是 PIE,否则它不会生效。所以除非你用flag编译你的文件,否则-fPIC -pieASLR不会生效。

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

hardening-check executable_name
于 2015-04-07T00:38:32.163 回答
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。

于 2010-02-26T08:17:37.830 回答