0x00前言
第七篇了 讲任意内存覆盖 对于本节还是容易理解的
0x01漏洞原理
基本概念是覆盖内核调度表中的指针 将其指向shellcode的地址
函数分析
这个函数申请完内存后 在漏洞版本下 未检查what和where指针 而是直接引用 所以我们如果控制了what指针地址的值指向shellcode就可以完成利用
TriggerArbitraryWrite
1 | NTSTATUS |
0x02漏洞分析
先下断点偏移计算就用之前的方法就可
1 | bp HEVD!TriggerArbitraryWrite+71 |
查看what的值 发现并不是shellcode的地址 而是跳转表
下个断点 单步运行几次 发现到了shellcode的地址
what和where指针在WRITE_WHAT_WHERE结构体中 前四个字节是what 后四个是where 啊对于IO控制码的问题 还是跟之前一样 在IDA中查看即可
1 | typedef struct _WRITE_WHAT_WHERE { |
1 | #include<stdio.h> |
我们需要将where指针覆盖到一个安全的地址 先查看NtQueryIntervalProfile+0x62 然后查看KeQueryIntervalProfile 覆盖指针数组的即可 这个函数在内核中用的很少 所以可以覆盖
0x03漏洞利用
获取ntkrnlpa.exe基址
1 |
|
get HalDispatchTable地址
1 | // This is still in user mode |
调用
1 | WriteWhatWhere = (PWRITE_WHAT_WHERE)HeapAlloc(GetProcessHeap(), |
调用NtQueryIntervalProfile
1 | NtQueryIntervalProfile = (NtQueryIntervalProfile_t)GetProcAddress(hNtDll, "NtQueryIntervalProfile"); |
成功!
0x04补丁分析
安全版本中 检查了where和what指针 通过验证可进行指针的操作
0x05经验总结
这次的分析过程中碰到了点小困难 最后也算是解决了 中途去看了wjllz师傅的文章 了解到很多 边学习边复现 这个涉及的蛮多的 也不算是简单吧 还有就是对于shellcode的跳转为什么不是直接跳转呢 而是进入跳转表跳转 得再分析分析