-
-
[原创]《0day安全第二版》样章发布3:第22章 内核漏洞利用技术
-
发表于:
2011-2-25 09:58
10886
-
[原创]《0day安全第二版》样章发布3:第22章 内核漏洞利用技术
各位读者:
大家好!
书接上回,昨天放出了21章的样章,今天放出“第22章 内核漏洞利用技术”的样章。如果说21章过于基础,是因为要照顾一些初学者,那么从第22章起,就真正开始讨论内核漏洞的原理,如何利用,利用的思路和方法,以及利用程序的编写等。本章会通过一个例子exploitme.sys来逐步展开这些内容。
第22章 内核漏洞利用技术 1
22.1 利用实验之exploitme.sys 1
22.2 内核漏洞利用思路 4
22.3 内核漏洞利用方法 5
22.4 内核漏洞利用实战与编程 5
22.5 Ring0 Shellcode的编写 5
第22章 内核漏洞利用技术
22.1 利用实验之exploitme.sys
为了浅显易懂的介绍内核漏洞利用技术,本节首先编写一个有漏洞的驱动(exploitme.sys)作为引子,逐步展开内核漏洞的利用思路和方法。
前面21.6.1节,helloworld.sys驱动的IoControl派遣例程没有处理任何IoControlCode,仅仅设置了IRP的完成状态和IRP的操作字节数,然后调用了IoCompleteRequest函数完成了IRP的处理,可以把这些理解为必做的工作。
这里我们在helloworld.c的基础上,修改其中的派遣例程DrvDispatch函数,并添加几个宏,如下代码所示。
/********************************************************************
created: 2010/12/06
filename: D:\0day\ExploitMe\exploitme.c
author: shineast
purpose: Exploit me driver demo
*********************************************************************/
#define DEVICE_NAME L"\\Device\\ExploitMe"
#define DEVICE_LINK L"\\DosDevices\\ExploitMe"
#define FILE_DEVICE_EXPLOIT_ME 0x00008888
#define IOCTL_EXPLOIT_ME (ULONG)CTL_CODE(\
FILE_DEVICE_EXPLOIT_ME,0x800,METHOD_NEITHER,FILE_WRITE_ACCESS)
/**********************************************************************
驱动派遣例程函数
输入:驱动对象的指针,pIrp指针
输出:NTSTATUS类型的结果
**********************************************************************/
NTSTATUS DrvDispatch(IN PDEVICE_OBJECT driverObject,IN PIRP pIrp)
{
PIO_STACK_LOCATION pIrpStack;//当前的pIrp栈
PVOID Type3InputBuffer;//用户态输入地址
PVOID UserBuffer;//用户态输出地址
ULONG inputBufferLength;//输入缓冲区的大小
ULONG outputBufferLength;//输出缓冲区的大小
ULONG ioControlCode;//DeviceIoControl的控制号
PIO_STATUS_BLOCK IoStatus;//pIrp的IO状态指针
NTSTATUS ntStatus=STATUS_SUCCESS;//函数返回值
//获取数据
pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
Type3InputBuffer = pIrpStack->Parameters.DeviceIoControl.Type3InputBuffer;
UserBuffer = pIrp->UserBuffer;
inputBufferLength = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
outputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
ioControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
IoStatus=&pIrp->IoStatus;
IoStatus->Status = STATUS_SUCCESS;// Assume success
IoStatus->Information = 0;// Assume nothing returned
//根据ioControlCode 完成对应的任务
switch(ioControlCode)
{
case IOCTL_EXPLOIT_ME:
if ( inputBufferLength >= 4 && outputBufferLength >= 4 )
{
*(ULONG *)UserBuffer = *(ULONG *)Type3InputBuffer;
IoStatus->Information = sizeof(ULONG);
}
break;
}
//返回
IoStatus->Status = ntStatus;
IoCompleteRequest(pIrp,IO_NO_INCREMENT);
return ntStatus;
}
从上面的代码可以看出,exploitme.sys驱动创建的设备名称为“\Device\ExploitMe”,符号链接名称为“\DosDevices\ExploitMe”。根据21.6.3节,在Ring3就可以通过设备名称“\\.\ExploitMe”打开设备,并得到设备句柄,进而使用DeviceIoControl函数来调用驱动的派遣例程,与驱动进行交互。
。。。。。。(详见附件中的样章)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!