-
-
[原创]CVE-2013-3893 IE浏览器uaf漏洞利用
-
发表于:
2017-5-2 19:22
11735
-
[原创]CVE-2013-3893 IE浏览器uaf漏洞利用
1. 背景
这次调试了一个浏览器的的uaf漏洞。(首先原谅我快把看雪当成私人博客了,我是一个正在学习二进制漏洞的小菜鸟,发出来的目的是想各位大佬多交流,不过目前来看没多少大佬愿意理我 [摊手][无奈])
什么是uaf呢?大概的意思就是,应用程序访问了一个已经被free掉的内存。利用这个漏洞可以执行任意代码。
这篇文章不是分析漏洞产生的原因,主要是记录了利用这个漏洞去执行代码的整个过程,想了解具体原因看参考。
2. poc1
根据前人的分析,拿到poc来测试一下,测试的环境是win7-32-ie8
windbg中断在
想要看进一步的细节需要打开pageheap,这样当程序的堆出现异常的时候能最快断下来,原理请看参考。
设置pageheap后,在一次运行poc,这次在访问一个地址的时候出现了异常,看起来是一个堆的地址.
查看一下这个地址的状态 !heap -p -a 05866fb0 很明显被free掉了
接下来找到内存在何时被free掉的,然后在内存free之后,访问之前,重新分配这块内存,填充我们的代码,这就能控制程序去访问一个可控的地址,然后在看看是否能去利用。
3. poc2
保存exp.html,打开windbg开始调试。
**!!!记得在运行之前关掉pageheap,要是没关掉pageheap,程序可能在之前访问堆的时候就已经挂掉了。**
程序出现了异常,但是eax寄存器是我们脚本中的值,紧接着是call dword ptr [ecx],接下来只要在0c0c0c0c中放入shellcode的地址的地址,就能调用我们的shellcode去执行。还有为啥是0c0c0c0c,因为后面要利用堆喷把shellcode放到了0c0c0c0c。
4. spray heap
前面已经控制程序去访问一个可控地址,接下来就把shellcode放到这个地址,因为有aslf的保护,所以要用堆喷去绕过,执行我们的代码。
要利用堆,首先要对堆有个简单的了解。堆分配是连续的,但是由于程序申请、释放堆之后,造成了很多堆碎片。在次分配堆的时候,首先从这些堆碎片中分配,当堆碎片用完的时候,重新向操作系统申请新的堆,这时候的堆是连续的。
堆喷射就是利用了这个特性,大量的用"nop+shellcode"占用堆,这样当我们访问某一堆地址的时候,总能执行到我们的shellcode。但是不开心的是,有dep保护,在堆中执行不了代码,这时候就要用精确堆喷射,就是每次堆喷射都把shellcode的开头固定在某一特定的地址比如(0c0c0c0c)。
堆的对齐是0x1000的倍数,如果堆喷的内容 [nops+shellcode]大小等于0x1000,这样只要确定0c0c0c0c到最近的[nops+shellcode] 的首地址,就能确定shellcode和nops的距离,这样0c0c0c0c总能指向shellcode的首地址,这块表述不清,具体看参考。
堆喷射代码
执行之后堆内就存在 150 个BSTR 字符串对象 " [4+ [nops+shellcode] + [nops+shellcode] + [nops+shellcode] + .... +2] =1m" 就是150m
0c0c0c0c也就是了shellcode地址。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课