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