什么是2-9-9-12分页模式?
前面介绍了10-10-12分页模式,本篇就来介绍一下另一个分页模式:2-9-9-12
分页模式。
首先,我们要先明白一个概念,那就是物理页的大小是确定的,也就是4kb,这个不能随便更改。所以,32位的最后一部分就确定了12位,这个是不能改变的。
那么,在这个前提下,我们要知道,为什么要修改或者说换分页模式?
原因是10-10-12分页的物理地址为4GB,而随着时代的发展4GB的物理地址已经不够用了,因此,为了扩展,所以才会有2-9-9-12的分页模式。
但是可能有人会疑问:32位地址线,不就只能有4GB的物理地址吗?(2的32次方)。这里要说明一下:地址线和物理地址的大小没有任何关系。
而页的大小也确定了,只能是12位,那么如果想要扩大我们的寻址范围,就只能在PTT和PDT上下功夫了。
在前面介绍了。PTT其实也是一个特殊的物理页,他的大小也是4KB,4KB就是4096个字节。因为10-10-12分页模式,PTE是4个字节大小,由于我们的需求是扩大物理页,再加上我们需要考虑对齐的因素,所以,需要时4个倍数,并且比4大,这里就选择8个字节了(其中8字节中只有36位代表执行物理页,因此2的36次方等于64G,这样就扩大了)。4096个字节可以分到512个不同的PTE,而512又是2的9次方,因此PTI=9。那么PTE为8字节了,PDE也需要为8字节,目的就是为了防治PTE有PDE不能指向的地方。因此PDI=9。
32-9-9-12=2。这里还有两个未分配,所以,这就是10-10-12与2-9-9-12分页模式的不同:
2-9-9-12分页模式下,CR3并不是直接指向PDT表,而是指向一张新的表,叫做PDPT表,也叫做页目录指针表。
PDPT表中的每一个成员叫做PDPE(页目录指针表项),每项占8个字节。
PDPT表只有4个成员,因为2位只能满足四种情况。
PDPTE
介绍完2-9-9-12分页模式后,再来介绍一下各个属性,首先我们先来介绍PDPTE的属性:
-
P位:0位,有效位
-
35-12 存储的是页目录表的基址,低12位补0,共36位,即页目录基址。
-
灰色部分:保留位
PDE
-
当PS=1时是大页,35-21位是大页的物理地址,这样36位的物理地址的低21位为0,这就意味着页的大小为2MB,且都是2MB对齐。
-
当PS=0时,35-12位是页表基址,低12位补0,共36位
PTE
-
PTE中35-12是物理页基址,24位,低12位补0
-
物理页基址+12位的页内偏移指向具体数据
XD标志位(AMD中称为NX,即No Excetion)
-
段的属性有可读、可写、可执行
-
页的属性有可读、可写
-
当RET执行返回的时候,如果把堆栈里面的数据指向一段提前准备好的数据·(把数据当做代码来执行,漏洞都是依赖这点,比如SQL注入也是),那么就会产生任意代码执行的后果
-
所以,Intel就在这方面做了硬件保护,设置了一个不可执行位-XD/NX位
-
当XD=1时,软件产生了溢出也没有关系,即使EIP蹦到了危险的“数据区”,也是不可以执行的
-
在PAE分页模式下,PDE与PTE的最高位为XD/NX位.在PAE分页模式下,PDE与PTE的最高位为XD/NX位.
实验
在了解概念之后,我们需要通过动手做,来体验一下,还是一样,通过CE找到字符串地址,然后通过windbg来寻找物理页:
-
hello worldDB的线性地址为:0x000AFBF0
拆分:2-9-9-12,需乘8(8字节)
2:000*8=0
9:00 0000 0000*8=0
9:0 1010 1111af*8=0x578
12:BF0
找到CR3:
找到物理页
原文始发于微信公众号(loochSec):2-9-9-12分页模式
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论