0X00 漏洞描述
该IE浏览器漏洞的成因在mshtml.dll这个模块的CTableLayout::CalculateMinMax函数里,程序在执行时会以HTML代码中的元素span属性作为循环控制次数向堆中写入数据。如果此span值设置不当,那么就会引发堆溢出问题。
0X01 分析环境
目标系统:Windows 7 32位
调试器:WinDbg
反汇编器:IDA Pro
漏洞软件:IE 8
0X02 基本信息
首先打开ie堆的hpa选项
然后打开windbg附加ie进程并打开poc文件发现ie断了下来 断在了71290a2f 这里得选择两个进程中的后一个
kb查看回溯代码 发现edi的值来源于esi
通过前面我们可以知道再上一层函数是MSHTML!CTableLayout::CalculateMinMax 我们得下断点查看esi的值从何而来
重新运行然后lm显示已加载的模块 输出包含模块状态和路径 使用sxe ld:mshtml命令让进程在加载mshtml模块时断下 然后通过下断点bp MSHTML!CTableLayout::CalculateMinMax
单步运行调试 看到mov ebx,dword ptr [ebp+8] ss:002b:08bdc704=3bcd8ea8 [ebp+8]是参数1 poi()是指定地址处指针大小的数据
ln命令显示给定地址处的或者最近的符号 可见参数1引用的是CTableLayout对象也就是table标签中的对象。
这里的ebx+54h指向的是table标签里的col元素的span值,在poc中只有一个span值1,所以这里赋值1
用IDA分析后 跟进CImplAry_EnsureSizeWorker函数 发现函数主要用作分配堆内存 分配的大小为spannnum0x1c 虽然spannum的值为1 但分配的最小值为0x1c4=0x70 分配的内存地址保存在CtableLayout+0x9c
CImplAry_EnsureSizeWorker函数
接下来我们查看缓冲区vulheap的地址 下断点bp mshtml!CTableLayout::CalculateMinMax+0x187直接执行到函数 然后单步步过查看ebp+0x9c的值就是vulheap的地址
查看堆块信息可知分配了0x70大小的内存在CtableLayou+0x9c指向的地址
删除其他断点 只保留mshtml!CTableLayout::CalculateMinMax断点 再两次按g会弹出activex的弹窗 然后查看ebx+0x9c的值 发现并没变 再次g之后查看发现值发生变化 此时spancmp的值已经是4了 大于spansum的1 不发生跳转分配漏洞内存了
接下来我们在mshtml!CTableCol::GetAAspan下断点 然后步过这个函数 步出函数后发现我们设置的span值1000
分析后续代码 了解到复制的内容相当于width100得到的值 复制的内容为0x411000=0x1004 在AdjustForCol中 会以1000*0x1c位计数循环 向vulheap写入数据 最终造成heap溢出
在IDA中找到了AdjustForCol的反汇编代码 可知a2为复制的内容 a3即vulheap经过循环递增偏移后得到的值 最大偏移为1000*0x1c 已经超出vulheap的范围
0X03 思路总结
1.加载页面 CTableLayout::CalculateMinMax被首次调用 span的值为1 spansum=1 spancmp=0
2.spancmp<spansum 调用EnsureSizeWorke函数分配0x1cspansum的内存 至少分配 0x1c4=0x70的内存
3.分配内存后 spancmp=spansum*4=4 此时不在分配内存
4.调用over_trigger CTableLayout::MinMax第二次被调用 但是spansum和spancmp未变 但是span被改为1000 在复制width1000的数据到分配缓冲区 会以span为循环计数器写vulheap堆块 但是10000x1c>0x70的值 造成溢出
0X04 漏洞利用
首先给jscript.dll和JscollectGarbage下断点
然后开始运行找vulheap的位置
断下然后关闭日志记录
对于vulheap的内容我和书上对不上 就不太理解了
0X05 经验总结
这次复现经历 基本算是顺利 就是再exp的调试出了点问题 基本算是学了些windbg的使用 比上一次调试知道了断在某个模块sxe ld:某模块 还有导出日志的信息等 以后就可更好的使用这些