首页
社区
课程
招聘
[翻译]Linux (x86) Exploit 开发系列教程之五(使用链接的return-to-libc绕过NX bit)
发表于: 2017-4-13 18:25 13411

[翻译]Linux (x86) Exploit 开发系列教程之五(使用链接的return-to-libc绕过NX bit)

2017-4-13 18:25
13411

前提条件:

  经典的基于堆栈的缓冲区溢出

  使用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()复制到堆栈中。


  

 现在看看如何克服这两个问题。

 

  问题1:为了解决这个问题,Nergal谈到了两项辉煌的技术

       1、 ESP Lifting

       2、Frame Faking

在他的pharck杂志的文章中。这里让我们只看关于帧伪造,因为应用esp lifting技术二进制应该在没有帧指针下支持下进行编译(-fomit-frame-pointer)。但是由于我们的二进制(vuln)包含帧指针,我们需要应用帧伪造技术。

 帧伪造?

在这种技术中,而不是使用libc函数地址(本例中为seteuid)直接覆盖返回地址,我们用“leave ret”指令来覆盖它。这允许攻击者将堆栈中的函数参数存储起来,而不会有任何重叠,从而允许调用相应的libc函数,而不会有任何问题。让我们来看看会怎么样?

堆栈布局:当攻击者伪造帧进行缓冲区溢出时,如下图堆栈布局所示,成功链接libc函数seteuid, system 和 exit:



[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 2
支持
分享
最新回复 (7)
雪    币: 7256
活跃值: (4522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢分享,
2017-4-13 19:23
0
雪    币: 704
活跃值: (228)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
3
谢谢分享
2017-4-14 09:30
0
雪    币: 704
活跃值: (228)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
4

图:

2017-5-3 10:35
0
雪    币: 24
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢分享
2017-6-28 07:26
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
 
最后于 2018-6-15 14:37 被雪地上的玫瑰编辑 ,原因:
2018-6-14 21:32
0
雪    币: 3615
活跃值: (11319)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
7
我有个疑问,新的seteuid_arg已经不在0xbffff210了,为什么4个字节0还是往这里写?
2019-3-15 08:49
0
雪    币: 458
活跃值: (2801)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
这里leave 指令move ebp , esp写反了
2020-6-19 18:06
0
游客
登录 | 注册 方可回帖
返回