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で動きそう
Comments