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
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