您当前的位置: 首页 > 

合天网安实验室

暂无认证

  • 0浏览

    0关注

    748博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

CTF PWN绕过ASLR和NX的三种利用方式

合天网安实验室 发布时间:2017-09-04 21:29:26 ,浏览量:0

author:giantbranch

作者简介:考上大学因为分数不算太好,被分配到了信息安全专业,一开始只是随便跟着学,后来一个偶然的机会跟着一个校园团队去搞web开发,微信开发去了,也挺好玩的。直到后来帮别人开发的网站被报乌云,开始走上web安全之后,由于ctf比赛的原因和自己喜欢的挑战精神,又走上了艰难的二进制之路,开启安全研究员之路......

00x00 前言

首先这次讲的是pwn类型的,题目来源于题:https://exploit-exercises.com/fusion/level02/,exploit-exercises是一个不错的练习的地方,从基础的linux技巧到基础的栈溢出,格式化字符串漏洞到堆溢出,都挺不错的。

下面将要讲的是exploit-exercises的第3个系列中的level02,这是缓冲区溢出漏洞的一个例子。

关于缓冲区溢出,网上资料很多了,没接触过的可以编写下面代码有漏洞的代码进行实践,通过gdb调试,对vulnerable_function的ret那里下断点,看看我们输入超长的字符串,返回地址是不是被覆盖了(注:执行到ret指令时,esp所指即返回地址,没错计算机就是这么蠢)。

好了,回到正题,先说下工具

1.Kalihttps://www.kali.org/

2. Peda https://github.com/longld/peda

3.Pwntools : pip install pwntools (推荐装在kali上,一般不会安装出错)

4.rp++https://github.com/0vercl0k/rp

这个程序开启了如下保护:堆栈不可执行,地址空间随机化(也就是我们常说的ASLR,NX),特点如下:

漏洞程序源码如下:

首先我们很容易漏洞位置在encrypt_file函数,溢出变量为buffer,有点棘手的就是程序会用cipher函数将我们输入的东西进行加密,我们需要懂得加密算法才能精确控制加密后的结果,当然这里只是简单的异或。

对核心的点,我总结了以下几点

首先我们不输入Q是不会退出的

buffer的长度是我们指定的,肯定能溢出

key虽然是随机的,但是只生成一次(因为是static变量),而且最后会输出buffer,那就可以有泄露key的可能

那如何写出exp呢,总的思路是利用read函数将”/bin/sh”字符串写到一个不变的地址(一般是.bss),再调用execve,或者system什么的执行/bin/sh从而获得shell。

本题利用的整体步骤如下:

1. 泄露key

2. 调用read函数将”/bin/sh”写到bss段的首地址

3. 构造如下调用execve(“/bin/sh”, NULL, NULL),利用execve执行/bin/sh从而返回shell

10x01 泄露key

发送E进入case E流程后,就可以发送长度值127和128个0xff过去了,回来再异或一下就可以获取key了,当然你发其他的也可以,比如A,B,C,D,E,F,G,记得回来异或一下就好

运行结果:

那我们已经获取到key了,顺便把加密函数写了吧,发送前要利用这个key进行加密,函数也非常简单,对传进来的字符串循环地用key进行异或

20x02开始真正的利用

总的思路是利用read函数将”/bin/sh”字符串写到一个不变的地址(一般是.bss),再调用execve,或者system什么的

定位溢出点:

首先我们得定位溢出地址,buffer很大,直接用字符串定位不太好使,但我们可以在加密前调试查看,看到我们的输入

首先算一下buffer的大小

>>> 32 * 4096131072

buffer这么大的话,我们用131000个A,再加上100个peda生成的吧

发送如下:

data = "A" * 131000 + "AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL"

我们在nread完的下一行下断点,因为这里用ebp来索引,查看ebp+4的地址即为返回地址

所以用peda看一下,偏移为88,所以最终为131000 + 88 = 131088

找可写地址,函数plt等地址, 构造写入

要写入binsh,首先看看哪里可写(看内存属性),一般选择bss段,那里一般情况下是可写的,下面在gdb中就可以查看,而且地址为0x804b420

或者查看ida的program Segmentation(shift+f7),或者像下面那样看内存布局

你们喜欢什么就用什么

接下来我们找read的plt表,为什么用plt呢,可能got表还没初始化吧(不过好像plt也是先跳到got的),其实got表应该也可以,有空的可以试试

read的plt表为0x08048860(用ida或者pwntools可以获得),got表 0x0804B384【下面给出ida找到read plt表截图,你首先找到plt段,这个段在text段上面】

