拡張カーネル v2.3kリリースと MS13-102 の解析
拡張カーネル v.23hで実装した Vista 互換モードが重いと不評なので、無効にするオプションを追加しました

後は、MS13-102 の LRCP Client の脆弱性に対応した rpcrt4.dll を同梱しました。
解析内容については次の通り・ω・
| sub esp,000000F4h mov eax,[L77EBC2AC] push ebx push esi |
変更1
| sub esp,000000F8h mov eax,[L77EBC2AC] and dword ptr [ebp-000000D0h],00000000h push ebx push esi |
スタックフレームが1DWORD拡張されて変数が一つ増えている
| lea eax,[ebp-000000D8h] push eax lea eax,[ebp-000000C0h] push eax push esi push esi push esi lea eax,[ebp-000000E8h] push eax lea eax,[ebp-000000F0h] push eax add ebx,00000078h push ebx call [ntdll.dll!NtConnectPort] |
| lea eax,[ebp-000000E0h] push eax lea eax,[ebp-000000C0h] push eax lea eax,[ebp-000000D0h] push eax push esi push esi lea eax,[ebp-000000ECh] push eax lea eax,[ebp-000000F4h] push eax lea eax,[ebx+78h] push eax call [ntdll.dll!NtConnectPort] |
NtConnectPort で渡すパラメータがNULLから新しい変数になっています
似たような呼び出しがここ以外にもう1か所ありました
| L77E48F9D: mov eax,[ebp-000000A0h] L77E48FA3: mov ecx,[ebp-04h] pop edi pop esi pop ebx call SUB_L77E3602D |
| L77E6CA28: cmp dword ptr [ebp-000000D0h],00000100h jbe L77E490B8 mov ecx,ebx call SUB_L77E61EFD mov eax,000006C0h jmp L77E49070 L77E490B8: mov eax,[ebp-000000A0h] L77E49070: mov ecx,[ebp-04h] pop edi pop esi pop ebx call SUB_L77E3602D |
終了時にこの変数が使われていました。
| SUB_L77E785CA: mov edi,edi push ebp mov ebp,esp mov edx,[ecx+4Ch] xor eax,eax dec edx cmp edx,00000009h ja CASE_77E78603_PROC0004 movzx edx,[edx+CASE_77E78617] jmp [CASE_PROCTABLE_77E78603+edx*4] CASE_77E78603_PROC0000: call SUB_L77E78106 jmp CASE_77E78603_PROC0001 CASE_77E78603_PROC0002: pop ebp jmp L77E78459 CASE_77E78603_PROC0001: pop ebp retn 0004h |
変更2
| SUB_L77E78682: mov edi,edi push ebp mov ebp,esp push esi mov esi,ecx mov ecx,[esi+4Ch] xor eax,eax dec ecx cmp ecx,00000009h ja   ; CASE_77E786E0_PROC0004 movzx ecx,[ecx+CASE_77E786F4] jmp [CASE_PROCTABLE_77E786E0+ecx*4] CASE_77E786E0_PROC0000: mov eax,[esi+50h] mov ecx,[esi+0000009Ch] cmp ecx,[eax+4Ch] jz L77E786BC mov ecx,esi call SUB_L77E41136 test eax,eax jnz CASE_77E786E0_PROC0001 L77E786BC: mov ecx,esi call SUB_L77E781BE jmp CASE_77E786E0_PROC0001 CASE_77E786E0_PROC0002: push [ebp+08h] mov ecx,esi call SUB_L77E78511 jmp CASE_77E786E0_PROC0001 CASE_77E78603_PROC0001: pop esi pop ebp retn 0004h |
変数が最適化されてないので見にくいですが、変更点は実質ここだけ。
注意点としては、2000の場合 RPCのオフセット 0x9C などが XPと異なること
| L77E3C9D0: test al,04h jz L77E6091E cmp [ebp+14h],ecx jnz L77E4F727 mov ebx,[edi+38h] mov edi,[edi+3Ch] or byte ptr [esi+29h],10h push ebx mov [esi+0Ch],ebx call SUB_L77E381C3 pop ecx xor ecx,ecx cmp eax,ecx push 0000000Eh mov [ebp-14h],edi mov [esi+08h],eax mov [ebp-58h],ecx mov [ebp-18h],ebx |
変更3
| L77E3C9E2: test al,04h jz L77E6099A cmp [ebp+14h],ecx jnz L77E4F80F mov ebx,[edi+38h] mov edi,[edi+3Ch] or byte ptr [esi+29h],10h push ebx mov [esi+0Ch],ebx call SUB_L77E381C3 pop ecx xor ecx,ecx cmp eax,ecx push 0000000Eh mov [ebp-000000BCh],edi mov [esi+08h],eax mov [ebp-00000100h],ecx mov [ebp-000000C0h],ebx |
なんだかスタックフレームが 0xA8 増えてますね・ω・
ただ、何所で使ってるのかが見つけられず
スタックフレームの拡張だけ行いました・ω・
以上3点で、単純だったので Windows 2000に実装しました。
マイクロソフト セキュリティ情報 MS13-102 – 重要 : LRPC クライアントの脆弱性により、特権が昇格される (2898715)


Comments