距离Hacking Team数据泄漏至今已经一周多了,越来越多有价值的东西渐渐的被大家从400G资料中挖掘出来。本周初,一个IE 0day在圈子内流传开来,这已经是从该组织泄漏的第7个漏洞了(其中有6个0day),幸运的是微软在本周的安全补丁中修补了这个漏洞,编号MS15-065。针对此漏洞,启明星辰ADLab根据获取的poc分析如下:
当页面加载时,IE浏览器会做两件与本漏洞相关的事情。
一是函数jscript9!InterpreterThunkEmitter::NewThunkBlock会调用jscript9!EmitBufferManager::NewAllocation函数。
该函数将会调用CustomHeap::Heap::Alloc分配一块内存这里的地址为07ab0000。
函数返回jscript9!InterpreterThunkEmitter::NewThunkBlock,此处将会对新分配的内存赋值,将需要执行的代码写入到堆上,经过一连串的拷贝、赋值和修改之后,当NewThunkBlock函数返回时新分配的内存已经布置好了。
二是维护两个对象:Js::FunctionBody(4d24120)和Js::ScriptFunction(4d18380)。
接着POC会运行到下面几句:
这几句会新建一个script对象,同时script的ScriptFunction和FunctionBody也会被创建。
接下来NativeCodeGenerator::CheckCodeGenThunk会被调用,该函数会找到FunctionBody+4处的函数指针并调用jscript9!Js::FunctionBody::EnsureDynamicInterpreterThunk这个函数。
这里EnsureDynamicInterpreterThunk做了很多事情,这些事主要是在函数GenerateDynamicInterpreterThunk中完成的。
函数里面值得注意的代码如上,调用GetNextThunk获取NextThunk,第一次获取失败,GetNextThunk会新建一块新的内存并将jit代码拷贝进去(4830000)。
并将新分配的4830000地址赋值给第二次创建的FunctionBody+4。
第二次GetNextThunk返回 07ab0000,所以第一个FunctionBody+4处的函数指针将被改为07ab0000。
当q1.parentNode.insertBefore(q2, q1)这句执行完成后,07ab0000这块内存将会被释放。
但是,此时FunctionBody+4处的指针仍旧是07ab0000。
之后CheckCodeGenDone被调用
jscript9!NativeCodeGenerator::CheckCodeGenDone:
6b29727e 8bff mov edi,edi
6b297280 55 push ebp
6b297281 8bec mov ebp,esp
6b297283 83ec0c sub esp,0Ch
6b297286 8b4114 mov eax,dword ptr [ecx+14h]
6b297289 53 push ebx
6b29728a 56 push esi
6b29728b 57 push edi
6b29728c 8b7010 mov esi,dword ptr [eax+10h]
……
6b496dc4 8b7e04 mov edi,dword ptr [esi+4]
……
6b2472f8 8bc7 mov eax,
看的出程序从代表了ScriptFunction的对象中取出了一个指向了FunctionBody的对象,而这个对象+4的偏移处正是已经释放的内存地址。
NativeCodeGenerator::CheckCodeGenThunk会将这个地址当作代码执行,因此导致漏洞产生。
|