【软件安全】PAE下虚拟地址到物理地址的转换
欢迎大家到我的个人主页点击打开链接,一起交流、学习,一起进步~
之前文章讲到利用windbg查询文件的PTE和PDE,现尝试手动实现虚拟地址转换到物理地址。
使用ollydbg打开我们的hello world,查看字符串所在位置:
打开windbg进入内核调试状态,进入该进程,查看该虚拟地址对应的字符串,使用命令!vtop查看该虚拟地址对应的物理地址:
这里发现一个奇怪的东西:PAE是什么?
http://blog.****.net/q1007729991/article/details/52829235该博文中有对PAE更为详细的讲解,简单来讲就是将32位的线性地址空间映射到52位的物理地址空间。
三段式分页是将线性地址拆分成了 10-10-12 的形式,而 PAE 分页将线性地址拆分成了 2-9-9-12 的四段式,即 3 段索引加偏移,其中的两个 9 分别是页目录表索引和页表索引。
2-9-9-12 分页方式转换方式:
- 根据 CR3 找到 Page Directory Pointer Table
- 根据一级索引在 Page Directory Pointer Table 中查询到 Page Directory
- 根据二级索引在 Page Directory 中查询到 Page Table
- 根据三级索引在 Page Table 中查询到普通 4KB 物理页
- 在物理页中查找第四段偏移。
三段式分页中的 PDE 和 PTE 都是 4 字节,无论是 PDT 还是 PTT 都有1024个表项。而PAE分页中,PDPT只有 4 个表项,PDT 和 PTT 有 512 个表项,PDPTE、PDE、PTE 的大小是 8 字节。PDPT 表一共占用 32 字节,PDT 、PTT 表仍然占用 4KB 的物理页。PAE 分页多了一个 PDPT 表,也就是顶级目录表,它主要用来查找页目录的基址。
于是我们将”hello world”所在的虚拟地址分成2-9-9-12的形式:
00 000000010 000000100 000000000000
0 2 4 0
(这次实验已经过去快一个月了,但是就是想找到这个hello world,时隔一个月后再看,当时花费很大的功夫查找资料,但是尝试的都是三段式分页,这次通过结果找方法,终于发现了一些不太一样的东西,还是要继续加油啊~)