ღ Miranda

CVE-2015-6086: IE越界读漏洞

poc

需要在gflags.exe中开启Page HeapsUser Mode Stack Trace,还要在AppVerif.exe中开启IE的堆检查然后在浏览器中打开poc页面:

调试分析

在弹窗后附加windbg,运行后异常发生:

056bd000是已经释放的内存,往前看能找到\n,也就是000a:

栈回溯:

漏洞发生在MSHTML!CDOMStringDataList::InitFromString中,漏洞成因很简单,往前看代码:

edi保存的就是输入字符的地址,对每个字符调用IsCharSpaceW函数,也就是判断是否为空格,功能就是去掉字符串中的空格。这里poc中的\n也算空格,然后经过一次edi加2后此时指向了字符串结尾的null,然后跳到loc_63FD3E8B:

接下去edi会再一次加2,导致跳过了结尾的null,导致了越界读写。

伪代码:

漏洞利用

利用这个漏洞可以泄露mshtml的基地址,利用的是”挖坑”的方法。

由于requiredFeatures是用000a来分割item的,可以用polyLine.requiredFeatures.getItem(i)来获取每个item,所以需要堆头包含000a,这样才能用getItem(1)读取到虚函数表的地址:

这样读出来的是%\u0088%\u6161%\u6161

完整的脚本:

发表评论

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