secdrv.sys任意kernel地址覆盖漏洞浅析(0day)

secdrv.sys任意kernel地址覆盖漏洞浅析(0day)
by flyingkisser 
 
前言:
这几天忙着找工作,没及时看安全公告,这个0day出了好几天才知道,
并且等我想分析时,才发现poc已经出来了。
Anyway,还是把分析过程写一写吧,尽管没什么技术含量,
这里我只分析了主要的地方,也只说说关键的。
 
1.什么是secdrv.sys
secdrv.sys,不知道是干什么的,也懒得去google了,我只发现xp的默认安装
有这个文件,位于%systemroot%/system32/drivers/,并且,我的机器默认没有
加载这个驱动,我也不清楚什么条件下系统会加载这个驱动。
 
2.分析这个漏洞前的准备
a.加载这个驱动,并run(我用的是kmdmanager.exe)
b.开kd(这里就不用softice动态跟了,因为我的虚拟机一运行softice,主机的cpu使用率就100%,
如果有人知道为什么,麻烦来信告诉我))
 
kd> !object /Driver/
在茫茫信息中找到
 18  81218c08 Driver        secdrv
 
kd> dt nt!_driver_object 81218c08 MajorFunction
nt!_DRIVER_OBJECT
   +0x038 MajorFunction : [28] 0xfaf38f28     +0
 
kd> dd 81218c08+38+e*4 l1
81218c78  faf38f28
(因为IRP_MJ_DEVICE_CONTROL=e)
 
因此得知这个驱动对象的Irp的Dispatch函数地址是faf38f28
 
下面,我们直接看看这个Dispatch函数的内部实现就行了
 
3.Dispatch函数的内部实现
首先,通过POC我已经知道发生问题的io control code是0xCA002813
io control code的格式如下:
-------------------------------------------------------
| Bit31-Bit16 | Bit15,Bit14 | Bit14-Bit2 | Bit1,Bit0  |
-------------------------------------------------------
| DeviceType  |   Access    | Function   |   Method   |
-------------------------------------------------------
0xCA002813最后一个字节是13,即bit1,bit0是11,所以使用的Method是METHOD_NEITHER,
即i/o管理器对DeviceIoControl 提供的输入缓冲区和输出缓冲区的内容不进行额外的复制,
即输入缓存区和输出缓冲区都是ring3调用入栈的地址。这时:
InputBuf位于IO_STACK_LOCATION结构的Parameters.DeviceIoControl.Type3InputBuffer成员中
OutputBuf位于_Irp结构的UserBuffer成员中
 
下面来看这个Dispatch函数内部关键的汇编代码  
 
faf38e2c 817df0132800ca  cmp     dword ptr [ebp-10h],0CA002813h ;0xCA002813
faf38e33 7434            je      secdrv+0x5e69 (faf38e69)       ;according to poc,this is the MAGIC_IOCTL,need to jump
 
faf38e69 8b450c          mov     eax,dword ptr [ebp+0Ch]        ;eax=&pIrp->IoStatus
faf38e6c 832000          and     dword ptr [eax],0                      ;pIrp->IoStatus->Status=0
faf38e6f 8b450c          mov     eax,dword ptr [ebp+0Ch]
faf38e72 83600400        and     dword ptr [eax+4],0            ;pIrp->IoStatus->Information=0
faf38e76 8b45e8          mov     eax,dword ptr [ebp-18h]        ;pIrp->CurrentStackLocation
faf38e79 8b4010          mov     eax,dword ptr [eax+10h]        ;eax=csl->Parameters->DeviceIoControl->Type3InputBuffer
faf38e7c 8945f4          mov     dword ptr [ebp-0Ch],eax
faf38e7f 8b45e8          mov     eax,dword ptr [ebp-18h]
faf38e82 8b4008          mov     eax,dword ptr [eax+8]
faf38e85 8945ec          mov     dword ptr [ebp-14h],eax        ;eax=csl->Parameters->DeviceIoControl->InputBufferLength
faf38e88 8b45e8          mov     eax,dword ptr [ebp-18h]
faf38e8b 8b4004          mov     eax,dword ptr [eax+4]
faf38e8e 8945fc          mov     dword ptr [ebp-4],eax          ;eax=csl->Parameters->DeviceIoControl->OutputBufferLength
faf38e91 8b45e
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值