虚拟系统空间如何防止访问?

时间:2018-11-15 15:21:19

标签: windows security kernel

Microsoft Docs上,我读到:

  

在64位Windows中,虚拟地址空间的理论量为2 ^ 64字节(16艾字节),但实际上仅使用了16艾字节范围的一小部分。从0x000'00000000到0x7FF'FFFFFFFF的8 TB范围用于用户空间,从0xFFFF0800'00000000到0xFFFFFFFF'FFFFFFFF的248 TB范围的部分用于系统空间。

由于我有64位指针,所以我可以构造一个指向0xFFFFxxxxxxxxxxxx地址的指针。

网站继续:

  

在用户模式下运行的代码可以访问用户空间,但不能访问系统空间。

如果我能够猜测系统虚拟地址空间中的有效地址,那么有什么机制阻止我在其中进行写操作?

我对memory protection有所了解,但这似乎并没有提供区分用户内存和系统内存的功能。

1 个答案:

答案 0 :(得分:0)

根据@RbMm的注释,此信息存储在PTE(页表项)中。似乎有一点定义了是否从用户模式授予访问权限。

an article on OSR online证实了这一点,该消息说

  

位名称:用户访问权限

该结构本身似乎不是Microsoft符号的一部分

first

CPU(特别是MMU,内存管理单元)紧密支持PTE。这就是为什么我们找到其他信息at OSDev,它表示

  U,“用户/主管”位,根据特权级别控制对页面的访问。如果该位置1,则所有人都可以访问该页面。如果未设置该位,则只有主管可以访问它。

在某些leaked SDK files中,该位似乎是

  

0:000> dt ntdll!_page* ntdll!_PAGED_LOOKASIDE_LIST ntdll!_PAGEFAULT_HISTORY 0:000> dt ntdll!page* 0:000> dt ntdll!*pte* 00007fff324fe910 ntdll!RtlpTestHookInitialize

由于CPU支持PTE,因此我们应该在Linux中找到类似的东西。瞧,我看到this SO answer也有一点:

  

unsigned __int64 Owner : 1;

与OSDev的信息完全匹配。