如何关闭gcc编译器优化以启用缓冲区溢出

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吧!

  • 似乎值得指出,在我的系统上,randomize_va_space默认为2而不是1,因此如果您打算重新启用它,则需要事先检查. (11认同)
  • 谢谢,我会这样做:)哦 - 我如何重新启用保护以取消我的机器?...我的猜测是sudo echo 1>/proc/sys/kernel/randomize_va_space (5认同)
  • 实际上,g()的地址很可能不会被ASLR随机化,因为它是主二进制文件的一部分.只有使用-PIE编译二进制文件时才会随机化. (3认同)

小智 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'标志,页面具有不可执行的堆栈标记.

  • 你没有读过那些人的链接.如果你这样做,你会知道他正在尝试执行g(),这是一个编译成二进制文件的函数.这是一个函数的地址.当您尝试在堆或堆栈上执行shellcode时,NX位会起作用,他的攻击要简单得多. (4认同)

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参数.


Kyl*_*utz 6

试试-fno-stack-protector国旗.


Ahl*_*lyM 6

您不需要禁用 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)