今天,我们来讲一下内核安全!
本文章仅提供学习,切勿将其用于不法手段!
目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。在PWN的二进制领域,免杀技术,一直是后渗透利用阶段的重要安全技术之一。
想要免杀,需要了解的安全技术知识包括软件加壳、代码混淆(例如,使用花指令)、隐匿技术(例如,Rootkit技术)、动态加密等内容。
接上一篇文章,我们来继续讲述下 Rootkit技术 的相关基础知识点内容!
在《 渗透测试之内核安全系列课程:Rootkit技术初探 》之前的文章中,我们讲述了 GDT 全局描述符表、LDT 局部描述符表、GDTR 全局描述符表 寄存器、LDTR 局部描述符表 寄存器 、一致性代码、非一致性代码、实模式、保护模式、线性地址 、PDPT 页目录指针表、PDT 页目录表、PTT 页表、P 页 、PDE 页目录表项 、PTE 页表项 、CR0 控制寄存器、CR2 页故障线性地址寄存器、 CR3 页目录基址寄存器 等非常重要的 基础知识 点 内容 !
这些内容,是学习 Rootkit 技术 的基础 !
今天,我们来继续来重点讲解下 线性地址 到 物理地址 的 转换过程 !
首先,让我们来复习一下,相关的技术知识点。
CR0 控制寄存器,最重要的两个比特位,分别是第 1 位 和 第 32 位 !
CR0控制寄存器的第1位 PE ,控制着 保护模式 的 开启 与 关闭 !当 PE 位 是 1 时,保护模式 处于 开启 状态 ,当 PE 位 是 0 时,保护模式 处于 关闭 状态,此时 计算机 运行于 实模式 !
CR0控制寄存器的第32位 PG ,控制着 内存分页机制 的 开启 与 关闭 !当 PG 位 是 1 时,内存分页机制 处于 开启 状态 ,当 PG 位 是 0 时,内存分页机制 处于 关闭 状态,此时 计算机 运行于 实模式 !
如果需要 启用 内存分页机制,那么 第 1 位 PE 位 和 第 32 位 PG 位 的值,均要为 1 !
CR2 页故障线性地址寄存器,主要用于 在页异常情况发生时,存储 产生异常的 线性地址 !
当发生页异常时(例如,指定的内存分页,并不存在 !这时,会触发 缺页中断 )CPU 会把引起 缺页中断 的 线性地址 保存在 CR2 页故障线性地址寄存器 之中!
操作系统中的页异常处理程序(其实就是 缺页中断 所对应的 中断服务程序)可以通过检查 CR2 页故障线性地址寄存器 的 内容值 的方式,去筛查出 缺页中断 这个异常 是 由 虚拟地址空间(线性地址空间)中的哪个 线性地址访问 所引起的(CR2 页故障线性地址寄存器,主要用于定位错误,以及通过分页交换文件去辅助载入内存分页)!
我们需要知道,针对 缺页中断 ,从 硬盘 中 去载入 相对应的 页表资源 或 页资源,是由 缺页中断 对应的 中断服务程序 去自动完成的 !CR2 页故障线性地址寄存器,在 从 硬盘空间 向 内存空间 载入 指定页表资源 或 指定页资源 时,发挥了非常重要的作用 !
CR3 页目录基址寄存器,主要用于 PDT 页目录表 或 PDPT 页目录指针表 的 物理寻址 !
CR3 页目录基址寄存器,存储了 PDT 页目录表 或 PDPT 页目录指针表 的 物理内存地址 !
在启用了 PAE 物理地址扩展的基础上,CR3 页目录基址寄存器 的 高 27 位,被用于 进行 PDPT 页目录指针表 的 物理地址寻址 !
什么是 PAE 呢?
PAE ,指的是 物理地址扩展 !
物理地址扩展(PAE) 是 中央处理器 CPU 的一项功能,它的作用是:使 x86 系列的处理器 能够在支持 PAE 物理地址扩展 技术 的 部分 Windows 操作系统环境(是否支持 PAE 物理地址扩展,与系统版本有关。例如, Windows 7 (32 位) 、Windows Server 2008 仅 (32 位) 、Windows Vista 仅 (32 位) 、Windows Server 2003 仅 (32 位) 、Windows XP (32 位) )中 访问 4 GB 以上 的 物理内存地址。 能够访问的内存物理地址大小,取决于中央处理器CPU能够支持的最大内存物理地址上限(例如,64位 CPU,所能支持的最大物理内存)!
在未启用 PAE 物理地址扩展机制 之前,32位 线性地址 寻址,线性地址 的 结构 由 高 10 位 的 页目录 表项索引 、中 10 位 的 页表 表项索引、低 12 位 的 页内偏移量 共同组成 !
在已启用 PAE 物理地址扩展机制 之后,32位 线性地址 寻址,线性地址 的 结构 由 高 2 位 的 页目录指针 表项索引 、中高 9 位 的 页目录 表项索引、中 9 位 的 页表 表项索引、低 12 位 的 页内偏移量 共同组成 !
注意,在 启用 PAE 物理地址扩展机制 之后,页目录表 中 每个子项的大小为 8个字节( 64位 )!
注意,在 启用 PAE 物理地址扩展机制 之后,页目录表 中 的 子项数量 最多为 512 个 !
注意,在 启用 PAE 物理地址扩展机制 之后,页表 中 每个子项的大小为 8个字节( 64位 )!
注意,在 启用 PAE 物理地址扩展机制 之后,页表 中 的 子项数量 最多为 512 个 !
在 32位 的 操作系统环境 下,页目录( PDT ) 、 页表( PTT ) 、 页( P ) 的 内存空间大小 均为 4 KB ( 4096 B ,4096 个字节)!
在 32位 的 操作系统环境 下,在未启用 PAE 物理地址扩展机制 之前, 页目录表( PDT )的子项数量为 1024 个,子项大小为 4字节(32位)!
在 32位 的 操作系统环境 下,在未启用 PAE 物理地址扩展机制 之前, 页表( PTT )的子项数量为 1024 个,子项大小为 4字节(32位)!
在 32位 的 操作系统环境 下,在已启用 PAE 物理地址扩展机制 之后, 页目录表( PDT )的子项数量为 512 个,子项大小为 8字节( 64位 )!
在 32位 的 操作系统环境 下,在已启用 PAE 物理地址扩展机制 之后, 页表( PTT )的子项数量为 512 个,子项大小为 8字节( 64位 )!
在 32位 的 操作系统环境 下,在已启用 PAE 物理地址扩展机制 之后, 页目录指针表( PDPT )由 4 个 页目录指针 组成,每个指针 指向 一个 页目录表(PDT)!CR3寄存器 的内容值 定义,会发生一定的变化,CR3寄存器 的内容值 的 低 5 位不再使用,CR3寄存器 的内容值 的 高 27 位 被用于指向 页目录指针表 PDPT 的 基址(页目录指针表 PDPT 的 起始地址)(物理内存地址)!
页目录( PDT ) 、页表( PTT ) 、页( P )的 内存边界 均是以 4 KB 对齐的!也就是说,页目录 、页表 、页 的 内存空间 的 起始地址(物理地址)除了第一个以 0 为起点的 内存空间(0~4095) 之外,其它的内存空间 的 起始地址(物理地址),都是 以4KB的整数倍 为起点的。
让我们再来深入研究一下 页目录(PDT)和 页表(PTT)的 相关知识点内容!
在 32位 的 操作系统环境 下,页目录( PDT ) 和 页表( PTT ) 的子项数量,均为 1024 !每个子项的内存空间大小,均为 4个字节 ( 4096 B ,4096 个字节)!
4 个 字节( BYTE ),等于 32 个 比特位( BIT ) !
页目录( PDT ) 每个子项(PDE) 的 高20位(第13-32位)为 页表空间 的 基址(起始地址)(物理内存地址)!
页目录( PDT ) 每个子项(PDE) 的 第 1 位 P( Present )位 ,用于标记,PDE( 页目标表项 )指向的页面内容( 页表 PTT 或 大页 Large Page )是否存在( 如果不存在,可能会触发 缺页中断,从而 通过 虚拟内存 技术 中的 分页文件交换技术,将存储在 物理硬盘 中的 分页内容 载入到 物理内存 中 )! 。
页目录( PDT ) 每个子项(PDE) 的 第 2 位 R/W( Read/Write ) 位 ,用于标记,PDE( 页目标表项 )指向的页面内容( 页表 PTT 或 大页 Large Page )是否可写( 当 RW 位 的 值 为 0 时,PDE 页目录表项 指向 的 页面 只读 !当 RW 位 的 值 为 1 时,PDE 页目录表项 指向 的 页面 可读、可写 )! 。
页目录( PDT ) 每个子项(PDE) 的 第 3 位 U/S( User/Supervisor )位 ,用与标记,PDE( 页目标表项 )指向的页面内容( 页表 PTT 或 大页 Large Page )是否允许用户态程序( 特权级:R3 )访问(如果 U位 的内容值 为 0 , 则代表着,这个子项 指向 的 页表( 4KB 大小 ) 或 页( 大页,4MB 大小 ) 仅能够 被 操作系统 的 内核程序去进行 访问 和 操作) !
页目录( PDT ) 每个子项(PDE) 的 第 4 位 PWT( Page-level Write-Through ) 位 , 用于控制 页面 的 写入 策略( 当 PWT 位 的 内容值 被 设置为 1 时,它 指示 中央处理器 CPU 对 指定页面 的 写操作 应使用 写穿( Write-Through )策略,而不是 常见的 写回( Write-Back)策略 !写穿( Write-Through )策略 的 实现原理 为,当 中央处理器 CPU 对 缓存在 CPU高速缓存 中的 页面内容 执行 写回操作时,缓存在 CPU高速缓存 中的 页面内容 会被 立即写入到 物理内存 之中 !写回( Write-Back)策略 的 实现原理 为,首先,中央处理器 CPU 会把 缓存在 CPU高速缓存 中的页面内容 进行 “脏”(dirty)标记处理(脏标记(dirty),表示 被缓存在 CPU高速缓存 中的 页面内容 是需要被写回到物理内存中去的)!之后,被缓存在 CPU高速缓存 中的 页面内容 会在合适的时机(如缓存行被替换或系统空闲时),被异步地写回到物理内存中去 )!
页目录( PDT ) 每个子项(PDE) 的 第 5 位 PCD( Page Cache Disable )位 ,用于 控制 对应 页面 的 缓存能力(当 PCD 位 的 内容值 被 设置为 1 时,PDE 页目录表项 指向 的 页面内容( 页表 PTT 或 大页 Large Page )不能 被 CPU 进行 缓存 操作 !当 PCD 位 的 内容值 被 设置为 0 时,PDE 页目录表项 指向 的 页面内容( 页表 PTT 或 大页 Large Page )能够 被 CPU 进行 缓存 操作 )!
页目录( PDT ) 每个子项(PDE) 的 第 6 位 A(Accessed)位 ,用于标记,PDE(页目标表项)指向的页面内容( 页表 PTT 或 大页 Large Page )是否已经被访问过!
页目录( PDT ) 每个子项(PDE) 的 第 7 位 D(Dirty)位 ,用于标记,PDE( 页目录表项 )指向的页面内容( 页表 PTT 或 大页 Large Page )是否已经被修改过!
页目录( PDT ) 每个子项(PDE) 的 第 8 位 PS(Page Size)位 , 用于说明 PDE( 页目录表项 )指向的页面内容( 页表 PTT 或 大页 Large Page )的空间大小( 页表 PTT 的 页面大小 为 4 K B ,大页 Large Page 的 页面大小 为 4 M B ,这涉及到了 页面大小扩展(PSE)技术 ) 。
页目录( PDT ) 每个子项(PDE) 的 第 9 位 G(Global)位 ,用于标记,PDE( 页目录表项 )指向的页面内容( 页表 PTT 或 大页 Large Page )的 可访问属性 是否为 全局性的( 如果 PDE( 页目录表项 )的 G(Global)位的 内容值,被设置为 1,则代表 PDE( 页目录表项 )指向的页面内容( 页表 PTT 或 大页 Large Page )的 页面属性 是全局性的!全局页面,能够被多个进程进行共享访问 !并且,全局页面 的 页面属性 在 进程切换之时 也 不会被刷新 !这种 公有页面,通常是通过 CreateFileMapping 等 系统调用创建与分配 的 ! 如果 PDE( 页目录表项 )的 G(Global)位的 内容值,被设置为 0 ,则代表 PDE( 页目录表项 )指向的页面内容( 页表 PTT 或 大页 Large Page )是 进程私有 的,只有创建这个页面( 页表 PTT 或 大页 Large Page )的进程可以去 访问与操作 它!这种 私有页面,通常是通过 VirtualAlloc 等系统调用进行 创建与分配 的 )!
页目录( PDT ) 每个子项(PDE) 的 第 10-12 位 AVL(Available)位 , 这是一个在较新处理器架构中引入的标志位,主要用于支持 页目录表 的 优化 和 特性( AVL位,通常被用于,指示 页目录表项(PDE)是否可被用于执行某些优化操作!例如,页目录表项 的 合并 或 快速查找!如果 处理器 或 操作系统,检测 到 某个页目录表项 的 AVL位 被设置 为 非 0 值 时,处理器 或 操作系统 可以利用这一信息去执行 更为 高效 的 内存管理操作 !需要注意的是,AVL位 的 具体含义 和 行为 可能由于 不同 的 处理器架构 和 操作系统 而 存在 差异)!
注意,在页目录( PDT )的子项( PDE )中,PS 位(Page Size)位 ,是非常重要的!PS位( 第8位 ),仅在 PDE( 页目录项 ) 中存在,是 PDE( 页目录项 ) 中非常值得一提的比特位!当 PDE( 页目录项 ) 的 PS 位( 第8位 ) 为 0 时,代表,PDE( 页目录项 )指向 页表( 页表大小为 4KB )!,当 PDE( 页目录项 ) 的 PS 位( 第8位 ) 为 1 时,代表PDE( 页目录项 )直接指向页( P ),这时,页的大小为 4MB(这是一个大页),此时,这个大页( 4MB 大小的物理页)的物理地址计算公式为: PDE( 页目录项 ) 的 高 10 位 + 线性地址 的 低 22 位 。
上述的页目录( PDT )的子项(PDE)除了前7位之外,其它各比特位用途不固定(各关键比特位的位置,同样不固定),因操作系统类型、CPU 版本不同而存在差异!
页表( PTT )每个子项(PTE) 的 高20位(第13-32位)为 页空间 的 基址(起始地址)(物理内存地址)!
页表( PTT )每个子项(PTE) 的 第 1 位 P( Present )位 ,用于标记,PTE( 页表项 )指向的页面内容是否存在( 如果不存在,可能会触发 缺页中断,从而 通过 虚拟内存 技术 中的 分页文件交换技术,将存储在 物理硬盘 中的 分页内容 载入到 物理内存 中 )! 。
页表( PTT )每个子项(PTE) 的 第 2 位 R/W( Read/Write ) 位 , 用于标记,PTE( 页表项)指向的页面内容是否可写( 当 RW 位 的 值 为 0 时,PTE 页表项 指向 的 页面 只读 !当 RW 位 的 值 为 1 时,PTE 页表项 指向 的 页面 可读、可写 )! 。
页表( PTT )每个子项(PTE) 的 第 3 位 U/S( User/Supervisor )位 ,用与标记,PTE( 页表项 )指向的页面内容( 页 P )是否允许用户态程序( 特权级:R3 )访问(如果 U位 的内容值 为 0 , 则代表着,这个子项 指向 的 页( 4 K B 大小 ) 仅能够 被 操作系统 的 内核程序去进行 访问 和 操作) !
页表( PTT )每个子项(PTE)(PTE) 的 第 4 位 PWT( Page-level Write-Through ) 位 第 4 位 PWT( Page-level Write-Through ) 位 , 用于控制 页面 的 写入 策略( 当 PWT 位 的 内容值 被 设置为 1 时,它 指示 中央处理器 CPU 对 指定页面 的 写操作 应使用 写穿( Write-Through )策略,而不是 常见的 写回( Write-Back)策略 !写穿( Write-Through )策略 的 实现原理 为,当 中央处理器 CPU 对 缓存在 CPU高速缓存 中的 页面内容 执行 写回操作时,缓存在 CPU高速缓存 中的 页面内容 会被 立即写入到 物理内存 之中 !写回( Write-Back)策略 的 实现原理 为,首先,中央处理器 CPU 会把 缓存在 CPU高速缓存 中的页面内容 进行 “脏”(dirty)标记处理(脏标记(dirty),表示 被缓存在 CPU高速缓存 中的 页面内容 是需要被写回到物理内存中去的)!之后,被缓存在 CPU高速缓存 中的 页面内容 会在合适的时机(如缓存行被替换或系统空闲时),被异步地写回到物理内存中去 )!
页表( PTT )每个子项(PTE) 的 第 5 位 PCD( Page Cache Disable )位 ,用于标记,PTE(页表项)指向的页面内容是否允许被进行页面缓存操作( 当 PCD 位 的 内容值 被 设置为 1 时,PTE 页表项 指向 的 页面内容( 页 P )不能 被 CPU 进行 缓存 操作 !当 PCD 位 的 内容值 被 设置为 0 时,PTE 页表项 指向 的 页面内容( 页 P )能够 被 CPU 进行 缓存 操作 )!
页表( PTT )每个子项 的 第 6 位 A(Accessed)位 ,用于标记,PTE(页表项)指向的页面内容是否已经被访问过!
页表( PTT ) 每个子项(PTE) 的 第 7 位 D(Dirty)位 ,用于标记,PTE(页表项)指向的页面内容是否已经被修改过!
页表( PTT ) 每个子项(PTE) 的 第 8 位 PAT 位(Page Attribute Table),是奔腾3及以后版本的CPU引入的一个页属性表标识位(当 PTE(页表项)的 PAT位 的 内容值 被设置为 1 时,它允许通过一系列专用寄存器(MBR)为每个页面提供更详细的属性设置。这些属性设置可以提供更精细的内存访问控制,包括缓存策略、内存类型等,从而优化系统的性能和响应速度)!
页表( PTT ) 每个子项(PTE) 的 第 9 位 G 位 , 用于标记,PTE( 页表项 )指向的页面内容( 页 P )的 可访问属性 是否为 全局性的( 如果 PTE( 页表项 )的 G(Global)位的 内容值,被设置为 1,则代表 PTE( 页表项 )指向的页面内容( 页 P )的 页面属性 是全局性的!全局页面,能够被多个进程进行共享访问 !并且,全局页面 的 页面属性 在 进程切换之时 也 不会被刷新 !这种 公有页面,通常是通过 CreateFileMapping 等 系统调用创建与分配 的 ! 如果 PTE( 页表项 )的 G(Global)位的 内容值,被设置为 0 ,则代表 PTE( 页表项 )指向的页面内容( 页 P )是 进程私有 的,只有创建这个页面( 页 P )的进程可以去 访问与操作 它 !这种 私有页面,通常是通过 VirtualAlloc 等系统调用进行 创建与分配 的 )!
页表( PTT ) 每个子项(PTE) 的 第 10-12 位 AVL(Available)位 , 这是一个在较新处理器架构中引入的标志位,主要用于支持 页表 的 优化 和 特性( AVL位,通常被用于,指示 页表项(PTE)是否可被用于执行某些优化操作!例如,页表项 的 合并 或 快速查找!如果 处理器 或 操作系统,检测 到 某个页表项 的 AVL位 被设置 为非 0 值 时,处理器 或 操作系统 可以利用这一信息去执行 更为 高效 的 内存管理操作 !需要注意的是,AVL位 的 具体含义 和 行为 可能由于 不同 的 处理器架构 和 操作系统 而 存在 差异)!
上述的页表( PTT )的子项(PTE)除了前7位之外,其它各比特位用途不固定(各关键比特位的位置,同样不固定),因操作系统类型、CPU 版本不同而存在差异!
记住,无论是 页目录( PDT ),还是 页表( PTT ) ,亦或者是 页( P ) ,在一般情况下,它们的 限长(空间大小)均为 4 KB( 4096 B ,4096 字节 )!对于 页( P ),会存在 大页 的情况,当 页( P )的 类型为 大页 时, 页( P )的 空间大小 为 4 M B !
页目录( PDT )、 页表( PTT )、页( P )、页目录项( PDE )、 页表项( PTE )等更详细、更精准的信息,请参见 《 Intel 微处理器 》这本书!《 Intel 微处理器 》是由美国的Barry B.Brey (德幅瑞大学)编著的,由 北京航空航天大学 的 金惠华、艾明晶、尚利宏 等专业人士进行翻译!《 Intel 微处理器 》出版自 机械工业出版社 !《 Intel 微处理器 》这本书出版自 2010 年,虽然十多年过去了,但是,底层的基础知识,底层的技术架构,还是具备非常重要的参考价值的 !
在未来的课程中,我们可能会去研究 数据执行保护( DEP )和 非统一内存访问( NUMA )。
虚拟内存技术 中的 分页交换技术实现,原定于在本章进行讲解,但介于篇幅限制,决定改为 在未来章节中进行有关的内容讲解 !
请关注下一篇,渗透测试之内核安全系列课程:Rootkit技术初探(五)
版权归原作者 黑客影儿 所有, 如有侵权,请联系我们删除。