欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

三个白帽之从pwn me调试到Linux攻防学习

来源:本站整理 作者:k0_pwn 时间:2016-06-13 TAG: 我要投稿

从 z神发表关于《来pwn我一下好吗》的write up已经过去一段时间了,这篇write up对于我这样的Linux漏洞攻防新手来说很多地方都是很难理解的,后来结合这篇write up,我又调试了一下这个pwn me的题目,发现无论是从error出的题目,还是z神写的write up,都特别精彩,有很多值得学习的地方。

这个漏洞writeup从各个角度看,涵盖了很多Linux下的攻防技巧,于是我把我分析思考的过程,进行了一个总结,拿出来跟大家一起分享,或者说,我把这个漏洞拨茧抽丝,提取一些最有意思的部分,来和大家一起享受这个精彩的pwn me之旅。

在开头的最后,必须再次感谢一下出题人 Error 以及 writeup的作者 Explorer,真的学习到了很多东西。

文中若有不到位或者描述有误之处,请大牛们批评指正,多多交流,也希望能对大家有所帮助!

0x01 思考与问题
在阅读这篇writeup的时候产生了很多疑问,其实主要还是对于Linux下堆管理机制,以及一些Linux攻防技巧不熟的原因导致的,其实漏洞并不难处理,关键在于如何大开脑洞来利用,下面我抛出我在做这个pwn me调试时产生的问题,并且通过动态调试的过程来解决这些疑问。
fastbin chunk如何导致任意地址写的?
libc基址到底是如何泄露的?
如何通过写入free hook来达到执行/bin/sh的?
这三个问题其实都只是引子,在动态调试的过程中,发现了很多有趣的地方。在开始调试前,我想再啰嗦一下为什么会产生这三个问题。
首先第一个问题,fastbin这种malloc机制比较好理解,单向链表,也就是说只有一个指向下一个chunk的指针,但是如何利用这个指针达到任意地址写的呢?
第二个问题,从z神的writeup利用中提到了两种leak方法,那么它们的工作机制是怎样的呢?
第三个问题,writeup中提到的通过改写free hook达到执行/bin/sh的目的,那么这个过程又是什么样的呢?
下面带着这三个问题,开始最精彩的旅行~
0x02 关于z神提到的几个坑
在writeup中z神提到了几个坑,其中一个是check函数的,作者error后来也在文末提到了,两种方法,一种是利用任意地址写来修改全局变量a000的大小,另一种是直接无视掉,因为确实有时候会出现check函数检测没有通过的情况。

另外一个坑是关于FULL RELRO保护,其实通过gdb-peda可以直接查看保护开启情况。

这个保护主要是针对got表,这个got表存放着很多函数指针,针对got表攻防的概念有点像Windows下虚函数的攻击,关于got表的攻击有一篇文章讲的挺好的,传送门在此http://drops.wooyun.org/binary/6521
这里不再赘述,主要是z神在这个pwn题目中利用方法也很有意思。
0x03 从leak addr到任意地址写
说到leak addr就要从fastbin chunk说起,fastbin chunk是Linux下堆的一种分配方式,比较简单,采用的是单向链表的方式,只有一个fd指针指向下一个未分配的chunk,利用这种方法,可以泄露出堆的地址,这和后面的任意地址写有很重要的关系。
对于fastbin chunk,网上的说明有很多了,其实简化版的图是这样的。

在这个pwn题目中,对Vul结构的构造,rank恰好处于fd指针的位置,那么接下来在delete函数中调用free的时候,这个rank的位置会泄露堆地址,这是fastbin chunk的机制。
在这个漏洞中,要分别malloc申请两个fastbin chunk,然后对这两个chunk进行free操作,首先来看一下申请过程。

在6040a0地址位置是rank存放的位置,也就是fd的位置,下面要关注这个地址,其他chunk的申请过程我不再展示了,直接来看看free chunk之后构成fastbin chunk链表的过程。
下面对这个chunk执行free操作。

这里要提的一点是两个free,在pwn题目中,一个free是对detail指针的free,另一处是free整个memory,观察地址00604110位置,其实这里就是之前vul结构中detail指针malloc地址的位置,这里作为006040a0之前的chunk释放,而detail指针位置恰好是fd的位置,因此这里指向了00604070,也就是下一个未使用chunk的地址。
接下来观察eip处于memory free的函数调用处,接下来单步步过,观察006040a0地址。

可以看到,这时006040a0位置已经泄露了堆地址,而这个位置正好之前提到的rank的地址,而在writeup中已经提到了,在rank赋值时有一处if语句判断,如果rank大于0则赋值,因此,只要控制rank小于等于0,则不会赋值,通过这种方法,再通过程序的show函数,就可以通过rank打印出堆地址。
那么其实这个过程,就是在二进制漏洞攻防中,常用于bypass ASLR的利用方式,而上述的这个调试情景,就是一个最简单的过程
那么接下来,又是如何达到任意地址写的过程的呢?这就要提到pwn题目中edit函数存在的use after free释放后重利用,这个其实是uaf中一个非常简单的情况,在chunk释放后,没有对其进行标记,从而导致在释放后仍然能对该chunk进行操作,通过这种方式,可以修改fd的值,这就是一个典型的fake chunk的利用场景了,这样如果再次malloc,可以讲地址跳到任意地址,从而达到任意地址写的目的。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载