[原创]CVE-2014-1776漏洞分析
/**************************************
/*
/* 博客:http://www.tyrande000.com/
/*
/**************************************
0x00 实验环境
操作系统:VMWARE Windows 7 sp1
IE版本:8.0.7601.17514
漏洞DLL:mshtml.dll
调试器:windbg
0x01 简述
CVE-2014-1776属于use-after-free漏洞,影响范围不但涉及6/7/8/9,还影响IE10/11浏览器,这几个版本的浏览器被披露出可以远程执行代码的漏洞。漏洞出现在mshtml!CMarkup:IsConnectedToPrimaryMarkup函数。

0x02 说明
为了避免黑产,共同维护互联网安全,漏洞中的关键代码段被打上了马赛克,本篇文章只是分析漏洞的起因及对突破WINDOWS保护机制的研究,希望码农们引以为戒,提高软件代码安全性!
0x03 漏洞原因
以下是能够触发漏洞并利用的三个文件:

1.html为入口文件,如图:

微软自从Windows XP SP2以后添加了很多安全保护机制,其中DEP/ASLR是我们在这个漏洞中需要突破的2项保护机制,SWF文件就是用来帮助我们突破保护的。
当swf加载时,会先进行Heap Spray,将绕过DEP/ASLR的代码和SHELLCODE放置在我们稍后可控的堆内:

首先对Vector.<uint>((0x1000 – 8) / 4)做个说明,为了使每个s[i]的大小以0x1000字节对齐,我们需要分配(0x1000 – 每个vector的头结构大小8字节) / sizeof(uint)=0x3FE个uint变量,如下图:

在准备工作结束后,会调用ExternalInterface.call(“trigger”);来执行JS中的引发漏洞的代码:

现在让我们开启IE的页堆调试:

找到崩溃点如下:

对应汇编:

可以看到EAX的值来自ESI,推断ESI是一个CMarkup对象指针,现在我们深入剖析一下ESI的由来,我在mshtml!CMarkup::IsConnectedToPrimaryMarkup下断点:bu mshtml!CMarkup::IsConnectedToPrimaryMarkup “!heap -p -a eax;g”
重新运行程序:


!heap -p -a 只是截断了最近几条函数调用堆栈,我们需要更深层次的函数调用信息。
对mshtml!CMarkup::~CMarkup下断点,观察函数堆栈,如下图:


结合下面崩溃时的堆栈信息,可以断定函数在CStylement::OnPropertyChange函数尚未返回前,又重新进入CMarkup::IsConnectedToPrimaryMarkup函数重复使用,造成了漏洞的产生,如下:

0x04 突破WINDOWS安全保护
为了能够控制UAF对象,我们需要使用和UAF对象同样大小的内存对该段内存占位,以对齐内存,如下图:

再次运行IE:

这时候已经可以成功控制EAX,继续往下步进,看看后面有没有可以进一步与EAX或其他寄存器相关的利用代码,如下:

果不其然,居然找到了可以直接控制EIP的指令,而EDX同时还是我们可控的!
还记得我们最初在SWF中HEAP SPRAY了一大片内存吗,其中包含SHELLCODE,而因为DEP的存在,则需要通过ROP技术绕过这个限制。此刻EAX是指向可控堆的,因此我们如果能在内存空间中(需要利用SWF突破ASLR)找到类似xchg eax, esp;ret;这样的指令就可以控制堆栈,从而调用zwProtectVirtualMemory来修改指定的内存属性来绕过DEP,翻转堆栈后,堆栈布局如下:


Shellcode部分我只用了0x90909090举个例子,来说明DEP/ASLR已经被击败了。

0x05 总结
外国论坛中有些大牛通过在漏洞中修改VECTOR对象的LENGTH属性,获得对进程内任意地址的读写,通过覆盖一个SOUND对象的虚函数表,来触发DEP绕过,本文采用了另一种方法来叙述。
