强烈建议先浏览以下推荐文章,再来学习HEVD的非分页池溢出漏洞!
https://www.anquanke.com/post/id/219839
https://www.freesion.com/article/2629792577/
反汇编IrpDeviceIoCtlHandler函数后可以清楚地看到HEVD驱动的分发流程。其中,0x22200F就是我们本次关注的IO控制码:跟进触发池溢出漏洞的函数TriggerBufferOverflowNonPagedPool,可知该函数使用ExAllocatePoolWithTag在非分页内存池中分配了大小为0x1f8(504)的池空间。然后使用ProbForRead检测传入的Userbuffer是否属于用户空间,然后使用memcpy将UserBuffer在不限制大小的情况下直接将用户输入复制进该空间,有缓冲区溢出的隐患。最后使用ExFreePoolWithTag释放申请的池空间。
IrpDeviceIoCtlHandler
0x22200F
TriggerBufferOverflowNonPagedPool
ExAllocatePoolWithTag
0x1f8(504)
ProbForRead
memcpy
ExFreePoolWithTag
我们先将用户缓冲区大小设置为0x1f8来验证一下内存拷贝的过程,使用Windbg在TriggerBufferOverflowNonPagedPool处下断点,执行客户端程序,触发断点:可知TriggerBufferOverflowNonPagedPool的地址为959eccce,反汇编找到调用memcpy的代码地址为959ecdc5: 在此处下断,继续运行,触发断点: 局部变量KernelBuffer的地址为0x8760f118: 我们可以使用命令!pool address查看address周围地址处的池信息: 8760f110就是TriggerBufferOverflowNonPagedPool中申请到的池的起始地址,大小为0x200,所以末尾地址为8760f110+200=8760f310,这也是下一个池块的头部所在地址。查看memcpy运行后该地址处的内存:
0x1f8
959eccce
959ecdc5
!pool address
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课