0x00前言
第六部分了 空指针解引用是程序中常见的一类动态内存错误 啊 还是直接开始正文吧
0x01漏洞原理
当指针设置为NULL时 试图通过空指针对数据进行访问 导致程序运行错误 即指针为空却被当作地址去引用时 就会产生漏洞
函数分析
这个函数首先ExAllocatePoolWithTag申请内存 在用完内存后 将内存置为NULL 在漏洞版本下 未检查刚才申请的内存是否为NULL 就直接引用指向内存地址
TriggerNullPointerDereference
1 | NTSTATUS |
0x02漏洞分析
先下断点
1 | bp HEVD!TriggerNullPointerDereference+143 |
断下后发现第二个值还没有被覆盖为shellcode的地址
单步指向后发现已被覆盖
即我们将NullPointerDereference的第二个值(+0x4)控制为shellcode的地址即可 使用NtAllocateVirtualMemory分配0页内存将第二个值(+0x4)控制为shellcode的地址
0x03漏洞利用
分配内存
在common.c中分配0页内存
1 | BOOL MapNullPage() { |
调用
1 | __try { |
利用成功
0x05经验总结
啊这个比上个好理解多了 空指针解引用导致的问题在这个漏洞中也很好利用 在刚开始了解的时候只知道能引发崩溃 不知道如何去利用 后面学习完了之后也就懂了利用的思路了 然后去看了看小刀师傅复现的一个内核漏洞 完全就不一样了哈哈哈
这里传送门