您好,欢迎来到锐游网。
搜索
您的当前位置:首页Windows内存机制

Windows内存机制

来源:锐游网

Windows内存机制

1 基本原理

Cr3寄存器

描述:

PD/PDE(Page Directory Table/Entry 页目录表/项)

描述:

PT/PTE(Page Table/Entry 页表/项)

描述:

页表(PTT)的每一个元素称为页表项(PTE)
页表项(PTE)所指向的才是真正的物理页

PDP (Page Directory Pointer)

PAE中增加了Page Directory Pointer Table这一级:

PAE

2 X特性

PML4

x的分页使用4个级别的表,将物理页面映射到虚拟页面,它们分别是PML4(也就是PXE)、PDPT、PD和PT。

示例-虚拟地址转化为物理地址

首先,我们对其进行分解:

地址结构

我会使用下面的结构来完成这项工作:

typedef
struct VirtualAddressFields
{
    ULONG 
offset : 12;
    ULONG 
pt_index : 9;
    ULONG 
pd_index : 9;
    ULONG
pdpt_index : 9;
    ULONG
pml4_index : 9;
    VirtualAddressFields(ULONG
value)
    {
        *(ULONG
*)this = 0;
        offset
= value & 0xfff;
        pt_index
= (value >> 12) & 0x1ff;
        pd_index
= (value >> 21) & 0x1ff;
        pdpt_index
= (value >> 30) & 0x1ff;
        pml4_index
= (value >> 39) & 0x1ff;
    }
    ULONG
getVA()
    {
        ULONG
res = *(ULONG *)this;
        return
res;
    }
}
VirtualAddressFields;

举例来说:

VirtualAddressFields
ADDR1a = 0x71000000000;
0:
kd> dt ADDR1a
Local
var @ 0x1de4d8 Type VirtualAddressFields
   +0x000
offset     : 0y000000000000 (0)
   +0x000
pt_index   : 0y000000000 (0)
   +0x000
pd_index   : 0y000000000 (0)
   +0x000
pdpt_index : 0y001000000 (0x40)
   +0x000
pml4_index : 0y000001110 (0xe)

针对这个例子(VA:0x71000000000),我们得到了PML4_index = 0x0E,PDPT_index = 0x40,PD_index = 0,PT_index = 0,Offset = 0。

这实际上是一个被称为MMPTE的8字节结构,我们需要从中提取页帧号(Page Frame Number):

最后剩下需要做的,就是把这个PFN(0x3d7d9)乘以页大小(0x1000),再加上page_offset(0x000)。

漏洞

漏洞-自引用

0b 1000 0000 0 — 100 0000 00 — 10 0000 000 — 1 0000 0000 — 0000 0000 0000

  • PML4索引0x100 - PML4的物理地址
  • PDPT索引0x100 - 同样是PML4的物理地址
  • PD索引0x100 - 同样是PML4的物理地址
  • PT索引0x100 - 再次… PML4的物理地址

它最终会返回PML4的内存。

修补

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务