首页 > 电脑 > 安全 > 系统和服务器安全 > 正文
MS05039分析
2013-05-01 09:38:05    发布(作)者:    来源:     我来说两句      
收藏    我要投稿

核心提要:1、动态调试找到有问题模块及代码用网上下载的一个GUI版利用代码,修改成vc的版本后在虚拟机win2000里测试了一下。用cdb附加到services.exe进程,因为UPNP服务在该进程里。运行利用码后目标中断在如下:eax=000e...



  1、动态调试找到有问题模块及代码
  用网上下载的一个GUI版利用代码,修改成vc的版本后在虚拟机win2000里测试了一下。
  用cdb附加到services.exe进程,因为UPNP服务在该进程里。
  运行利用码后目标中断在如下:
  eax=000e10a0 ebx=000007c0 ecx=00000020 edx=0121f8c0 esi=000e1800 edi=01220000
  eip=76750199 esp=0121f864 ebp=0121f874 iopl=0 nv up ei pl nz ac pe nc
  cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000216
  UMPNPMGR!RegisterServiceNotification+0xa58c:
  76750199 f3a5 rep movs dword ptr es:[edi],dword ptr [esi] es:0023:01220000=???????? ds:0023:000e1800=90909090
  在模块UMPNPMGR.DLL的76750199这个地方访问冲突!
  从上面edi可以看出,该值跟esp的值比较靠近,是堆栈的栈底。esi指向的地方有shellcode
  这里把shellcode复制到堆栈,由于源串过长到达堆栈底部,写入了还未分配内存的地址,触发了访问冲突!所以该漏洞是个堆栈溢出。这里就是漏洞所在的地方了。
  查看堆栈
  0:019> kn
  # ChildEBP RetAddr
  WARNING: Stack unwind information not available. Following frames may be wrong.
  00 0121f874 76746ecc UMPNPMGR!RegisterServiceNotification+0xa58c
  01 0121f908 eb909090 UMPNPMGR!RegisterServiceNotification+0x12bf
  02 0121f90c 48909008 0xeb909090
  03 0121f910 9088444f 0x48909008
  04 0121f914 90909090 0x9088444f
  05 0121f918 90909090 0x90909090
  06 0121f91c 90909090 0x90909090
  07 0121f920 90909090 0x90909090
  08 0121f924 e983c929 0x90909090
  09 0121f928 d9eed9b0 0xe983c929
  0a 0121f92c 5bf42474 0xd9eed9b0
  0b 0121f930 19137381 0x5bf42474
  0c 0121f934 833704f5 0x19137381
  0d 0121f938 f4e2fceb 0x833704f5
  0e 0121f93c 7aef9fe5 0xf4e2fceb
  0f 0121f940 c8fb0cf1 0x7aef9fe5
  10 0121f944 5b8f95e6 0xc8fb0cf1
  11 0121f948 728fd13d 0x5b8f95e6
  12 0121f94c 32787e25 0x728fd13d
  13 0121f950 bcebf461 0x32787e25
  0:019> dd esp
  0121f864 00000000 00484ae0 00000004 00000000
  0121f874 0121f908 76746ecc 000e10a0 0000ffff
  0121f884 000007e0 0121f8b0 00000000 0121f90c
  0121f894 0121fadc 0121fa00 00000001 ffffffff
  0121f8a4 00000000 00000000 00000001 00000005
  0121f8b4 000007d0 000007c0 00000000 909008eb
  0121f8c4 767a1567 909008eb 767a1567 909008eb
  0121f8d4 767a1567 909008eb 767a1567 909008eb
  附近的代码
  0:019> ub .
  UMPNPMGR!RegisterServiceNotification+0xa575:
  76750182 89510c mov dword ptr [ecx+0Ch],edx
  76750185 8b7004 mov esi,dword ptr [eax+4]
  76750188 8d5110 lea edx,[ecx+10h]
  7675018b 8b4808 mov ecx,dword ptr [eax+8]
  7675018e 8bd9 mov ebx,ecx
  76750190 8d740620 lea esi,[esi+eax+20h]
  76750194 8bfa mov edi,edx
  76750196 c1e902 shr ecx,2
  0:019> u
  UMPNPMGR!RegisterServiceNotification+0xa58c:
  76750199 f3a5 rep movs dword ptr es:[edi],dword ptr [esi] ?这里溢出
  7675019b 8bcb mov ecx,ebx
  7675019d 83e103 and ecx,3
  767501a0 f3a4 rep movs byte ptr es:[edi],byte ptr [esi]
  767501a2 8b08 mov ecx,dword ptr [eax]
  767501a4 035008 add edx,dword ptr [eax+8]
  767501a7 8bd9 mov ebx,ecx
  767501a9 8d7020 lea esi,[eax+20h]
  2、静态分析全面了解来龙去脉
  静态分析能够从全局角度看问题,所以可以用IDA或者OD反汇编分析UMPNPMGR.DLL这个模块。我是两者都用的。在IDA或者OD里直接到地址76750199就可以了。这时你在往上回溯就可以找到有问题的rpc函数了。
  找到的如下:
  接口:Interface:8D9F4E40-A03D-11CE-8F-69-08-00-3E-30-05-1B 1.0
  RPC函数36:0x76746E07 <----ms05039
  相关代码如下:
  76746E07 /. 55 push ebp
  76746E08 |. 8BEC mov ebp, esp
  76746E0A |. 6A FF push -1
  76746E0C |. 68 585E7476 push 76745E58
  76746E11 |. 68 E4277576 push ; SE 处理程序安装
  76746E16 |. 64:A1 0000000>mov eax, dword ptr fs:[0]
  76746E1C |. 50 push eax
  76746E1D |. 64:8925 00000>mov dword ptr fs:[0], esp
  76746E24 |. 51 push ecx
  76746E25 |. 51 push ecx
  76746E26 |. 83EC 54 sub esp, 54 ?被溢出的缓冲区
  76746E29 |. 53 push ebx
  76746E2A |. 56 push esi
  76746E2B |. 57 push edi
  76746E2C |. 8965 E8 mov dword ptr [ebp-18], esp
  76746E2F |. 33FF xor edi, edi
  76746E31 |. 897D FC mov dword ptr [ebp-4], edi
  76746E34 |. FF75 10 push dword ptr [ebp+10]
  76746E37 |. E8 658F0000 call 7674FDA1
  76746E3C |. 3945 18 cmp dword ptr [ebp+18], eax
  76746E3F |. 73 1F jnb short 76746E60 ;跳走
  76746E41 |. C745 DC 1F000>mov dword ptr [ebp-24], 1F
  76746E48 |> 834D FC FF or dword ptr [ebp-4], FFFFFFFF
  76746E4C |. 8B45 DC mov eax, dword ptr [ebp-24]
  76746E4F |. 8B4D F0 mov ecx, dword ptr [ebp-10]
  76746E52 |. 64:890D 00000>mov dword ptr fs:[0], ecx
  76746E59 |. 5F pop edi
  76746E5A |. 5E pop esi
  76746E5B |. 5B pop ebx
  76746E5C |. C9 leave
  76746E5D |. C2 2000 retn 20
  76746E60 |> FF75 0C push dword ptr [ebp+C]
  76746E63 |. E8 D5D5FFFF call 7674443D
  76746E68 |. 85C0 test eax, eax
  76746E6A |. 75 09 jnz short 76746E75 ;跳走
  76746E6C |. C745 DC 05000>mov dword ptr [ebp-24], 5
  76746E73 |.^ EB D3 jmp short 76746E48
  76746E75 |> FF75 0C push dword ptr [ebp+C]
  76746E78 |. E8 4DCDFFFF call 76743BCA
  76746E7D |. 85C0 test eax, eax
  76746E7F |. 74 09 je short 76746E8A ;跳走
  76746E81 |. C745 DC 07000>mov dword ptr [ebp-24], 7
  76746E88 |.^ EB BE jmp short 76746E48
  76746E8A |> 8B5D 20 mov ebx, dword ptr [ebp+20]
  76746E8D |. 83FB 04 cmp ebx, 4
  76746E90 |. 73 09 jnb short 76746E9B ;跳走
  76746E92 |. C745 DC 3B000>mov dword ptr [ebp-24], 3B
  76746E99 |.^ EB AD jmp short 76746E48
  76746E9B |> 8B75 1C mov esi, dword ptr [ebp+1C]
  76746E9E |. 8975 D8 mov dword ptr [ebp-28], esi
  76746EA1 |. 6A 01 push 1
  76746EA3 |. 58 pop eax
  76746EA4 |. 8945 94 mov dword ptr [ebp-6C], eax
  76746EA7 |. 834D 98 FF or dword ptr [ebp-68], FFFFFFFF
  76746EAB |. 897D 9C mov dword ptr [ebp-64], edi
  76746EAE |. 66:897D A0 mov word ptr [ebp-60], di
  76746EB2 |. 66:897D A2 mov word ptr [ebp-5E], di
  76746EB6 |. 8945 A4 mov dword ptr [ebp-5C], eax
  76746EB9 |. 57 push edi
  76746EBA |. 8D45 A8 lea eax, dword ptr [ebp-58]
  76746EBD |. 50 push eax
  76746EBE |. FF75 18 push dword ptr [ebp+18]
  76746EC1 |. FF75 10 push dword ptr [ebp+10]
  76746EC4 |. FF75 14 push dword ptr [ebp+14]
  76746EC7 |. E8 8F900000 call 7674FF5B <----------------进入
  76746ECC |. 8945 DC mov dword ptr [ebp-24], eax
  76746ECF |. 3BC7 cmp eax, edi
  76746ED1 |.^ 0F85 71FFFFFF jnz 76746E48
  76746ED7 |. FF75 0C push dword ptr [ebp+C]
  76746EDA |. 8D45 B8 lea eax, dword ptr [ebp-48]
  76746EDD |. 50 push eax
  76746EDE |. FF15 20107476 call dword ptr [<&NTDLL.RtlInitUnicod>; ntdll.RtlInitUnicodeString
  76746EE4 |. 8D45 94 lea eax, dword ptr [ebp-6C]
  76746EE7 |. 8945 C0 mov dword ptr [ebp-40], eax
  76746EEA |. C745 C4 24000>mov dword ptr [ebp-3C], 24
  76746EF1 |. 8975 C8 mov dword ptr [ebp-38], esi
  76746EF4 |. 895D CC mov dword ptr [ebp-34], ebx
  76746EF7 |. 8B45 24 mov eax, dword ptr [ebp+24]
  76746EFA |. 8945 D0 mov dword ptr [ebp-30], eax
  76746EFD |. 897D D4 mov dword ptr [ebp-2C], edi
  76746F00 |. 6A 20 push 20
  76746F02 |. 8D45 B8 lea eax, dword ptr [ebp-48]
  76746F05 |. 50 push eax
  76746F06 |. 6A 14 push 14
  76746F08 |. FF15 1C107476 call dword ptr [<&NTDLL.NtPlugPlayCon>; ntdll.ZwPlugPlayControl
  76746F0E |. 8945 E0 mov dword ptr [ebp-20], eax
  76746F11 |. 3BC7 cmp eax, edi
  76746F13 |. 74 0E je short 76746F23
  76746F15 |. 50 push eax
  76746F16 |. E8 11EFFFFF call 76745E2C
  76746F1B |. 8945 DC mov dword ptr [ebp-24], eax
  76746F1E |.^ E9 25FFFFFF jmp 76746E48
  76746F23 |> 897D DC mov dword ptr [ebp-24], edi
  76746F26 .^ E9 1DFFFFFF jmp 76746E48
  7674FF5B /$ 55 push ebp
  7674FF5C |. 8BEC mov ebp, esp
  7674FF5E |. 51 push ecx
  7674FF5F |. 8B4D 0C mov ecx, dword ptr [ebp+C]
  7674FF62 |. 53 push ebx
  7674FF63 |. B8 01800000 mov eax, 8001
  7674FF68 |. 33DB xor ebx, ebx
  7674FF6A |. 56 push esi
  7674FF6B |. 3BC8 cmp ecx, eax
  7674FF6D |. 57 push edi
  7674FF6E |. 895D FC mov dword ptr [ebp-4], ebx
  7674FF71 |. 0F87 AA010000 ja 76750121 ;跳走
  7674FF77 |. 0F84 65010000 je 767500E2
  7674FF7D |. 8BC1 mov eax, ecx
  7674FF7F |. 48 dec eax ; Switch (cases 1..6)
  7674FF80 |. 0F84 32010000 je 767500B8
  7674FF86 |. 48 dec eax
  7674FF87 |. 0F84 D8000000 je 76750065
  7674FF8D |. 48 dec eax
  7674FF8E |. 0F84 94000000 je 76750028
  7674FF94 |. 48 dec eax
  7674FF95 |. 74 49 je short 7674FFE0
  7674FF97 |. 48 dec eax
  7674FF98 |. 48 dec eax
  7674FF99 |. 0F85 9D010000 jnz 7675013C
  7674FF9F |. 837D 10 24 cmp dword ptr [ebp+10], 24 ; Case 6 of switch 7674FF7F
  7674FFA3 |. 0F82 73020000 jb 7675021C
  7674FFA9 |. 8B4D 08 mov ecx, dword ptr [ebp+8]
  7674FFAC |. 8379 04 10 cmp dword ptr [ecx+4], 10
  7674FFB0 |. 0F85 66020000 jnz 7675021C
  7674FFB6 |. 8B45 14 mov eax, dword ptr [ebp+14]
  7674FFB9 |. C600 06 mov byte ptr [eax], 6
  7674FFBC |. 8858 01 mov byte ptr [eax+1], bl
  7674FFBF |. 66:8B51 08 mov dx, word ptr [ecx+8]
  7674FFC3 |. 66:8950 02 mov word ptr [eax+2], dx
  7674FFC7 |. 8B51 0C mov edx, dword ptr [ecx+C]
  7674FFCA |. 8950 04 mov dword ptr [eax+4], edx
  7674FFCD |. 8B49 10 mov ecx, dword ptr [ecx+10]
  7674FFD0 |. 8948 08 mov dword ptr [eax+8], ecx
  7674FFD3 |. 8958 0C mov dword ptr [eax+C], ebx
  7674FFD6 |> 8B45 FC mov eax, dword ptr [ebp-4]
  7674FFD9 |. 5F pop edi
  7674FFDA |. 5E pop esi
  7674FFDB |. 5B pop ebx
  7674FFDC |. C9 leave
  7674FFDD |. C2 1400 retn 14
  7674FFE0 |> 837D 10 20 cmp dword ptr [ebp+10], 20 ; Case 4 of switch 7674FF7F
  7674FFE4 |. 0F82 64010000 jb 7675014E
  7674FFEA |. 8B7D 08 mov edi, dword ptr [ebp+8]
  7674FFED |. 837F 04 0C cmp dword ptr [edi+4], 0C
  7674FFF1 |. 0F85 25020000 jnz 7675021C
  7674FFF7 |. 8B75 14 mov esi, dword ptr [ebp+14]
  7674FFFA |. C606 02 mov byte ptr [esi], 2
  7674FFFD |. FF77 08 push dword ptr [edi+8]
  76750000 |. E8 C6110000 call 767511CB
  76750005 |. 8846 01 mov byte ptr [esi+1], al
  76750008 |. FF77 08 push dword ptr [edi+8]
  7675000B |. E8 9C110000 call 767511AC
  76750010 |. 66:8946 02 mov word ptr [esi+2], ax
  76750014 |. 8B47 0C mov eax, dword ptr [edi+C]
  76750017 |. 8946 04 mov dword ptr [esi+4], eax
  7675001A |. 8B47 0C mov eax, dword ptr [edi+C]
  7675001D |. 8946 08 mov dword ptr [esi+8], eax
  76750020 |. 8B47 10 mov eax, dword ptr [edi+10]
  76750023 |. 8946 0C mov dword ptr [esi+C], eax
  76750026 |.^ EB AE jmp short 7674FFD6
  76750028 |> 837D 10 1C cmp dword ptr [ebp+10], 1C ; Case 3 of switch 7674FF7F
  7675002C |. 0F82 1C010000 jb 7675014E
  76750032 |. 8B7D 08 mov edi, dword ptr [ebp+8]
  76750035 |. 837F 04 0C cmp dword ptr [edi+4], 0C
  76750039 |. 0F85 DD010000 jnz 7675021C
  7675003F |. 8B75 14 mov esi, dword ptr [ebp+14]
  76750042 |. C606 04 mov byte ptr [esi], 4
  76750045 |. 885E 01 mov byte ptr [esi+1], bl
  76750048 |. FF77 08 push dword ptr [edi+8]
  7675004B |. E8 CE100000 call 7675111E
  76750050 |. 66:8946 02 mov word ptr [esi+2], ax
  76750054 |. 8B47 0C mov eax, dword ptr [edi+C]
  76750057 |. 8946 04 mov dword ptr [esi+4], eax
  7675005A |. 895E 08 mov dword ptr [esi+8], ebx
  7675005D |. 895E 0C mov dword ptr [esi+C], ebx
  76750060 |.^ E9 71FFFFFF jmp 7674FFD6
  76750065 |> 837D 10 44 cmp dword ptr [ebp+10], 44 ; Case 2 of switch 7674FF7F
  76750069 |. 0F82 DF000000 jb 7675014E
  7675006F |. 8B75 08 mov esi, dword ptr [ebp+8]
  76750072 |. 837E 04 28 cmp dword ptr [esi+4], 28
  76750076 |. 0F85 A0010000 jnz 7675021C
  7675007C |. 8B7D 14 mov edi, dword ptr [ebp+14]
  7675007F |. 53 push ebx
  76750080 |. C607 01 mov byte ptr [edi], 1
  76750083 |. 885F 01 mov byte ptr [edi+1], bl
  76750086 |. FF76 18 push dword ptr [esi+18]
  76750089 |. E8 B30F0000 call 76751041
  7675008E |> 6A 20 push 20
  76750090 |. 66:8947 02 mov word ptr [edi+2], ax
  76750094 |. 8B46 08 mov eax, dword ptr [esi+8]
  76750097 |. 8B56 0C mov edx, dword ptr [esi+C]
  7675009A |. 59 pop ecx
  7675009B |. E8 4A270000 call 767527EA
  767500A0 |. 8947 08 mov dword ptr [edi+8], eax
  767500A3 |. 8B46 08 mov eax, dword ptr [esi+8]
  767500A6 |. 8947 04 mov dword ptr [edi+4], eax
  767500A9 |. 8B46 10 mov eax, dword ptr [esi+10]
  767500AC |. 2B46 08 sub eax, dword ptr [esi+8]
  767500AF |. 40 inc eax
  767500B0 |. 8947 0C mov dword ptr [edi+C], eax
  767500B3 |.^ E9 1EFFFFFF jmp 7674FFD6
  767500B8 |> 837D 10 44 cmp dword ptr [ebp+10], 44 ; Case 1 of switch 7674FF7F
  767500BC |. 0F82 5A010000 jb 7675021C
  767500C2 |. 8B75 08 mov esi, dword ptr [ebp+8]
  767500C5 |. 837E 04 24 cmp dword ptr [esi+4], 24
  767500C9 |. 0F85 4D010000 jnz 7675021C
  767500CF |. 8B7D 14 mov edi, dword ptr [ebp+14]
  767500D2 |. C607 03 mov byte ptr [edi], 3
  767500D5 |. 885F 01 mov byte ptr [edi+1], bl
  767500D8 |. FF76 18 push dword ptr [esi+18]
  767500DB |. E8 D80E0000 call 76750FB8
  767500E0 |.^ EB AC jmp short 7675008E
  767500E2 |> 837D 10 24 cmp dword ptr [ebp+10], 24
  767500E6 |. 0F82 30010000 jb 7675021C
  767500EC |. 8B4D 08 mov ecx, dword ptr [ebp+8]
  767500EF |. 8379 04 0C cmp dword ptr [ecx+4], 0C
  767500F3 |. 0F85 23010000 jnz 7675021C
  767500F9 |. 8B45 14 mov eax, dword ptr [ebp+14]
  767500FC |. C600 81 mov byte ptr [eax], 81
  767500FF |. 8858 01 mov byte ptr [eax+1], bl
  76750102 |. 66:8B51 14 mov dx, word ptr [ecx+14]
  76750106 |. 66:8950 02 mov word ptr [eax+2], dx
  7675010A |. 8B51 08 mov edx, dword ptr [ecx+8]
  7675010D |. 8950 04 mov dword ptr [eax+4], edx
  76750110 |. 8B51 0C mov edx, dword ptr [ecx+C]
  76750113 |. 8950 08 mov dword ptr [eax+8], edx
  76750116 |. 8B49 10 mov ecx, dword ptr [ecx+10]
  76750119 |. 8948 0C mov dword ptr [eax+C], ecx
  7675011C |.^ E9 B5FEFFFF jmp 7674FFD6
  76750121 |> 81E9 02800000 sub ecx, 8002 ; Switch (cases 8002..FFFF)
  76750127 |. 0F84 E9000000 je 76750216 ;不跳
  7675012D |. 49 dec ecx
  7675012E |. 0F84 96000000 je 767501CA ;不跳
  76750134 |. 81E9 FC7F0000 sub ecx, 7FFC
  7675013A |. 74 0C je short 76750148 ;跳走
  7675013C |> C745 FC 0B000>mov dword ptr [ebp-4], 0B ; Default case of switch 76750121
  76750143 |.^ E9 8EFEFFFF jmp 7674FFD6
  76750148 |> 837D 10 21 cmp dword ptr [ebp+10], 21 ; Case FFFF of switch 76750121
  7675014C |. 73 0C jnb short 7675015A ;跳走
  7675014E |> C745 FC 13000>mov dword ptr [ebp-4], 13
  76750155 |.^ E9 7CFEFFFF jmp 7674FFD6
  7675015A |> 8B4D 14 mov ecx, dword ptr [ebp+14]
  7675015D |. 8B45 08 mov eax, dword ptr [ebp+8]
  76750160 |. C601 05 mov byte ptr [ecx], 5
  76750163 |. 8859 01 mov byte ptr [ecx+1], bl
  76750166 |. 66:8B50 0C mov dx, word ptr [eax+C]
  7675016A |. 66:8951 02 mov word ptr [ecx+2], dx
  7675016E |. 8B10 mov edx, dword ptr [eax]
  76750170 |. 8B70 08 mov esi, dword ptr [eax+8]
  76750173 |. 8D5432 10 lea edx, dword ptr [edx+esi+10]
  76750177 |. 8951 04 mov dword ptr [ecx+4], edx
  7675017A |. 8B50 08 mov edx, dword ptr [eax+8]
  7675017D |. 8951 08 mov dword ptr [ecx+8], edx
  76750180 |. 8B10 mov edx, dword ptr [eax]
  76750182 |. 8951 0C mov dword ptr [ecx+C], edx
  76750185 |. 8B70 04 mov esi, dword ptr [eax+4]
  76750188 |. 8D51 10 lea edx, dword ptr [ecx+10]
  7675018B |. 8B48 08 mov ecx, dword ptr [eax+8]
  7675018E |. 8BD9 mov ebx, ecx
  76750190 |. 8D7406 20 lea esi, dword ptr [esi+eax+20]
  76750194 |. 8BFA mov edi, edx
  76750196 |. C1E9 02 shr ecx, 2
  76750199 |. F3:A5 rep movs dword ptr es:[edi], dword p> <--------这里溢出到堆栈底,触发异常
  7675019B |. 8BCB mov ecx, ebx
  7675019D |. 83E1 03 and ecx, 3
  767501A0 |. F3:A4 rep movs byte ptr es:[edi], byte ptr>
  767501A2 |. 8B08 mov ecx, dword ptr [eax]
  767501A4 |. 0350 08 add edx, dword ptr [eax+8]
  767501A7 |. 8BD9 mov ebx, ecx
  767501A9 |. 8D70 20 lea esi, dword ptr [eax+20]
  767501AC |. 8BFA mov edi, edx
  767501AE |. C1E9 02 shr ecx, 2
  767501B1 |. F3:A5 rep movs dword ptr es:[edi], dword p>
  767501B3 |. 8BCB mov ecx, ebx
  767501B5 |. 83E1 03 and ecx, 3
  767501B8 |. F3:A4 rep movs byte ptr es:[edi], byte ptr>
  767501BA |. 8B38 mov edi, dword ptr [eax]
  767501BC |. 8D70 10 lea esi, dword ptr [eax+10]
  767501BF |. 03FA add edi, edx
  767501C1 |. A5 movs dword ptr es:[edi], dword ptr [e>
  767501C2 |. A5 movs dword ptr es:[edi], dword ptr [e>
  767501C3 |. A5 movs dword ptr es:[edi], dword ptr [e>
  767501C4 |. A5 movs dword ptr es:[edi], dword ptr [e>
  767501C5 |.^ E9 0CFEFFFF jmp 7674FFD6
  767501CA |> 837D 10 14 cmp dword ptr [ebp+10], 14 ; Case 8003 of switch 76750121
  767501CE |. 72 4C jb short 7675021C
  767501D0 |. 8B45 14 mov eax, dword ptr [ebp+14]
  767501D3 |. 8B4D 08 mov ecx, dword ptr [ebp+8]
  767501D6 |. BE 00000200 mov esi, 20000
  767501DB |. 8958 08 mov dword ptr [eax+8], ebx
  767501DE |. 8958 0C mov dword ptr [eax+C], ebx
  767501E1 |. 8970 04 mov dword ptr [eax+4], esi
  767501E4 |. 0FB651 0C movzx edx, byte ptr [ecx+C]
  767501E8 |. 0BD6 or edx, esi
  767501EA |. 8950 04 mov dword ptr [eax+4], edx
  767501ED |. 0FB671 0D movzx esi, byte ptr [ecx+D]
  767501F1 |. C1E6 18 shl esi, 18
  767501F4 |. 0BF2 or esi, edx
  767501F6 |. 8970 04 mov dword ptr [eax+4], esi
  767501F9 |. 8B51 10 mov edx, dword ptr [ecx+10]
  767501FC |. 8950 08 mov dword ptr [eax+8], edx
  767501FF |. 8B49 08 mov ecx, dword ptr [ecx+8]
  76750202 |. 83E1 08 and ecx, 8
  76750205 |. 80F9 08 cmp cl, 8
  76750208 |.^ 0F85 C8FDFFFF jnz 7674FFD6
  7675020E |. 0848 05 or byte ptr [eax+5], cl
  76750211 |.^ E9 C0FDFFFF jmp 7674FFD6
  76750216 |> 837D 10 18 cmp dword ptr [ebp+10], 18 ; Case 8002 of switch 76750121
  7675021A |. 73 0C jnb short 76750228
  7675021C |> C745 FC 06000>mov dword ptr [ebp-4], 6
  76750223 |.^ E9 AEFDFFFF jmp 7674FFD6
  76750228 |> 8B45 14 mov eax, dword ptr [ebp+14]
  7675022B |. 8B4D 08 mov ecx, dword ptr [ebp+8]
  7675022E |. 8958 04 mov dword ptr [eax+4], ebx
  76750231 |. 8048 06 01 or byte ptr [eax+6], 1
  76750235 |. 8B50 04 mov edx, dword ptr [eax+4]
  76750238 |. 8958 08 mov dword ptr [eax+8], ebx
  7675023B |. 8958 0C mov dword ptr [eax+C], ebx
  7675023E |. 0FB671 0C movzx esi, byte ptr [ecx+C]
  76750242 |. 0BF2 or esi, edx
  76750244 |. 8970 04 mov dword ptr [eax+4], esi
  76750247 |. 8B51 10 mov edx, dword ptr [ecx+10]
  7675024A |. 8950 08 mov dword ptr [eax+8], edx
  7675024D |. 8B51 14 mov edx, dword ptr [ecx+14]
  76750250 |. 8950 0C mov dword ptr [eax+C], edx
  76750253 |. 8B51 08 mov edx, dword ptr [ecx+8]
  76750256 |. 83E2 01 and edx, 1
  76750259 |. BE 00010000 mov esi, 100
  7675025E |. 80FA 01 cmp dl, 1
  76750261 |. 75 5F jnz short 767502C2
  76750263 |. 0970 04 or dword ptr [eax+4], esi
  76750266 |> 8B51 08 mov edx, dword ptr [ecx+8]
  76750269 |. BF 00020000 mov edi, 200
  7675026E |. 83E2 02 and edx, 2
  76750271 |. 80FA 02 cmp dl, 2
  76750274 |. 75 52 jnz short 767502C8
  76750276 |. 0978 04 or dword ptr [eax+4], edi
  76750279 |> F641 08 04 test byte ptr [ecx+8], 4
  7675027D |. 74 04 je short 76750283
  7675027F |. 8048 05 04 or byte ptr [eax+5], 4
  76750283 |> F641 08 08 test byte ptr [ecx+8], 8
  76750287 |. 74 04 je short 7675028D
  76750289 |. 8048 05 08 or byte ptr [eax+5], 8
  7675028D |> F641 08 10 test byte ptr [ecx+8], 10
  76750291 |. 74 04 je short 76750297
  76750293 |. 8048 05 10 or byte ptr [eax+5], 10
  76750297 |> F641 08 20 test byte ptr [ecx+8], 20
  7675029B |. 74 04 je short 767502A1
  7675029D |. 8048 05 20 or byte ptr [eax+5], 20
  767502A1 |> F641 08 40 test byte ptr [ecx+8], 40
  767502A5 |. 74 04 je short 767502AB
  767502A7 |. 8048 05 40 or byte ptr [eax+5], 40
  767502AB |> 8B49 08 mov ecx, dword ptr [ecx+8]
  767502AE |. BA 00030000 mov edx, 300
  767502B3 |. 23CA and ecx, edx
  767502B5 |. 3BCE cmp ecx, esi
  767502B7 |. 75 15 jnz short 767502CE
  767502B9 |. 8048 07 01 or byte ptr [eax+7], 1
  767502BD |.^ E9 14FDFFFF jmp 7674FFD6
  767502C2 |> 8060 05 FE and byte ptr [eax+5], 0FE
  767502C6 |.^ EB 9E jmp short 76750266
  767502C8 |> 8060 05 FD and byte ptr [eax+5], 0FD
  767502CC |.^ EB AB jmp short 76750279
  767502CE |> 3BCF cmp ecx, edi
  767502D0 |. 75 09 jnz short 767502DB
  767502D2 |. 8048 07 02 or byte ptr [eax+7], 2
  767502D6 |.^ E9 FBFCFFFF jmp 7674FFD6
  767502DB |> 3BCA cmp ecx, edx
  767502DD |.^ 0F85 F3FCFFFF jnz 7674FFD6
  767502E3 |. 8048 07 03 or byte ptr [eax+7], 3
  767502E7 .^ E9 EAFCFFFF jmp 7674FFD6
  3、图形化分析更直观
  上面的一大坨代码是不是看的眼花?反正我是没看,因为我更喜欢图形化的分析。
  IDA有代码分块流程图,这个用来确定条件的跳转不错!但是它不能编辑有点遗憾。
  我是喜欢用一些图线、文本做一些标记的,可能是因为CAD用多了,职业习惯吧!
  代码里面的那些符号,调用等用直线来指示是多么的直观方便,鼠标一点就能找到。
  每个数据的输入输出操作模型如下图所示,
  控制流代表代码能够运行到这里,即使有数据的操作如果控制流到达不了这里也是无用的。
  例如死循环包围的数据输入输出,无权访问的代码等。
  输入数据代表我们输入的数据。没有输入数据就没法控制了!这是最主要的。
  缓冲区代表堆栈或者堆上的空间。在它们的生命期,可以全面的找到相关代码!
  操作就是一些数据搬运了,如strcpy、rep movsd等。从操作方面入手,可能会有遗漏,因为并不是所有的操作都是api,rep movsd等,有些是就是一些mov指令。
  条件这是每个操作前要判断的,如果没有条件就是有溢出了,或者条件判断错误等都有问题了。从编程者的角度看,要保证输入数据的长度要小于剩余空间的大小。
  

  


  对于MS05039
  数据操作的参考如下:(图片上半部分为内层函数7674FF5B,下半部为外层函数76746E07)
  

  


  从上面可以看到数据的大小是来自RPC函数76746E07的结构指针[ebp+14]偏移+8的地方
  从外层到内层都没见到该值与缓冲区大小的比较,所以漏洞原因就在于此!
  输入数据如下:(图片左半部分为内层函数7674FF5B,右半部为外层函数76746E07)
  

  


  缓冲区如下:(图片右半部分为内层函数7674FF5B,左半部为外层函数76746E07)
  

  


  各函数参数的条件
  这个就用IDA的WinGraph来看就很容易了,从问题代码往上各个条件都要满足就可以了。
  函数7674FF5B参数满足条件:
  

  


  76746E07参数满足条件:
  

  


  在OD中载入该dll,改eip为76746E07,参照上面单步运行。
  sub_7674fda1(arg_8)=sub_7674fda1(ffffh)=21h
  所以arg_10>=21h
  sub_7674443d(arg_4)=sub_7674443d(0)=1
  sub_76743bca(arg_4)= sub_76743bca(0)=0
  所以设arg_4=0即可
  主要的参数就按照上图构造即可。
  按照下图在OD中构造参数:
  

  


  指向的数据构造:
  所构造的数据偏移为10h,大小为20h。
  

  


  单步运行模拟这个过程到下图,可以看到来源确实是跟前面所述,是一个结构里的数据,
  目的是上层的ebp-48h的地方。
  

  


  单步过后,目标缓冲区被我们的数据填充。
  如果大小设置成很大的数的话,那就会访问冲突了。
  

  

关键字:MS05039 分析

点击复制链接 与好友分享!回本站首页
分享到:
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:SAP NETWEAVER 远程命令执行漏洞的利用与影响
下一篇:Windows攻防对抗实践(MS01-026)
相关文章
图文推荐
美图推荐
热文推荐