poc来自exploit-db
win7 x86平台下,开启UST HPA,IE打开POC,crash在WINDBG如图
引用的对象已经被释放,应该是UAF漏洞。分析对象在哪里创建,哪里释放,才导致了在这个位置UAF。
发现释放对象的函数是CTextArea对象的析构函数。
在POC中也看到有TextArea标签,应该就是创建这个标签时创建的对象。
如下图,在IDA中可以通过函数名筛选到TextArea对象的构造函数为CTextArea::CreateElement
可以看到在堆中申请了60bytes成功后,对象指针保存在地址671DCE1A(mshtml!CTextArea::CreateElement+0x36)的esi,在mshtml!CTextArea::CreateElement+0x36下断,确认这点。
重新运行POC,断下来2次,因为POC中有2个TextArea标签。如图:
析构函数对象(07c09fa0)释放了
在接着就到了crash的地方
现在对象的创建,析构过程分析好了,那再来看此时重用导致的crash的时机。
看到第二个的doreset函数,在POC中正好对应了document.getElementById("testfm").reset();
。
总结这次UAF,一开始所有对象都创建好,当调用document.getElementById("testfm").reset();
时,child2的onpropertychange方法被触发,changer函数中所有对象被清空,当这些动作完成之后,doreset函数又来清空CTextArea对象,导致UAF发生。