渗透测试之内核安全系列课程:Rootkit技术初探(四)

作者 : admin 本文共7750个字,预计阅读时间需要20分钟 发布时间: 2024-06-10 共1人阅读

今天,我们来讲一下内核安全

本文章仅提供学习,切勿将其用于不法手段!

目前,在渗透测试领域,主要分为了两个发展方向,分别为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)位 的 内容值被设置为则代表 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( 页表项 )指向的页面内容( 页 )的 可访问属性 是否为 全局性的( 如果 PTE( 页表项 )的 G(Global)位 的 内容值被设置为 1则代表 PTE( 页表项 )指向的页面内容( 页 )的 页面属性全局性的!全局页面,能够被多个进程进行共享访问 !并且,全局页面页面属性进程切换之时 不会被刷新这种 公有页面,通常是通过 CreateFileMapping 系统调用 创建与分配 的 ! 如果 PTE( 页表项 )的 G(Global)位 的 内容值被设置为则代表 PTE( 页表项 )指向的页面内容( 页 )是 进程私有 的,只有创建这个页面( 页 )的进程可以去 访问操作 它 !这种 私有页面,通常是通过 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技术初探(五)

本站无任何商业行为
个人在线分享 » 渗透测试之内核安全系列课程:Rootkit技术初探(四)
E-->