【问题标题】:Writing a return-to-libc attack, but libc is loaded at 0x00 in memory编写return-to-libc攻击,但libc在内存中加载到0x00
【发布时间】:2011-10-15 17:47:13
【问题描述】:

我正在为我的系统安全类编写返回 libc 攻击。一、易受攻击的代码:

//vuln.c
#include <stdio.h>
#include <stdlib.h>

int loadconfig(void){
  char buf[1024];
  sprintf(buf, "%s/.config", getenv("HOME"));
  return 0;
}

int main(int argc, char **argv){
  loadconfig();
  return 0;
}

我想用一个返回libc的攻击。编译和调试程序:

$ gcc -g -fno-stack-protector -o vuln vuln.c
$ gdb vuln
(gdb) break loadconfig
(gdb) run
Reached breakpoint blah blah blah.
(gdb) p $ebp
$1 = (void *) 0xbfffefb0
(gdb) p system
$2 = {<text variable, no debug info>} 0x0016db20 <system>
(gdb) p exit
$3 = {<text variable, no debug info>} 0x001639e0 <exit>
(gdb) x/2000s $esp
...
0xbffff5af:    "SHELL=/bin/bash"

为了执行攻击,我想将缓冲区溢出到loadconfig 的返回地址(又名$esp+4),将其替换为system 的返回地址,然后是exit 的返回地址(因为system 需要一个真实的返回地址),然后是命令名称(SHELL=/bin/bash 的地址加 6,以修剪 SHELL= 部分)。这应该可以通过制作一个包含 1024 个废话字符的 $HOME 环境变量,然后是 systemexit/bin/bash 的小端地址来实现。

但是,对于我尝试过的每台计算机,system 都会加载到以 0x00 开头的地址,这将终止 sprintf 正在读取的字符串并停止攻击。有什么方法可以强制libc 加载到内存中的其他位置,还是我误解了攻击?

作为参考,我在 VirtualBox(Windows 主机)中运行 Ubuntu Server 11.10 虚拟机,gcc 版本 4.6.1 和 gdb 版本 7.3-2011.08。编辑:ASLR 被禁用,我用-fno-stack-protector 编译以删除金丝雀。由于我没有从堆栈中执行任何操作,因此我不需要 execstack 它。

【问题讨论】:

  • 你可以把代码放到栈上吗?因为您可以稍后在包含执行您的漏洞利用代码的字符串中将返回值放入一个地址(当然要精心设计以避免 0 字节)。
  • 对,这是标准的缓冲区溢出攻击。我特别想执行返回 libc 攻击,而不是编写任何 shell 代码。
  • 您是否考虑过问题可能是您添加了调试信息?

标签: c buffer-overflow libc exploit


【解决方案1】:

将重要的 libc 函数映射到包含 NULL 字节的地址的行为称为 ASCII armouring。 此保护是 RedHat Exec-shield 的一部分,目前在最近的 ubuntu 发行版 link 上启用 要禁用它,您必须以 root 身份运行:

sysctl -w kernel.exec-shield=0

如解释here

顺便说一句,您可以找到有关如何绕过 ASCII 装甲here on exploit-db 的有趣资料

【讨论】:

  • 哇,这完美地解释了它。谢谢!
【解决方案2】:

我相当肯定这在 11.10 是不可能的,至少在你提到的方式上是这样。看看:

https://wiki.ubuntu.com/Security/Features

详细地说,只是挑出你想法中的一些问题:

(1) 由于金丝雀值和其他原因,缓冲区溢出到 esp+4 会引发分段错误异常

(2) 您可能的意思是提取环境变量的地址,传统上该地址应该是 ESP (main) + 一定数量的字节。但是,由于如今即使是逻辑内存地址在编译后都会被打乱/随机化,因此每次运行您的 $HOME 变量都会获得不同的内存地址,可能位于主堆栈的另一侧

(3) 据我所知,现在还有其他方式可以阻止图书馆攻击的回报。我对这些不太熟悉。这应该是您看到地址为 x00 的原因

如今在 ubunti 系统上进行黑客攻击很难。如果您只需要为不坚持当前发行版的类执行此操作,请在 virtualbox 中安装第一个 ubunti 发行版。神奇的是,你尝试的一切都会奏效。您也不再引用“标准溢出攻击” - 即使您巧妙地绕过金丝雀值等,设置 nx 位也使这成为不可能。同样,虽然我不太确定如何解决 libc 攻击的回报,但不要相信这在当前发行版上是可能的。祝你好运!

【讨论】:

  • 在有培根的时候输入了这个。为多个拼写错误道歉。
  • 为了避免(1),我用-fno-stack-protector编译。为了在某​​种程度上帮助处理(2),我在 Ubuntu 中禁用了 ASLR,所以事情应该保持一致。至于(3),我担心这是一些我不知道的内置对策......我想我会尝试其他方法。谢谢你的小费(我嫉妒培根)!
猜你喜欢
  • 2018-04-08
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
相关资源
最近更新 更多