我正在处理一个需要禁用编译器优化保护才能工作的作业问题。我在 ubuntu linux 上使用 gcc 4.4.1,但不知道哪些标志是正确的。我意识到它依赖于架构 - 我的机器运行 w/ 32 位英特尔处理器。
谢谢。
我正在处理一个需要禁用编译器优化保护才能工作的作业问题。我在 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 被禁用后,它应该是一个直接的攻击,就像Smashing the Stack for Fun and Profit中描述的那样
以下是 ubuntu 中使用的安全功能列表:https ://wiki.ubuntu.com/Security/Features 您不必担心 NX 位,g() 的地址将始终位于内存的可执行区域中因为它在 TEXT 内存段内。NX 位仅在您尝试在堆栈或堆上执行 shellcode 时发挥作用,这不是此分配所必需的。
现在去破坏那个EIP吧!
嗯,到目前为止,所有答案都是错误的,而 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' 标志,页面将具有不可执行的堆栈标记。
在较新的发行版上(截至 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
参数。
试试-fno-stack-protector
国旗。
您无需禁用 ASLR 即可进行缓冲区溢出!虽然启用了 ASLR ( kernel_randomize_va_space = 2
),但除非编译的可执行文件是 PIE,否则它不会生效。所以除非你用flag编译你的文件,否则-fPIC -pie
ASLR不会生效。
我认为只有禁用金丝雀-fno-stack-protector
就足够了。如果要检查 ASLR 是否正常工作(必须设置与位置无关的代码),请使用:
hardening-check executable_name
我不会引用整个页面,但可以在此处找到完整的优化手册: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。