|
流程继续走到
.text:6B234531 push ?g_szMachineName@@3PAGA ; Str .text:6B234537 call ebx ; __imp__wcslen .text:6B234539 cmp [ebp+eax*2+String1], 2Eh .text:6B234542 pop ecx .text:6B234543 jnz loc_6B2345DD .text:6B234549 mov eax, ?g_szComputerDnsName@@3V?$AP@G@@A ; AP<ushort> g_szComputerDnsName .text:6B23454E test eax, eax .text:6B234550 jz short loc_6B234570 .text:6B234552 lea ecx, [ebp+String1] .text:6B234558 push ecx ; Str2 .text:6B234559 push eax ; Str1 .text:6B23455A call ds:__imp___wcsicmp ;比较字符串 .text:6B234560 pop ecx .text:6B234561 test eax, eax .text:6B234563 pop ecx .text:6B234564 jnz short loc_6B234570 ; 这里不能跳转 .text:6B234566 mov ecx, [ebp+arg_4] .text:6B234569 push 1 .text:6B23456B pop eax .text:6B23456C mov [ecx], eax .text:6B23456E jmp short loc_6B2345DF 注意这里
mov eax, ?g_szComputerDnsName@@3V?$AP@G@@A ; AP<ushort> g_szComputerDnsName test eax, eax jz short loc_6B234570 这个dns name是从机器中取的
.text:6B234552 lea ecx, [ebp+String1] .text:6B234558 push ecx ; Str2 .text:6B234559 push eax ; Str1 .text:6B23455A call ds:__imp___wcsicmp 然后马上比较两个串是否相同。
根据我们的流程需要,最后要走到
mov ecx, [ebp+arg_4] push 1 pop eax mov [ecx], eax jmp short loc_6B2345DF 然后这个天杀的 IsPathnameForLocalMachine 就总算返回为真了,而且我们同时绕过了以下两处的判断:
.text:6B2178CF cmp eax, ebx ; 比较ispath函数的返回值 .text:6B2178D1 pop ecx .text:6B2178D2 jnz short loc_6B2178EC ; 这里有个判断
.text:6B2178EC cmp [ebp-1Ch], ebx ; 这里有个判断 .text:6B2178EF jz short loc_6B217906 从而让函数流程顺利的执行到了 ReplaceDNSNameWithNetBiosName
小结下绕过 IsPathnameForLocalMachine 的条件: 1. 要发送个 目标机器的dnsname 加上 一个斜杠 \ 2. 要是unicode字符串发送dnsname
实际上从 ReplaceDNSNameWithNetBiosName 这个函数的名字也可以看出来,是要把DNS name替换为 机器名。
同时也可以看出来这个漏洞的利用条件: 需要知道目标机器的dnsname。 一般如果机器在域里面,那就是域后缀。 如下图:

我的机器名是: a-dda41398f44f4 DNS后缀是: .fuck
注意这个“.”很重要,在触发条件中是一定要的。
========= 这是要抓狂的分割线 =================
现在回过头来看 ReplaceDNSNameWithNetBiosName 的代码:
push esi push 5Ch ; Ch push [esp+8+Str] ; Str call ds:__imp__wcschr pop ecx mov esi, eax pop ecx push ?g_szMachineName@@3PAGA ; Source push [esp+8+Dest] ; Dest call ds:__imp__wcscpy pop ecx pop ecx push esi ; Source push [esp+8+Dest] ; Dest call ds:__imp__wcscat
就是把 \ 后面的字符串,wcscat到 机器名后面, 而这个拷贝发生在栈上,没有做长度检查,发生了栈溢出。
最后我使用覆盖seh 的方法利用成功发送超过2000 bytes字节的stub,保证覆盖到栈底触发异常,然后call ebx执行shellcode
下面是一个装B的exploit,只适用于我的机器(机器名是a-dda41398f44f4 , dns 后缀是.fuck ),如果你要修改,需要考虑到机器名的不同带来的影响,要重新计算payload长度值. 为啥说这是装B的exploit呢,因为明明有更清晰的exploit写法我不写,要写个可以忽悠很多人的。所以说大家要是以前看到过这种exploit写法又看不懂,那不要灰心,那个人只是和我一样在装B而已!
Exploit运行效果:
 Shellcode 使用exitthread退出线程,则可以反复溢出,如果使用seh退出,则会反复执行你的shellcode
上一页 [1] [2] [3] [4] [5] [6] 下一页 |