拡張カーネル v2.3kリリースと MS13-102 の解析

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

vmu
後は、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 &nbsp
;   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)

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です