-
-
[翻译]Linux (x86) Exploit 开发系列教程之五(使用链接的return-to-libc绕过NX bit)
-
发表于:
2017-4-13 18:25
13411
-
[翻译]Linux (x86) Exploit 开发系列教程之五(使用链接的return-to-libc绕过NX bit)
前提条件:
经典的基于堆栈的缓冲区溢出
使用return-to-libc旁路NX位
虚拟机安装:Ubuntu 12.04(x86)
链接的returned-to-libc?
正如以前的帖子看到的,有需要攻击者为了成功利用需要调用多个libc函数。链接多个libc函数的一种简单方法是在堆栈中放置一个libc函数地址,但是由于函数参数的原因,所以是不可能的。讲的不是很清楚,但是没有问题,继续!
漏洞代码:
注意:此代码与上一篇文章(vuln_priv.c)中列出的漏洞代码相同。
编译命令:
如前一篇文章所述,链接setuid,system和exit将允许我们能够利用漏洞代码”vuln“。但由于以下两个问题,不是一个直接的任务:
1、 在堆栈中的同一位置,攻击者将需要放置libc函数的函数参数或一个libc函数的函数参数和另一个libc函数的地址,这显然是不可能的(如下图所示)。
2、seteuid_arg应为零。但是由于我们的缓冲区溢出是由于strcpy引起的,所以零变成一个坏的字符,ie)这个零之后的字符不会被strcpy()复制到堆栈中。
![](http://bbs.pediy.com/upload/attach/201705/694899_dw6ur5mhs7igtw2.png)
现在看看如何克服这两个问题。
问题1:为了解决这个问题,Nergal谈到了两项辉煌的技术
1、 ESP Lifting
2、Frame Faking
在他的pharck杂志的文章中。这里让我们只看关于帧伪造,因为应用esp lifting技术二进制应该在没有帧指针下支持下进行编译(-fomit-frame-pointer)。但是由于我们的二进制(vuln)包含帧指针,我们需要应用帧伪造技术。
帧伪造?
在这种技术中,而不是使用libc函数地址(本例中为seteuid)直接覆盖返回地址,我们用“leave ret”指令来覆盖它。这允许攻击者将堆栈中的函数参数存储起来,而不会有任何重叠,从而允许调用相应的libc函数,而不会有任何问题。让我们来看看会怎么样?
堆栈布局:当攻击者伪造帧进行缓冲区溢出时,如下图堆栈布局所示,成功链接libc函数seteuid, system 和 exit:
![](http://bbs.pediy.com/upload/attach/201705/507717_a7401717ka9f0t9.png)
[注意]看雪招聘,专注安全领域的专业人才平台!