实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 7 | |
虚拟机 | Vmware | |
调试器 | Windbg | |
反汇编器 | IDA Pro | |
漏洞软件 | IE |
动态分析
打开poc.html,崩溃,kb回溯栈。
感觉可能是VGX.dll的版本或者符号表不同,导致触发点不同,所以就不动态分析了。
静态分析
IDA找到该函数。
src来自于上一个函数,但是上一个函数是OLEAUT32!DispCallFunc一般用于调用ActiveX控件中的函数。因此可以推断ORG::Get函数只是触发异常的函数,并不是漏洞函数。
分析PoC.html,body中画了两个圆
createRects函数创建了0x400个v:shape元素。
crashme函数获取了创建元素的rotation,属性,然后设置了vmll的dashstyle属性长度为0x2C(44)。
这时候可以在IDA反汇编结果中搜索出现的属性名,可以搜到相关类。如dashstyle::put
这里将dashstyle的长度设置为了0xFFFFFFFF,可疑。
去IDA找到设置dashstyle长度的函数。
这里应该动态调试跟踪一下,笔者没有跟踪。
这里-1<0x2c所以跳转了。
剩下的就是发现原先的大小2c比现在的-1大,就没重新分配空间用了原先的控件,但是由于最后又要把0x2c的堆块当0xffffffff大小的用,造成了整数溢出。(这里是比较造成的整数溢出)
漏洞利用
首先利用排布好堆加上整数溢出造成的越界读取获取了ntdll的基址,然后ROP设置内存读写执行权限绕过DEP和ASLR,最后再次利用漏洞覆盖虚表指针。
总结
movzx是无符号拓展指令,jge是有符号比较,混用的时候就可能造成整数溢出。
这里的越界读取加越界写入造成了RCE,而我最近发现的7Z的整数溢出似乎只有越界读取,是否只能造成信息泄露或者DoS呢?
文章评论