线程不断产生页面错误

问题描述

所以我最近试图利用内核模式驱动程序 (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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...