Introduction

​ 由于在研究内核漏洞的时候,在漏洞的利用方式上有时候,时常会用到Physical Address的概念,最先是在研究SMBleeding CVE-2020-0796、CVE-2020-1206(记录文档丢失)的RCE利用的时候接触到这一方式。后续在研究CVE-2018-1038时,再次接触到这一利用方式,有感于这种利用方式的威力,思路的新颖,特此学习记录。

Background

​ Windows 自从Windows Vista以来在安全方面做了很多功课,除了在用户层我们熟知的NX/DEP/ALSR/SafeSEH等缓解措施,Windows 在内核层也做了很多漏洞缓解措施。

NX/DEP

​ 在kernel mode下也区分datacode,通过PROTECTED MODE MEMORY SEGMENTATION实现内存的属性标记。

KALSR

​ 与ALSR类似,在kernel mode下,将Windows 的模块基地址随机化,提高RCE利用难度(需要一个泄漏内核模块地址的信息泄漏漏洞)。而对LPE是没有影响的,因为在Local System下,可以通过NtQuerySystemInfomation获取模块信息。

Integrity Levels

​ 即可信级别,高风险的程序(典型的浏览器)可信级别低,将不被允许执行敏感操作(系统调用),如NtQuerySystemInfomation,以此避免这类程序完成权限提升。

SMEP

​ 全称Supervisor Mode Excution Protect,该保护措施严格区分Kernel SpaceUser Spcae,即不允许以SYSTEM权限运行User Space的代码。

​ 以上种种措施,使得exploit更难实现利用,很多情况下是拥有一定的权限(常见的任意地址写),但是无法转为LPE或者RCE

Windows Pages

unit
1KB = 0x400B
    1MB = 1KB * 0x400
    1GB = 1MB * 0x400
    1TB = 1GB * 0x400
Intel Paging x86

​ 在32bits机器上,cpu需要访问的虚拟内存空间达到4G,为了达到这个目的,采用了PAGE DIRECTORYPAGE TABLE两级寻址机制。

在Window 上CR3寄存器指向当前的PAGE DIRECTORYPhysical Address,每个PAGE DIRECTORY有1024ENTRY(简称PDE),每个PDE指向一个PAGE TABLE的Physical Address。每个PAGE TABLE有1024个ENTRY(简称PTE),每个PTE指向一块4KB物理地址,即将4KB物理地址映射到4KB的虚拟地址。

​ 一个虚拟地址即可以用下面的方式映射到物理地址(也可以反过来由物理地址得到虚拟地址)

​ 每个ENTRY都是4bytes,其中低位用于标记相应地址的属性。

​ 其中,PDE在一种特殊情况下可以不指向1024个PAGE TABLE,而是指向1个Large Page(拥有4MB大小),即将PS(Page size)标记。

​ 需要注意到的是,Windows上的每个进程都拥有4GB的虚拟内存,而且互相之间不可以访问,这种实现方式必然要求每个进程的指向Page Directory的Physical Address不同!

PAE

​ 即Physical Address Extension,引入了更高的一层寻址机制Page Directory Pointer Table(PDPT)。将物理地址的表示方式由32bits增加到了36bits,也就意味着此时的寻址空间达到了64GB。

​ PDPT中保存着Page Directory的Entry(简称PDPTE),每个Entry指向一个Page Directory,表示1GB大小,因为此时每个entry表示需要8bytes,所以每个Table只有512个Entry,也就是512 PDE * 512 PTE * 4KB

​ 此外PAE引入了NX bit,用于完成data和code的区分。

Intel Paging x64

​ 在64bits 系统中,此时CPU可访问的物理地址有48bits,而虚拟地址达到了64bits。明显是不足的。这时提出了一个概念CANONICAL ADDRESS,提出真实的虚拟地址空间也只有48bits,不过虚拟内存做了一个区分,即我们熟知的两部分:0 - 0x7FFF FFFF FFFF0xFFFF 8000 0000 0000 - 0xFFFF FFFF FFFF FFFF

​ 为了满足48bits寻址需求,在PAE基础上引入了四级页表寻址的概念:PML4、PDPT、PAGE DIRECTORY、PAGE TABLE.

​ 此时的寻址计算式512PML4Es * 512PDPTEs * 512PDEs * 512PTEs * 4KB = 256TB

Problems

​ 到目前为止,Windows Page机制基本介绍完了,但是这里有个问题,上面都是在介绍Windows物理地址如何映射到整个虚拟地址空间,但是为了管理虚拟地址,Windows有必要完成逆过程,即 将任意一个虚拟地址定位到某一物理地址。这一过程会存在一些问题。

1、应用程序需要分配一块虚拟地址 VirtualAlloc  得到 0x402000
点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