描述:
描述:
描述:
页表(PTT)的每一个元素称为页表项(PTE)
页表项(PTE)所指向的才是真正的物理页
PAE中增加了Page Directory Pointer Table这一级:
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的内存。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务