写入返回到libc的攻击,但libc在内存中以0x00加载

写入返回到libc的攻击,但libc在内存中以0x00加载,c,buffer-overflow,libc,exploit,C,Buffer Overflow,Libc,Exploit,我正在为我的系统安全类写一篇返回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();

我正在为我的系统安全类写一篇返回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;
}
//vuln.c
#包括
#包括
int loadconfig(void){
char-buf[1024];
sprintf(buf,“%s/.config”,getenv(“HOME”);
返回0;
}
int main(int argc,字符**argv){
loadconfig();
返回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"
$gcc-g-fno堆栈保护器-o vuln vuln.c
$gdb vuln
(gdb)中断加载配置
(gdb)运行
到达断点等等。
(gdb)p$ebp
$1=(无效*)0xbfffefb0
(gdb)p系统
$2={}0x0016db20
(gdb)p出口
$3={}0x001639e0
(gdb)x/2000美元esp
...
0xbffff5af:“SHELL=/bin/bash”
要执行攻击,我想将缓冲区溢出到
loadconfig
的返回地址(aka
$esp+4
),将其替换为
系统的返回地址,然后是
退出的返回地址(因为
系统
需要实际的返回地址),然后是命令名(SHELL=/bin/bash
的地址加上6,用于修剪
SHELL=
部分)。这应该可以通过创建一个包含1024个字符的crap的
$HOME
环境变量,然后是
系统
退出
/bin/bash
的小端地址来实现

但是,对于我尝试过的每台计算机,
system
都会在一个以0x00开头的地址加载,这将使
sprintf
正在读取的字符串为空,并停止攻击。是否有办法强制
libc
加载到内存中的其他位置,或者我误解了攻击


作为参考,我正在VirtualBox(Windows主机)中运行一台Ubuntu服务器11.10虚拟机使用
gcc
version 4.6.1和
gdb
version 7.3-2011.08。编辑:ASLR被禁用,我使用
-fno-stack-protector
编译以移除金丝雀。因为我没有从堆栈执行任何操作,所以我不需要
execstack
它。

我相当肯定这在11.10上是不可能的,至少在w你说的是什么。看一看:

详细地说,只是挑选一些与您的想法有关的问题:

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

(2) 您的意思可能是提取环境变量的地址,这通常是在ESP(main)中+一定数量的字节。但是,即使现在的逻辑内存地址在编译后也会被置乱/随机化,因此每次运行$HOME变量时,您可能会在主堆栈的另一侧获得不同的mememory地址

(3) 据我所知,还有其他方法可以阻止这些天来图书馆的攻击。我不太熟悉这些方法。这就是为什么你会看到x00的地址


现在在ubunti系统上进行黑客攻击是很困难的。如果你只需要为一个不坚持使用当前发行版的类进行黑客攻击,请在virtualbox中安装第一个ubunti发行版。神奇的是,你所做的一切都会奏效。不再有“标准溢出攻击”您也可以参考-即使您巧妙地绕过了canary值等,设置nx位也会使这不可能。同样,虽然我不太确定如何解决libc攻击返回的问题,但不要相信在当前发行版上这是可能的。祝您好运!

将重要的libc函数映射到addre的行为包含空字节的SSE称为ASCII铠装。 这种保护是最近ubuntu发行版上启用的一部分 要禁用它,您必须以root用户身份运行:

sysctl-w kernel.exec shield=0

如前所述


顺便说一句,您可以找到有关如何绕过ASCII铠装的有趣资料

是否允许将代码放在堆栈上?因为您可以稍后在包含执行利用漏洞的代码的字符串中向地址添加返回值(当然,精心编制以避免0字节).对,这是一种标准的缓冲区溢出攻击。我特别想执行返回到libc攻击,而不是编写任何shell代码。您是否考虑过问题可能是您添加了调试信息?在使用Baconator时键入了此信息。对于多个键入错误,我深表歉意。为避免(1),我用
-fno-stack-protector
编译。为了在某种程度上帮助处理(2),我在Ubuntu中禁用了ASLR,所以事情应该保持一致。至于(3),我担心这是一些我不知道的内置对策……我想我会尝试其他方法。谢谢你的提示(我很嫉妒Baconator)!哇,这很好地解释了。谢谢!