CVE-2018-8174双杀漏洞分析复现及防御

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
6da140f6 e829000000      call    vbscript!VBScriptClass::TerminateClass (6da14124)
6da140fb 57              push    edi
6da140fc ffd6            call    esi
6da140fe 894508          mov     dword ptr [ebp+8],eax
6da14101 85c0            test    eax,eax
6da14103 0f850cdeffff    jne     vbscript!VBScriptClass::Release+0x43 (6da11f15)
6da14109 85db            test    ebx,ebx
6da1410b 0f8404deffff    je      vbscript!VBScriptClass::Release+0x43 (6da11f15)
6da14111 8b03            mov     eax,dword ptr [ebx]
6da14113 6a01            push    1
6da14115 8bcb            mov     ecx,ebx
6da14117 ff5068          call    dword ptr [eax+68h]  ds:0023:6da017b0={vbscript!VBScriptClass::`vector deleting destructor' (6da14053)}            //最终因为引用计数为0,调用vector deleting destructo,释放对象内存
0:005> p
eax=00000001 ebx=01882fd0 ecx=01882fd0 edx=00000000 esi=775bbbf0 edi=01882fd4
eip=6da140f6 esp=045ccd8c ebp=045ccd98 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
vbscript!VBScriptClass::Release+0x27:
6da140f6 e829000000      call    vbscript!VBScriptClass::TerminateClass (6da14124)
0:005> dd 1882fd0
01882fd0  6da01748 00000001 05f31f78 08469f88        //在进入TerminateClass前引用计数为1
01882fe0  0000098c 00000000 00000000 05f35efc
01882ff0  00000000 087e4fe4 00000000 00000000
01883000  ???????? ???????? ???????? ????????
0:005> p
eax=00000000 ebx=01882fd0 ecx=01882fd4 edx=0008001f esi=775bbbf0 edi=01882fd4
eip=6da140fb esp=045ccd8c ebp=045ccd98 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
vbscript!VBScriptClass::Release+0x2c:
6da140fb 57              push    edi
0:005> dd 1882fd0
01882fd0  6da01748 00000001 05f31f78 08469f88        //在执行TerminateClass后引用计数仍然为1,
01882fe0  0000098c 00000000 00000000 05f35efc
01882ff0  00000001 087e4fe4 00000000 00000000
01883000  ???????? ???????? ???????? ????????
//所以问题就在这里,它没有因为Set array_b(0)=array_a(1),而增加类对象的引用计数,造成了在类对象被释放后array_b(0)仍然指向那个类对象地址,而造成了悬垂指针
漏洞原因总结:
此漏洞就是存在于release 函数中,如果在自定义的脚本中重载了析构函数,在这个函数中操作了类的引用计数(UAF),而release函数不能正确的判断类的引用计数造成而去析构了这个类,但是仍然指向这个类的指针就变成了悬垂指针,后面通过这个悬垂指针进行一些操作来达到任意读写的目的。
接下来我们调试原始PoC看它是怎么对这个悬垂指针进行利用的,需要对vbs的基本的 数据结构 有所了解:
0x200C,即VT_VARIANT|VT_ARRAY
Constant
Value
Description
vbEmpty
0
Empty (uninitialized)
vbNull
1
Null (no valid data)
vbInteger
2
Integer
vbLong
3
Long integer
vbSingle
4
Single-precision floating-point number
vbDouble
5
Double-precision floating-point number
vbCurrency
6
Currency
vbDate
7
Date
vbString
8
String
vbObject
9
Automation object
vbError
10
Error
vbBoolean
11
Boolean
vbVariant
12
Variant (used only with arrays of Variants)
vbDataObject
13
A data-access object
vbByte
17
Byte
vbArray
8192
Array
三、 原PoC剥茧抽丝
理解了上面的基础之后我们开始调试原始PoC
原始PoC 在变量名和数据计算中存在大量的混淆,对重要位置进行还原: (以及加入了一些IsEmpty后方便查看参数)
3.1 PoC中的UAF
先分析一下原始poc中的UAF函数:
Sub UAF
 Alert "UAF"
    For i=0 To 19
        Set array(i)=New Foo   '占据系统堆碎片

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20]  下一页