execve的plt地址080489B0,got表地址 0x0804B3D8

那么我们最终构造的栈应该如下,由于我们应多次利用,所以我们的retn应重新回到漏洞函数encrypt_file或者其他我们可控的地址

那么encrypt_file函数返回就相当于调用了read(0, bss_addr, 8),我们再发送”/bin/sh\x00”

执行binsh

可能的3种利用思路(方法):

read后,直接pop 3个参数后调用execve(binsh,NULL,NULL)

read后,回到漏洞函数继续同样的溢出重新利用,有时会覆盖环境变量导致执行失败,不过这里没有

read后,栈翻转,即将栈指针指向.bss段,在bss段进行rop

但是第一次发现第一个方式都不行,经过一段漫长时间的调试,终于发现了我的key接收少了,应该recv(128),本来我写了32(因为当初一看那个数组是32,下意识就写了recv(32)),哎,找错真是费时间啊

下面尝试这三种思路

方法1

写入binsh后,直接pop弹出 read的3个参数后调用execve(binsh,NULL,NULL)

覆盖的构造如下,完整利用代码看下一行

下面为完整利用代码,发送前需要加密哦,代码过程,只能分成两部分了

结果:

由于程序输出很长,中间的AAAA就不截图了

方法2

完整的上面已给,只给重点变的部分 先调用write_binsh,写一个binsh字符串,之后回到encrypt_file漏洞函数,再次溢出调用execve(binsh,NULL,NULL),原理非常简单

下面给出两次溢出代码

方法3

本方法叫stack pivot,中文叫栈翻转,就是栈指针不再指向本来的栈空间,我们控制它指向我们可以控制的内存,比如这里我们让其指向bss段首地址

我们找到如下的小组件,如0x08048b13,我们在其后放bss地址,就可以将bss段首地址复制给ebp,如果我们再有将ebp赋值给esp再ret的就完美了,那就是leave;ret,我们用rp++和objdump找一下,选了下面两个

0x08048b13: pop ebp ; ret  ;  (1 found)0x08048b96: leave  ; ret  ;  (1 found)

附上查找截图

简单的组件使用objdump也行

我们看看第一个payload,先将bss保存到ebp,之后调用read吸入bss_addr,read的返回地址为leave_ret(调用完read,ebp的值没变),之后leave_ret相当于mov esp,ebp;pop ebp; ret

exp核心:

由于都是发送的填充是A,运行结果都是大同小异

30x03 小结

绕过NX的方法一般就是rop(rop简单来说是使栈只是存放“返回地址“”和参数,真正的代码都在“返回地址中”,其中返回地址就是我们说的组件的地址,read plt的地址等)

而绕过ASLR一般就是利用不变的地址应对,比如plt表

在总结一下利用的3种套路:

1. 第一次溢出后,利用pop 清理第一次利用的参数,从而进行第二次利用

2. 第一次溢出后,再次回到漏洞函数进行利用

3. 利用pop ebp ; ret  ;  和 leave  ; ret  ; 将栈指针指向我们可以控制的地方,进行rop,比如这里我们指向bss段首地址

40x04资源推荐

http://hetianlab.com/expc.do?ec=ECID172.19.104.182014103116591300001

http://hetianlab.com/cour.do?w=1&c=C172.19.104.182015111814415800001

http://angelboy.logdown.com/

https://wizardforcel.gitbooks.io/sploitfun-linux-x86-exp-tut/content/

https://github.com/scwuaptx/HITCON-Training

https://github.com/Kung-Pao-Chicken/ctf

https://github.com/shellphish/how2heap

https://pwnable.tw/

http://pwnable.kr/

https://etenal.me/archives/972#B1

当然也期待大家光临我下面的两个博客:

http://blog.csdn.net/u012763794

http://www.giantbranch.cn

50x05 声明

本文章为giantbranch原创,仅为各位网络安全爱好者学习和深入linux的漏洞利用,从而能够应用于比赛中。读者不应利用本文技术做出危害网络安全的行为,这与合天智汇和作者本人无关。

别忘了投稿哟!!!

合天公众号开启原创投稿啦!!!

大家有好的技术原创文章。

欢迎投稿至邮箱:edu@heetian.com;

合天会根据文章的时效、新颖、文笔、实用等多方面评判给予100元-500元不等的稿费哟。

有才能的你快来投稿吧!

合天网安实验室

网址 : www.hetianlab.com

电话:4006-123-731

长按图片,据说只有颜值高的人才能识别哦→

关注
打赏
1665306545
查看更多评论
立即登录/注册

微信扫码登录

0.0415s