マイクロソフト CVE-2017-11882 を手作業でパッチを当てた? 調べてみたところ
「Microsoft Office」に17年前からの脆弱性が発覚、月例パッチで修正 - CNET Japan
0patch Blog: Did Microsoft Just Manually Patch Their Equation Editor Executable? Why Yes, Yes They Did. (CVE-2017-11882)
Microsoft が Office 2000から組み込んでいる数式エディタ EQNEDT32.EXE に脆弱性が見つかりました
0Patch Blogによると、Microsoftが 17年前のバイナリを1回も更新せずにいて、それに手作業でパッチを当てた理由は「Microsoft がやらかした(ソース紛失)」だからだといっています。
さて、本当にそんなことがあるのか調べてみました
まず、冒頭
BFCE0A3A -> 88FA9159 リンク日時
74710800 -> 092d0900 チェックサム
0000 -> 0040 DllCharacteristics IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE (ASLR が有効)
481a->e83e 証明書テーブルサイズが大きくなった
not ecx sub edi,ecx mov eax,ecx mov edx,edi lea edi,[ebp-28h] mov esi,edx shr ecx,02h rep movsd mov ecx,eax and ecx,00000003h rep movsb lea eax,[ebp-28h] push eax |
not ecx sub edi,ecx cmp ecx,00000021h jc L00411656 mov ecx,00000020h L00411656: mov esi,edi lea edi,[ebp-28h] rep movsb xor eax,eax stosb nop lea eax,[ebp-28h] push eax |
処理速度を落として、赤字の処理をするようになっています ・ω・!
(水色は同じ処理)
not ecx sub edi,ecx cmp ecx,00000021h jc L004116C7 mov ecx,00000020h L004116C7: mov esi,edi lea edi,[ebp-00000088h] rep movsb xor eax,eax stosb nop movsx eax,[ebp-43h] cmp eax,00000001h |
少し後ろに同じ処理の修正があります
not ecx sub edi,ecx cmp ecx,00000021h jc L00411795 mov ecx,00000020h L00411795: mov esi,edi mov edi,[ebp+10h] rep movsb xor eax,eax stosb nop mov eax,00000001h jmp L00411870 |
not ecx sub edi,ecx cmp ecx,00000021h jc L00411809 mov ecx,00000020h L00411809: mov esi,edi mov edi,[ebp+10h] rep movsb xor eax,eax stosb nop mov eax,00000001h jmp L00411870 |
not ecx sub edi,ecx cmp ecx,00000021h jc L00411854 mov ecx,00000020h L00411854: mov esi,edi mov edi,[ebp+10h] rep movsb xor eax,eax stosb nop mov eax,00000001h jmp L00411870 |
not ecx sub edi,ecx mov eax,ecx mov edx,edi mov edi,[ebp-04h] mov & nbsp;esi,edx shr ecx,02h rep movsd mov ecx,eax and ecx,00000003h rep movsb mov ax,[ebp+0Ch] |
not ecx sub edi,ecx cmp ecx,00000021h jc L00421A37 mov ecx,00000020h L00421A37: mov esi,edi mov edi,[ebp-04h] rep movsb xor eax,eax stosb nop mov ax,[ebp+0Ch] |
6箇所同じ修正がありました。
なにやってるかというと、バッファーオーバーフロー時に32バイトに丸めています
L00416503: mov eax,[ebp+08h] mov [ebp-04h],eax inc [ebp+08h] call SUB_L00416352 mov ecx,[ebp-04h] mov [ecx],al mov eax,[ebp-04h] movsx eax,[eax] test eax,eax jz L00416529 jmp L00416503 L00416529: mov eax,[ebp+08h] mov byte ptr [eax],00h |
mov edi,[ebp+08h] mov ecx,[ebp+0Ch] test ecx,ecx jz L00416521 L0041650D: xchg ebx,ecx call SUB_L00416352 stosb test al,al jz L00416521 xchg ecx,ebx loop L0041650D dec edi xor eax,eax stosb L00416521: |
こっちは、関数に最大バッファーサイズを設けて、超えた場合関数が強制的に終了するように変更されています
lea eax,[ebp-000001FCh] push eax call SUB_L004164FA add esp,00000004h call SUB_L00416569 push eax lea eax,[ebp-000001FCh] push eax call SUB_L00418544 add esp,00000008h jmp L00418318 jmp L00418318 |
push 000001F4h lea eax,[ebp-000001FCh] push eax call SUB_L004164FA add esp,00000008h call SUB_L00416569 push eax lea eax,[ebp-000001FCh] push eax call SUB_L00418544 add esp,00000008h jmp L00418318 |
よび出し元1
movzx ax,al mov [ebp-00000108h],ax call SUB_L00416352 movzx ax,al mov [ebp-0000010Ch],ax lea eax,[ebp-00000104h] push eax call SUB_L004164FA add esp,00000004h mov eax,[ebp-0000010Ch] push eax lea eax,[ebp-00000104h] push eax call SUB_L004214C6 add esp,00000008h & nbsp; movsx ecx,[ebp-00000108h] mov [L0045ABE6+ecx*2],ax |
movzx ebx,al call SUB_L00416352 movzx ax,al mov [ebp-0000010Ch],ax push 00000100h lea eax,[ebp-00000104h] push eax call SUB_L004164FA add esp,00000008h mov eax,[ebp-0000010Ch] push eax lea eax,[ebp-00000104h] push eax call SUB_L004214C6 add esp,00000008h mov ecx,ebx nop dword [dword rax + rax + 0x00000000] // 何もしない mov [L0045ABE6+ecx*2],ax |
よび出し元2
8バイトの何もしない命令が埋め込まれてるのは笑った ・ω・
後は、リソーステーブルが少しいじられてバージョン情報などが書き換わっているのと
電子署名のバイナリデータで差異があることぐらいです
バイナリエディタで操作した決定的な証拠はこれです
なんと、エクスポートテーブルがバイナリとして書き出された日時が 2000/11/9 のままなのです ・ω・
リソーステーブルもそうですね ・ω・ニヤソ
命令長が大きく同じ結果になる別のオペコードに置き換えて誤魔化したりせず、素直にnopで埋めてくるのがMSの萌えポイントだと思うの
命令長が大きく同じ結果になる別のオペコードに置き換えて誤魔化したりせず、素直にnopで埋めてくるのがMSの萌えポイントだと思うの
そもそもサードパーティ製なのでソース持ってなかったんじゃね?って話も出てるようですね。
そもそもサードパーティ製なのでソース持ってなかったんじゃね?って話も出てるようですね。