我正在处理一个家庭作业问题,该问题需要禁用编译器优化保护才能正常工作。我在ubuntu linux上使用gcc 4.4.1,但无法弄清楚哪个标志是正确的。我意识到这取决于体系结构-我的机器运行32位Intel处理器。
谢谢。
Answers:
那是个好问题。为了解决该问题,您还必须禁用ASLR,否则g()的地址将不可预测。
禁用ASLR:
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
禁用金丝雀:
gcc overflow.c -o overflow -fno-stack-protector
在禁用金丝雀和ASLR之后,它应该是直接攻击,如“粉碎堆栈以获得乐趣和获利”中所述
以下是ubuntu中使用的安全功能的列表:https : //wiki.ubuntu.com/Security/Features 不必担心NX位,g()的地址将始终位于内存的可执行区域中因为它在TEXT内存段中。NX位仅在您尝试在堆栈或堆上执行shellcode时才起作用,此分配不需要此位。
现在去破坏EIP!
乌尔姆(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标志,则页面具有不可执行的堆栈标记。
在较新的发行版(截至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
标记。
我不会引用整个页面,但是可以在此处找到有关优化的完整手册: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环境变量控制。有关其选项,请参见en MUDFLAP_OPTIONS = -help a.out。