CVE-2017-0283 (gdi32.dll)の解析

修正は、GdiGetBitmapBitsSize の処理らしい。
GdiGetBitmapBitsSizeEx と言う関数を作って(関数名は定義されていない)

GdiGetBitmapBitsSize(TBitmap*);
を呼ぶときに
GdiGetBitmapBitsSizeEx(NULL, TBitmap*);
をコールしてる。
で、従来GdiGetBitmapBitsSize を内部で呼び出していたところが一か所 GdiGetBitmapBitsSizeEx に置き換わっている

          push    [ebx+40h]
          push    eax
          push    [ebx+38h]
          push    ecx
          push    [ebx+30h]
          mov    ecx,ebx
          push    edi
          call    SUB_L77F101A8
          test    eax,eax
          jz     L77F10E96

          push    [ebx+48h]
          push    [ebx+40h]
          push    eax
          push    [ebx+38h]
          push    ecx
          push    [ebx+30h]
          mov    ecx,ebx
          push    edi
          call    SUB_L77F10238
          test    eax,eax
          jz     L77F10F3C

GdiGetBitmapBitsSize の内部処理を直接呼び出していた箇所が
GdiGetBitmapBitsSizeEx の内部処理を直接呼び出す形式に変わってる
          push    [ebx+40h]
          push    eax
          push    [ebx+38h]
          push    ecx
          push    [ebx+30h]
          mov    ecx,ebx
          push    edi
          call    SUB_L77F101A8
          test    eax,eax
          jz     L77F10E96

          push    [ebp+20h]
          add    edi,esi
          push    edi
          call    SUB_L77EFD949
          cmp    [ebp+18h],eax
          jnc    L77F102A3
          lea    ecx,[ebp+18h]
          push    ecx
          push    eax
          push    [ebp+14h]
          call    SUB_L77F008F1

変更箇所は関数がほとんど丸々書き換わってるので、省略・ω・
ただ、そのままコード流し込んでも Windows 2000で動きそう

おすすめ

コメントを残す

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