sa1*_*125 66 c gcc buffer-overflow compiler-optimization
我正在处理一个需要禁用编译器优化保护才能工作的作业问题.我在ubuntu linux上使用gcc 4.4.1,但无法弄清楚哪些是正确的.我意识到它依赖于架构 - 我的机器运行32位英特尔处理器.
谢谢.
roo*_*ook 92
这是一个很好的问题.为了解决这个问题,你还必须禁用ASLR,否则g()的地址将是不可预测的.
禁用ASLR:
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
Run Code Online (Sandbox Code Playgroud)
禁用金丝雀:
gcc overflow.c -o overflow -fno-stack-protector
Run Code Online (Sandbox Code Playgroud)
在金丝雀和ASLR被禁用之后,它应该是一种直接的攻击,就像粉碎堆栈中的娱乐和利润所描述的那样
下面是在Ubuntu使用的安全功能列表:https://wiki.ubuntu.com/Security/Features 您不必担心NX位,克(地址)总是会在内存中的可执行区域因为它在TEXT内存段内.如果您尝试在堆栈或堆上执行shellcode,则NX位才会起作用,这不是此分配所必需的.
现在去欺骗那个EIP吧!
小智 31
嗯,到目前为止所有答案都是错误的,鲁克的回答是正确的.
输入:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
Run Code Online (Sandbox Code Playgroud)
其次是:
gcc -fno-stack-protector -z execstack -o bug bug.c
Run Code Online (Sandbox Code Playgroud)
禁用ASLR,SSP/Propolice和Ubuntu的NoneXec(放在9.10中,并且很容易解决,看看mprotect(2)技术将页面映射为可执行文件和jmp)应该有所帮助,但是这些"安全功能"是通过绝不是绝对正确的.没有`-z execstack'标志,页面具有不可执行的堆栈标记.
Ayd*_* K. 15
在较新的发行版(截至2016年),似乎PIE默认启用,因此您需要在编译时显式禁用它.
这里有一些命令摘要,一般在本地播放缓冲区溢出练习时会有所帮助:
禁用金丝雀:
gcc vuln.c -o vuln_disable_canary -fno-stack-protector
Run Code Online (Sandbox Code Playgroud)
禁用DEP:
gcc vuln.c -o vuln_disable_dep -z execstack
Run Code Online (Sandbox Code Playgroud)
禁用PIE:
gcc vuln.c -o vuln_disable_pie -no-pie
Run Code Online (Sandbox Code Playgroud)
禁用上面列出的所有保护机制(警告:仅用于本地测试):
gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie
Run Code Online (Sandbox Code Playgroud)
对于32位计算机,您还需要添加-m32参数.
您不需要禁用 ASLR 来执行缓冲区溢出!虽然启用了 ASLR ( kernel_randomize_va_space = 2),但除非编译的可执行文件是 PIE,否则它不会生效。所以除非你用-fPIC -pieflag编译你的文件,否则ASLR 不会生效。
我认为只禁用金丝雀-fno-stack-protector就足够了。如果要检查 ASLR 是否正常工作(必须设置与位置无关的代码),请使用:
hardening-check executable_name
Run Code Online (Sandbox Code Playgroud)