MS12-081の解析

変更点1

旧版 L7C813AF0 →新版L7C814790
関数参照テーブル数 0x42 → 0x45

         db    43h;   'C'
         db    01h;
         db    00h;
         db    00h;
         dd    L7C87FC85
         db    44h;   'D'
         db    01h;
         db    00h;
         db    00h;
         dd    FreeResource
         db    45h;   'E'
         db    01h;
         db    00h;
         db    00h;
         dd    FreeResource

が追加されている。

ただし、この参照は

         dd    SSZ7C84F4B4_shdocvw_dll
         dd    L7C84FA00
         dd    L7C84F9F8

の様に、shdocvw.dllへの参照で、Windows 2000にはこの参照はなく影響を受けない。
(おそらく、IE6~IE8のバージョンの違いによって実装されていない関数を吸収するための処理)

変更点2

FindFirstFileExW 内の処理の修正
Windows 2000にも該当処理があり影響を受ける。

旧版/新版 コードは ともに0x7c80ed34 から
Windows 2000の該当コードは  0x77E65D63から

オリジナル

          push    [ebp-00000230h]
          lea    eax,[ebp-0000020Eh]
          push    eax
          lea    eax,[esi+2Ch]
          push    eax
          call    [ntdll.dll!memmove]

          mov    eax,[ebp-00000230h]
          shr    eax,1
          mov    [esi+eax*2+2Ch],bx
          movsx    eax,[ebp-00000228h]
          push    eax
          lea    eax,[ebp-00000226h]
          push    eax
          lea    eax,[esi+00000234h]
          push    eax
          call    [ntdll.dll!memmove]

変更後

          mov    edi,00000206h
          cmp    [ebp-00000230h],edi
          mov    [esi+20h],eax
          ja    L7C83CADD
          mov    edi,[ebp-00000230h]

 L7C83CADD:
          push    edi
          lea    eax,[ebp-0000020Eh]
          push    eax
          lea    eax,[esi+2Ch]
          push    eax
          call    [ntdll.dll!memmove]
          shr    edi,1
          and    word ptr [esi+edi*2+2Ch],0000h
          add    esp,0000000Ch
          cmp    byte ptr [ebp-00000228h],1Ah
          ja     L7C83CB15
          movsx    edi,[ebp-00000228h]   x1b 1c
          cmp    edi,00000018h x18 x19
          jc     L7C80EF3C
 L7C83CB15:
          push    00000018h
          pop    edi
 L7C80EF3C:
          push    edi
          lea    eax,[ebp-00000226h]
          push    eax
          lea    eax,[esi+00000234h]
          push    eax
          call    [ntdll.dll!memmove]

2か所バッファチェックが追加されています ・ω・
でも、コードがなんかおかしい。 0x1a より大きいかチェックした後 0x18より大きいかさらにチェック…謎だ

          push    [ebp-0000027Ch]
          mov    edi,[ntdll.dll!memmove]
          lea    eax,[ebp-0000025Ah]
          push    eax
          lea    eax,[esi+2Ch]
          push    eax
          call    edi
          mov    eax,[ebp-0000027Ch]
          add    esp,0000000Ch
          shr    eax,1
          mov    [esi+eax*2+2Ch],bx
          movsx    eax,[ebp-00000274h]
          push    eax
          lea    eax,[ebp-00000272h]
          push    eax
          lea    eax,[esi+00000234h]
          push    eax
          call    edi

修正前

          mov    edi,[ntdll.dll!memmove]
          mov    eax,[ebp-0000027Ch]
          cmp    eax,00000206h
          jbe    L77EA5C18
          mov    eax,00000206h

 L77EA5C18:
          push    eax
          lea    eax,[ebp-0000025Ah]
          push    eax
          lea    eax,[esi+2Ch]
          push    eax
          call    edi
          mov    eax,[ebp-0000027Ch]
          add    esp,0000000Ch
          shr    eax,1
          mov    [esi+eax*2+2Ch],bx

          movsx    eax,[ebp-00000274h]
          cmp    eax,00000018h
          jbe    L77EA5C44
          mov    al,18h
 L77EA5C44:
          push    eax
          lea    eax,[ebp-00000272h]
          push    eax
          lea    eax,[esi+00000234h]
          push    eax
          call    edi

修正後

意外と簡単でした ・ω・
この修正は拡張カーネル v2.2mとv1.8eに組み込みました

おすすめ

コメントを残す

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