漏洞模块:comctl32.dll
漏洞原因:comctl32:SBGetText函数返回值的验证问题。
详细内容:comctl32:SBGetText函数会被调用两次,第一次用于确认IE浏览器状态栏(status bar)中的字符串长度,第二次是复制状态栏中的字符串到刚刚申请的堆空间中。由于分配堆空间的大小是通过第一次调用comctl32:SBGetText函数来决定的,如果返回值(长度)小于0xfffe(包括空字符),就会处理正常。代码分析如下:
773de357 ff1524123d77 call comctl32!_imp__lstrlenW
773de35d 8bf0 mov esi,eax ; (0x10022) eax是statusbar中字符串的长度
...
773de3ca 0fb7ce movzx ecx,si ; ecx = 0x22 取字符串长度的低4位,如果长度大于0xffff,长度就会被截断,导致后面堆空间分配不足。
773de3cd c1e010 shl eax,10h ; eax was always 0 for me
773de3d0 0bc1 or eax,ecx ; eax = 0x22
...
773de3d6 5f pop edi
773de3d7 5e pop esi
773de3d8 5d pop ebp
773de3d9 c21400 ret 14h
当字符串长度被截断了,堆空间分配不足,第二次调用comctl32:SBGetText函数拷贝字符串的时候,就会发生堆溢出。
微软补丁的作用:在comctl32:SBGetText函数中对statusbar长度返回值进行了验证,保证了返回的长度不会超过0xfffe
参考文献:http://breakingpointsystems.com/community/blog/microsoft-vulnerability-proof-of-concept