首页
社区
课程
招聘
5
[原创]初探内核漏洞:HEVD学习笔记——BufferOverflowNonPagedPool
发表于: 2022-7-18 14:30 8675

[原创]初探内核漏洞:HEVD学习笔记——BufferOverflowNonPagedPool

2022-7-18 14:30
8675

目录

HEVD学习笔记——BufferOverflowNonPagedPool

前置知识

强烈建议先浏览以下推荐文章,再来学习HEVD的非分页池溢出漏洞!

(1)Windows内核对象管理

https://www.anquanke.com/post/id/219839

(2)Windows内核池

https://www.freesion.com/article/2629792577/

漏洞定位

反汇编IrpDeviceIoCtlHandler函数后可以清楚地看到HEVD驱动的分发流程。其中,0x22200F就是我们本次关注的IO控制码:
图片描述
跟进触发池溢出漏洞的函数TriggerBufferOverflowNonPagedPool,可知该函数使用ExAllocatePoolWithTag在非分页内存池中分配了大小为0x1f8(504)的池空间。然后使用ProbForRead检测传入的Userbuffer是否属于用户空间,然后使用memcpy将UserBuffer在不限制大小的情况下直接将用户输入复制进该空间,有缓冲区溢出的隐患。最后使用ExFreePoolWithTag释放申请的池空间。
图片描述

 

我们先将用户缓冲区大小设置为0x1f8来验证一下内存拷贝的过程,使用Windbg在TriggerBufferOverflowNonPagedPool处下断点,执行客户端程序,触发断点:
图片描述
图片描述
可知TriggerBufferOverflowNonPagedPool的地址为959eccce,反汇编找到调用memcpy的代码地址为959ecdc5
图片描述
图片描述
在此处下断,继续运行,触发断点:
图片描述
局部变量KernelBuffer的地址为0x8760f118:
图片描述
我们可以使用命令!pool address查看address周围地址处的池信息:
图片描述
8760f110就是TriggerBufferOverflowNonPagedPool中申请到的池的起始地址,大小为0x200,所以末尾地址为8760f110+200=8760f310,这也是下一个池块的头部所在地址。查看memcpy运行后该地址处的内存:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
赞赏记录
参与人
雪币
留言
时间
than0s
为你点赞~
2023-7-9 21:28
伟叔叔
为你点赞~
2023-3-18 01:52
PLEBFE
为你点赞~
2023-1-12 02:51
zhczf
为你点赞~
2022-7-19 09:18
Ada123
为你点赞~
2022-7-18 20:04
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册