-
-
[原创]Windows内核模糊测试之Random-based fuzzing
-
发表于: 2022-2-28 18:22 10160
-
最初的模糊测试器是基于随机数据来实现的,本文通过https://github.com/Rootkitsmm-zz/Win32k-Fuzzer这个模糊测试器的分析,来展现通过随机数据来实现模糊测试器的一种思路。
链接中的模糊测试器的目标是发现Win32k.sys中的UAF漏洞,该驱动中的漏洞产生的原因往往是因为对申请的对象进行了错误的操作而产生的。而win32对象的申请是通过该驱动的HMAllocObject函数来实现的,该函数申请对象的伪代码如下:
对于DesktopAlloc和SharedAlloc这两个函数,它们是通过RtlAllocateHeap来申请堆内存来保存对象的。
而对于Win32AllocPoolWithTagZInit和Win32AllocPoolWithQuotaTagZInit函数,则是通过ExAllocatePoolWithTag申请池内存来保存对象。
对于使用堆来保存对象的内存,最终是通过RtlFreeHeap来实现堆内存的释放的,该函数定义如下:
其中第三个参数指定了要释放的堆内存的地址,因此可以通过HOOK该函数,在该函数调用前,将要释放的堆内存中的数据改为像0x0C0C0C0C这种非法数据。当这块内存之后再次被申请使用的时候,如果程序没有对这块内存进行合理的处理而产生漏洞的话,就可以被用户捕捉到了。
但是这里有一个问题是,通过该函数并不知道堆内存的大小,因此需要通过未导出函数RtlSizeHeap来获取堆内存的大小,该函数的定义如下:
该模糊测试器的具体实现步骤如下:
通过ZwQuerySystemInformation获取内核模块基址
通过特征码查找RtlSizeHeap函数地址
检查RtlFreeHeap函数起始的字节是否符合要求
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [原创]CVE-2022-21882提权漏洞学习笔记 16402
- [原创]CVE-2021-1732提权漏洞学习笔记 19506
- [原创]CVE-2014-1767提权漏洞学习笔记 15200
- [原创]CVE-2018-8453提权漏洞学习笔记 18538
- [原创]CVE-2020-1054提权漏洞学习笔记 13550