CVE-2016-0199浅析-Internet Explorer内存损坏漏洞
2017-10-22 12:19
615 查看
本文转载自对CVE-2016-0199的简单分析
POC如下(Windows 7 32bit,IE 11)。
异常访问的地址与
现在从头详细的开始调试这个POC,把这个POC改一下。由于我的windbg没有正确加载mshtml.dll的符号,所以符号信息还是以IDA为准。另外再说两个小技巧。
IDA打开mshtml.dll这种复杂的文件自动分析会花费很长的时间,用-a命令启动IDA就可以关闭自动分析。
每做一步都保存虚拟机镜像方便随时回退,这样基地址和对象分配的地址都不会发生变化,非常易于调试。
注意
下断点步过HeapAlloc后得到IMG的地址0x0cfdcfa0。
虽然没有像MSHTML!CAttribute::CreateXXX这样的函数,但是有构造函数,虚表指针就是在这里放在对象首位的。
下断点运行到这里得到Attribute的地址0x0b344fa0。
接下来
跟进PutNodeValueVariantHelper。
进入VariantCopy之后到达了赋值处。
可以看出
可以看出确实多了一个0x41424344这个值,看看内存怎么分配的。
这里分配的内存从0xb0a4fc0开始,也就是41424344所在地址的前8个字节。回退到以前的镜像,在调用栈中最后一个被调用的mshtml.dll中的函数上下断点。
看看IMG对象所处的内存综合如下。
alert(4)之后看到IMG.loop属性被存放。
下面
其实不用详细去跟,alert(5)之后直接看到Attribute对象地址被存放。
最后
同样不详细去跟,alert(6)之后直接看到Attribute对象偏移0x30处变成了0x41424344,这里本来是IMG对象。
回顾程序崩溃时的栈回溯看看
这也就能说明接下来崩溃的原因了。
POC如下(Windows 7 32bit,IE 11)。
<meta http-equiv="X-UA-Compatible" content="IE=7"> <script> oElement = document.createElement("IMG"); var oAttr = document.createAttribute("loop"); oAttr.nodeValue = oElement; oElement.loop = 0x41424344; oElement.setAttributeNode(oAttr); oElement.removeAttributeNode(oAttr); CollectGarbage(); </script>
异常访问的地址与
oElement.loop=0x41424344的赋值相同,多次更改这个数值发现都一致。可以看出eax中应该是存放c++对象基址。
现在从头详细的开始调试这个POC,把这个POC改一下。由于我的windbg没有正确加载mshtml.dll的符号,所以符号信息还是以IDA为准。另外再说两个小技巧。
IDA打开mshtml.dll这种复杂的文件自动分析会花费很长的时间,用-a命令启动IDA就可以关闭自动分析。
每做一步都保存虚拟机镜像方便随时回退,这样基地址和对象分配的地址都不会发生变化,非常易于调试。
<meta http-equiv="X-UA-Compatible" content="IE=7"> <script> alert(0); oElement = document.createElement("IMG"); alert(1); var oAttr = document.createAttribute("loop"); alert(2); oAttr.nodeValue = oElement; alert(3); oElement.loop = 0x41424344; alert(4); oElement.setAttributeNode(oAttr); alert(5); oElement.removeAttributeNode(oAttr); alert(6); CollectGarbage(); </script>
注意
<meta http-equiv="X-UA-Compatible" content="IE=7">以IE7模式渲染,只有在IE7模式渲染才能触发漏洞。POC代码创建了IMG对象和loop属性,之后的操作都是围绕着它们展开的,所以先找下它们的地址。
gflags.exe /i iexplore.exe +hpa +ust打开hpa和ust。在IDA中打开mshtml.dll,查看所有CImgElement的函数,CreatElement这个函数名明显是创建对象。
下断点步过HeapAlloc后得到IMG的地址0x0cfdcfa0。
虽然没有像MSHTML!CAttribute::CreateXXX这样的函数,但是有构造函数,虚表指针就是在这里放在对象首位的。
下断点运行到这里得到Attribute的地址0x0b344fa0。
接下来
oAttr.nodeValue=oElement很明显是为Attribute对象的一个成员变量赋值,而且还是IMG对象。CAttribute的成员函数中put_nodeValue比较像干这个的。
跟进PutNodeValueVariantHelper。
进入VariantCopy之后到达了赋值处。
可以看出
oAttr.nodeValue=oElement将IMG对象的地址放到了attribute的偏移0x30处。
oElement.loop=0x41424344是给IMG对象的一个属性赋值,但是从函数名称上来看没有找到相关的函数,因此使用
s-d 0x0 L?0x7fffffff 41424344命令分别在alert(3)和alert(4)之后在内存中搜索。
可以看出确实多了一个0x41424344这个值,看看内存怎么分配的。
这里分配的内存从0xb0a4fc0开始,也就是41424344所在地址的前8个字节。回退到以前的镜像,在调用栈中最后一个被调用的mshtml.dll中的函数上下断点。
看看IMG对象所处的内存综合如下。
alert(4)之后看到IMG.loop属性被存放。
下面
oElement.setAttributeNode(oAttr)应该也是调用IMG对象的成员函数把attributenode对象地址放到IMG对象的内存片中。
其实不用详细去跟,alert(5)之后直接看到Attribute对象地址被存放。
最后
oElement.removeAttributeNode(oAttr)同样也可以在IDA中轻易找到对应的函数。
同样不详细去跟,alert(6)之后直接看到Attribute对象偏移0x30处变成了0x41424344,这里本来是IMG对象。
回顾程序崩溃时的栈回溯看看
MSHTML!CAttribute::EnumerateTrackedObjects的反汇编代码。
这也就能说明接下来崩溃的原因了。
相关文章推荐
- Microsoft Office内存损坏漏洞(CVE-2017-11882)实战
- CVE-2013-3346Adobe Reader和Acrobat 内存损坏漏洞分析
- CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用
- Linux内核通杀提权漏洞CVE-2016-5195验证
- ImageMagick漏洞(cve-2016-3714)利用及修复
- CVE-2016-1240(Tomcat本地提权漏洞分析与复现)
- PHPMailer 命令执行漏洞(CVE-2016-10033)分析(含通用POC)
- 微软“WebDAV”提权漏洞(cve-2016-0051)初探
- PHP ‘asn1_time_to_time_t’函数内存损坏漏洞
- CVE-2016-10191 FFmpeg RTMP Heap Buffer Overflow 漏洞分析及利用
- OpenSSH客户端漏洞:CVE-2016-0777和CVE-2016-0778
- 2016新年Bash的CVE-2014-6271漏洞修复经历
- 阿里云服务器漏洞phpmyadmin CVE-2016-6617解决方法
- MySQL远程代码执行(CVE-2016-6662)漏洞预警
- CVE-2016-0143 漏洞分析(2016.4)
- CVE-2016-1240漏洞分析(Tomcat本地提权漏洞)
- CVE-2016-7193浅析-word数组越界漏洞
- 危害9亿安卓设备高通漏洞细节曝光(CVE-2016-3842,含POC)
- Wget重定向漏洞(CVE-2016-4971)升级