微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

线程不断产生页面错误

如何解决线程不断产生页面错误

所以我最近试图利用内核模式驱动程序 (HEVD),但遇到了一个对我来说没有意义的问题。 在我跳转到我的 shellcode(它位于用户模式并由 VirtualProtect 执行)之后,线程不断生成页面错误。然后线程不断地在无限循环中产生这个页面错误(它不会抛出异常)。

所以我调查了触发了什么样的页面错误,我得到了页面错误处理程序的以下输出

Breakpoint 0 hit
nt!KiPageFault+0x8:
fffff806`7d201d08 488dac2480000000 lea     rbp,[rsp+80h]
0: kd> dd %rsp + 0x158
ffff9307`717e9768  51dce820 ffffad82 00000011 00000000
ffff9307`717e9778  ee49cf8e 000001a4 00000010 00000000
ffff9307`717e9788  00010206 00000000 717e97a0 ffff9307
ffff9307`717e9798  00000018 00000000 00000003 00000000
ffff9307`717e97a8  c00000bb 00000000 0000004d 00000000
ffff9307`717e97b8  00000018 00000000 00000003 00000000
ffff9307`717e97c8  7a0e643b fffff806 00000000 00000000
ffff9307`717e97d8  55555555 55555555 7a0e8b10 fffff806

这里我们看到了页面错误发生后的堆栈。在我恢复执行后立即触发断点(是的,断点仅对这个线程有条件)。每次触发断点时,帧都完全相同。 所以我试图解码堆栈帧。页面错误将一些信息推送到堆栈上。我手动解码了它(我不知道更好的方法来做到这一点),我得到了以下内容

RFLAGS  10206
CS      10
RIP     000001a4ee49cf8e
Errcode 11 --> P,I bits set
CR2     000001a4ee49cf8e

这应该是正确解码的(也许是错误的。栈顶是 ffff9307`717e9770,所以 0x...11 是最后压入栈的东西)。因此,错误代码表示该异常是在页面存在时以及在指令提取期间引发的。

现在:我认为这应该意味着由于 NX 位的访问冲突。但这不可能是因为地址是可执行的,如以下代码段所示:

                                           VA 000001a4ee49cf8e
PXE at FFFFA8D46A351018    PPE at FFFFA8D46A203498    PDE at FFFFA8D440693B90    PTE at 
FFFFA880D27724E0
contains 8A00000027704867  contains 0A0000010DA05867  contains 0A0000010F9BE867  contains 
0100000119B6C825
pfn 27704     ---DA--UW-V  pfn 10da05    ---DA--UWEV  pfn 10f9be    ---DA--UWEV  pfn 119b6c    ----A-
UREV

为 pte 设置了可执行位。所以我问自己为什么会发生这种情况。它也没有引发访问冲突并创建错误检查,这也有点奇怪。

操作系统也在 virtualBox 上运行。我查看了设置,发现我的虚拟机不支持 SMEP 和 SMAP(但我的主机系统不支持。VirtualBox 捕获 cpuid-Instructions 并假装此功能已禁用)。所以这也不应该是问题。此外,如果您转储寄存器,则不会设置 CR4 中的 SMEP/SMAP 位。

我真的不知道这个问题的原因是什么。可能是虚拟机的原因。也可能是因为当线程运行 userocde 或其他东西时,Windows 会感到困惑。我真的想了很久,但也许我只是忽略了一个简单的原因。

提前致谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。