14

[求助]内核页表随机化的计算公式

 3 years ago
source link: https://bbs.pediy.com/thread-267982.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
[求助]内核页表随机化的计算公式-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com
2021-6-6 22:41 2124

看了 hzqst 大表哥的文章 [原创]逆向TesSafe.sys有感:鹅厂是如何定位随机化的PTE_BASE,得到4个基址的计算公式分别为:

pte_base = (index << 39) | FFFF000000000000;
pde_base = (index << 30) | pte_base;
ppe_base = (index << 21) | pde_base;
pxe_base = (index << 12) | ppe_base;

实际测试后也确实是这样,想知道上面的公式是通过简单的找规律逆运算出来的,还是说微软对这些地址的排布有一定的讲究?希望大家能解答一下我的问题,谢谢。

[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年秋季班火热招生!!

最新回复 (13)
lytywg 活跃值 2021-6-7 04:08
2 楼
就是PTE正好需要512G才能映射完,各级页表依次在PTE后面,因为这样写比较方便所以微软就这样写了,没别的理由
dearfuture 活跃值 2021-6-7 09:32
3 楼
index是自映射项的下标,一旦index确定了,页表基址就确定了。也可以反过来说,一旦页表基址确定了,index就确定了。
这种一一对应的关系是由windows的页表顺序连续映射方案决定的。PTE_BASE一定映射虚拟地址0,PTE_BASE[1]一定映射虚拟地址1...以此类推,接下来一定有一个PTE_BASE[index]映射PTE_BASE,这个index就是自映射项的下标,而且PTE_BASE[index][index]映射PTE_BASE[index](也就是PDE_BASE)...用简单的数学知识推一下就能得出这些公式了
烟花易冷丶 活跃值 2021-6-7 14:17
4 楼

847490_VT6ZPZCDTAS4RSF.jpg847490_CHTJYPZC5VPT7FE.jpg

847490_92KDC8G7EKCR7RS.jpg

847490_W8UJQJFMFSNXWT6.jpg

847490_V8YP74XAMAWJ75Q.jpg

最后于 2021-6-7 14:22 被烟花易冷丶编辑 ,原因:
烟花易冷丶 活跃值 2021-6-7 14:23
5 楼
不太会看雪的编辑方式..总会存在大量空白,勉强看吧
小白iii 活跃值 2021-6-9 07:23
6 楼

不太会看雪的编辑方式..总会存在大量空白,勉强看吧

请问 PTE 只有一个固定值,PMDL4 有 4 个固定值应该怎么理解呢
小白iii 活跃值 2021-6-9 07:24
7 楼

就是PTE正好需要512G才能映射完,各级页表依次在PTE后面,因为这样写比较方便所以微软就这样写了,没别的理由

可能是我钻牛角尖了,这边思路没缕过来。
coneco 活跃值 2 2021-6-10 21:44
8 楼
你先计算出Win10 1607以前,0x1ED这个index是怎么得来的,(自己用windbg本地内核调试算一下),然后观察规律。最后观察Win10 1607之后的index的变化。
你提到的公式的左移操作数(39,30,21,12)都相差9,这个你观察Win10 1607以前的index能知道原因。
coneco 活跃值 2 2021-6-10 21:46
9 楼
给你看一下win8.1下这个0x1ED代表什么意思:
已知当前进程的CR3为35d02000,
kd> !dq 35d02000+1ed*8 l1
#35d02f68 80000000`35d02863
注意,这里的PFN仍然是35d02
lytywg 活跃值 2021-6-12 16:03
10 楼

可能是我钻牛角尖了,这边思路没缕过来。

我之前没说全,整理下思路吧
1. 让PTE_BASE按照512GB对齐实现自映射,所以微软设计成PTE_BASE就是某一项PML4E,这一项的索引记为index,为什么微软要这样设计呢,很简单就是这样的写法比较好,其它实现也有,但是没这种好。

2. 页表是自映射的,你把PML4T的物理地址放在某一个PML4E里面,寻到页表底的时候,PFN指向的是PT, 表现在虚拟地址上不就是PTE_BASE吗

3.假设把PML4T的物理地址放在某一个PDPTE里面,寻到表底指向的是PDT,也就是PDE_BASE,但此时不需要放专门往某个PDPTE写入PML4T物理地址了,只是解释下连续映射各级BASE的原理,接下来就是自映射的性质了,当你读PTE_BASE+(index << 30)时,此时读到的虚拟地址对应的是的内容是PDPT的index项, 因为该PDPT的物理地址就是PML4T,PML4T的index项的PFN又写成PML4T的物理地址>>12, 产生了套娃(所谓的自映射),所以该PDPE项的PFN是PML4T的物理地址 >> 12,寻到表底PFN指向的是PDT,所以那个地方就是PDE_BASE

4. PPE_BASE及PXE_BASE依此类推

5.所以index就是通过对比PML4T的物理地址和某一项PML4E指向的物理地址来确定

最后于 2021-6-12 16:21 被lytywg编辑 ,原因:
fengyunabc 活跃值 1 2021-6-12 21:15
11 楼
评论很精彩,感谢分享!
小白iii 活跃值 2021-6-12 22:44
12 楼

小白iii

可能是我钻牛角尖了,这边思路没缕过来。 我之前没说全,整理下思路吧1. 让PTE_BASE按照512GB对齐实现自 ...

二级页表自映射刚完全搞懂,现在换成4级以后,又有点乱了。40.gif
lhxdiao 活跃值 2021-6-12 23:07
13 楼
基址可以通过index计算出来,反之亦可,这种是通过Windows特征码判断是否可用的,可能以后Windows 10更新就把这个特性又改了
小白iii 活跃值 2021-6-13 00:58
14 楼

对于二级页表,我自己的推断是这样的,感觉逻辑是行得通的,四级页表的推算卡住了一步,再想不通我就准备先放着了:

PDT 是页目录表,保存了 1024 个 PDE,指向 1024 个 页表。

PT 是页表,保存了 1024 个 PTE,每一项索引一个页面,一个页表管理 4MB 的页面。

CR3 指向页目录表,其中 PDT[0] 指向第一个 PT,PDT [0] [0] 指向第一个 PTE

由于 PDT 本身占用 4KB,所以在 4MB 个 PTE 中,肯定存在一个 PTE 指向 PDT 基址。

假设 PTE_BASE 为 0xXXXXXXXX,则可以计算出他的 index 和 PDI 分别为  

由于PTE_BASE 一定对齐到了 4MB,所以找到页目录中的第一项就是 PTE_BASE

假设基址是 D0000000,其对应的 index 为 D0000000 / 4kb = D 0000,对应的 PDI 为 832

又因为 PTE_BASE 是 PTE基址,所以要求 C0000000 能够直接找到 PDT[0],即页目录表基址 ,为了满足这一条件,要求 PDT[index] 刚好可以获取到 PDT 的地址,二次寻址找到的就是 PDT[0]

除了存在 PTE_BASE[index] == PTE_BASE 外,由于 PDE_BASE 也使用了一个分页,所以也会存在页表中,即 PTE_BASE[index2] == PDE_BASE。前面已经推算出,PDT[index] 就是当前的页目录,所以可以通过 PDI 先找到 PDT,再通过 PDI 就能找到页目录的基址了。

最后于 2021-6-13 01:00 被小白iii编辑 ,原因:
游客
登录 | 注册 方可回帖
返回
看雪学院公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
202102181528_T2EW2V72YVBNZ6M.jpg
202106021700_6USJKVVBYH2GA6A.jpg
©2000-2021 看雪学院 | Based on Xiuno BBS
域名:加速乐 | SSL证书:亚洲诚信 | 安全网易易盾| 同盾反欺诈
看雪APP | 公众号:ikanxue | 关于我们 | 联系我们 | 企业服务
Processed: 0.059s, SQL: 46 / 京ICP备10040895号-17

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK