ღ Miranda

CVE-2011-0027 整数溢出分析

前言

这个漏洞是在2010Pwn2Own中用于攻破IE8的漏洞。

poc

poc.html

调试分析

漏洞模块是msado15.dll,要是找不到路径可以在windbglmf查看模块路径。

设置msado15.dll的加载断点,在IDA中搜索CacheSize得到CRecordset::put_CacheSize这个函数用于输出取得的CacheSize,下断点调试发现第二个参数就是设置的0x40000358:

开启IE的堆页,运行后会断在下面的位置:

esi处是一个大小为0xd70的堆,这个堆从792c290792d000,显然这条指令引发了堆溢出。回溯发现这个堆是由CRecordset::MoveFirst中的MSDART!MpHeapAlloc分配的,CRecordset::MoveFirst是用来处理poc.htmllocalxmlid1.MoveFirst();的。

重新调试,在CRecordset::MoveFirst上下断点:

由前面的回溯可知MSDART!MpHeapAlloc返回的地址是4dd3c361,位于msado15!CRecordGroup::AllocateHRowRange:

函数声明:

4dd3c355下断点,第二次断下时查看栈中的参数:

第三个SIZE_T就是0xd64,与溢出的大小一致,往前回溯一下来源:

第三个参数来自于eax,而eax=eax*4+4,再往前eax=esi,在4dd3c343下断点再次调试:

发现开始esipoc中的0x40000358,然后经过eax*4+4后发生了整数溢出,使得eax变成了0xd64,分配了过小的内存块导致后面复制数据的时候发生了溢出。

发表评论

电子邮件地址不会被公开。