[投稿]Iscc驱动漏洞题目分析与利用

这是今年刚结束的iscc上的一个pwn题目,为一个windows下的驱动程序。题目介绍如下图。

1

下载题目后,发现题目中包含2个文件:ISCC2014ExploitMe.sys和Ioctls.h

一、简介DeviceIoControl

Ioctls.h文件内容如下,主要是告诉我们驱动程序中使用的IOCTL_CODE。

 

用户程序就可以通过用这个IOCTL_TEST1使用DeviceIoControl函数与驱动交互。DeviceIoControl的声明如下:

 

hDevice为设备驱动的handle,可以通过CreateFile打开驱动设备的符号名称获取。

dwIoControlCode 为IOCTL_CODE。这里使用IOCTL_TEST1

lpInBuffer和nInBufferSize 传入的数据及长度

lpOutBuffer和nOutBufferSize 传出的数据及长度。

二、查找溢出点

在DriverEntry中设置各分发函数

2

其中14正好是IRP_MJ_DEVICE_CONTROL,当用户程序调用DeviceIoControl时,驱动就会运行这个分发函数sub_108D0。

 

分析sub_108D0,其中v7为输入数据长度,v8为输入数据。

3

offset_106E0是一个函数指针,指向sub_10880,主要用于判断输入长度小于0x40。

4

之后的memcpy中src和len都是由外来数据控制的,而程序只是去简单判断了一下src的长度,如果len很大,那么就会覆盖dst处的很大一片数据。

8

三、   思考利用方式

首先查看dst地址处有什么可被利用的内容。

dst指向一个GoodLuck的字符串。

5

往下看,不远处看到一个函数指针。

6

较容易想到覆盖此函数指针,将函数指针修改为我们shellcode执行的地址。

覆盖指针后,需要再次触发此驱动执行该函数指针。Ida中交叉引用,发现只有一处调用该函数指针,而这个正好在刚才分析的分发函数中,所以我们需要再次调用DeviceIoControl,就可以使驱动调用该函数指针,即执行我们的shellcode。

7

四、   写利用程序

利用程序的源代码见附件。这里主要例举一些关键内容。

  1. 打开设备

其中DeviceName中的ISCC2014ExploitMe是设备的符号名。

9

  1. 第一次DeviceIoControl

其中InputData中第5字节写为0,主要是为了过输入长度小于0x40的判断。第64-68字节为覆盖函数指针的4个字节,这儿写为0。

  1. 放shellcode到0地址处

  1. 第二次DeviceIoControl,触发shellcode执行。

  1. Shellcode编写

五、   测试

环境:xp sp3

运行exploit.exe

10

可见,权限提升为system,实现了本地提权。

附件下载地址:http://pan.baidu.com/s/1o6r1cQu

征稿启事:91RI 一直相信“你不与人分享,谁与你分享”, 分享的确是件非常有意义的事情。为了让优秀的同学有 地方分享自己的独到见解,也为了让更多同学从分享中受益,同时我们也希望给那些愿意分享的小伙伴们一点点心意作为感谢,所以我们隆重了推出“有奖征文”活 动!本次活动的详情可以围观《征稿启事