实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 7 | |
虚拟机 | Vmware | |
调试器 | WinDbg | |
反汇编器 | IDA Pro | |
漏洞软件 | IE 8 | 8.0.7601.17514 |
动态分析
首先gflag给ie +hpa来开启页堆。
然后附加IE进程,打开poc文件。
中断和书中的CTableColCalc::AdjustForCol有区别,可能是IE版本和符号表带来的影响。
回溯栈如图。
ub查看当前eip上方汇编,发现edi来自于esi。
这里其实符号表有误,导致和书上并不相同,后续我重新加载了一次符号表。
crash在这
上一级函数为mshtml! CTableLayout::CalculateMinMax所以在这里打一个断点,重新载入。
查看传入给该函数的参数。发现参数一引用的是CTableLayout对象,也就是<table>标签在内存中的对象。
这里ebx+54h指向的是table标签中的col元素的span属性值。
查看CImplAry::EnsureSizeWorker函数
该函数会分配spanSum*0x1c的空间,但是分配的空间大小最小为0x70,此处分配的是0x70大小。分配到内存地址会保存在CTableLayout+0x90+0xC中。
。。。写了半天蓝屏了,没保存,不过本身这类资料够多就不重新写了。
随后调用poc的over_trigger函数,重新设置span=1000,这里的span会导致AdjustForCol函数以1000*0x1c为计数器循环的像第一次分配到0x70大小的heap中写入数据从而造成堆溢出。
总的流程如下:
- 页面加载CalculateMinMax被调用,col的span属性被初始化为1,此时spansum=1,spancmp=0
- 随后调用EnsureSizeWoker函数分配0x70的内存块
- 分配后spancmp=span*4=4,此时spansum2<<2==spansum,因此不再分配内存。
- 随后调用over_trigger,CalculateMinMax再次被调用,但是spansum和spancmp未变,span被改为1000,复制内容的时候会以span作为循环计数器。1000*0x1c>0x70,堆溢出。
文章评论