X64汇编语言教程(白帽黑客系列课程)(八)

为什么要写这篇教程呢?

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

因为想要成为一名白帽黑客,汇编语言是必须要掌握的!

无论是二进制漏洞挖掘,还是逆向工程!汇编语言,都是硬性基础之一!当然,你还需要学会C语言!为什么要学会C语言呢?IDA软件 会将 二进制代码 翻译成 汇编语言 和 C语言 !

你不会汇编语言,不会C语言,想要进行逆向工程,以及更深层次的 二进制漏洞挖掘,是非常困难!如果你希望挖掘 二进制漏洞 ,你还要学会 代码审计 !

你必须看得懂,汇编语言代码 和 C语言代码,这是硬性要求!

想要参加CTF竞赛,汇编语言 和 C语言 都是重要的底层基础知识。

接下来,让我们接上一篇内容,继续讲解下 x86-64环境下的分页机制!

为什么要重点讲解x86-64环境下的分页机制呢?

WINDOWS 和 LINUX 的内存管理,都是基于x86-64架构环境下的分页机制去进行的!

分页机制,是实现保护模式下软件程序的重要技术保障!

我们主要讲解下,分页机制的4级页表的相关知识!

分页机制仅在保护模式(CR0.PE = 1)下有效!

是否开启保护模式,是 由 CR0寄存器的 PE 位(第0位)决定的!

在保护模式下,是否开启内存分页机制,是 由 CR0寄存器的 PG 位(第31位)决定的!

CR0寄存器,是什么呢?

‌CR0寄存器,是x86-64架构下的一个控制寄存器!

‌CR0寄存器,主要用于控制和配置处理器的操作模式和特性‌!

除了CR0寄存器,还有一个非常重要的寄存器,你需要知道,那就是,CR3寄存器!

CR3寄存器,又被称为“页目录基址寄存器“,如果想从虚拟地址转换为物理地址,CR3寄存器扮演着重要的角色!

当CPU(中央处理器)需要访问虚拟内存地址时,CPU(中央处理器)会首先去获取CR3寄存器中存储的页目录基地址!然后,根据这个 页目录基址 去找到对应的页表!之后,再通过页表找到具体的物理页帧地址!这样,就完成了虚拟地址到物理地址的转换过程。

我们需要注意与牢记的是,CR3寄存器中,存储的是物理地址!而不是虚拟地址(线性地址)!

重要的事情说三遍,CR3寄存器中,存储的是物理地址!CR3寄存器中,存储的是物理地址!CR3寄存器中,存储的是物理地址!

CR3寄存器中,存储的是当前进程的页目录基址!

如果切换进程,CR3寄存器的内容,会发生改变,从而切换为新进程的页目录基址!

进程切换,虚拟内存机制发挥的作用,功不可没!借助于虚拟内存的机制,使用相关控制寄存器,如 CR0、CR3、CR2寄存器等,即可完成进程切换工作!

这里,我们新提到了CR2寄存器,它同样是一个非常重要的控制寄存器!

CR2寄存器,用于保存最后一次出现页故障时的虚拟地址(线性地址)! 

当CPU(中央处理器)试图去访问一个未被映射到物理内存的虚拟地址(线性地址)时,就会发生页错误!这个时候,CR2寄存器会记录下引发页面访问错误的虚拟地址(线性地址)。

CR2寄存器,使得操作系统能够定位页错误,并对页错误进行处理!

举个例子,当CPU(中央处理器)想要去访问一个未被映射到物理内存的虚拟地址(线性地址)时,会引发页错误!此时,CPU(中央处理器)会将引发错误的虚拟地址(线性地址)保存到CR2寄存器中,并通知操作系统。操作系统随后会捕获这个页错误,并根据CR2寄存器中保存的虚拟地址(线性地址),找到对应的页面并将其从硬盘加载到内存中,从而恢复程序的执行‌!

需要注意,对于CR0、CR3、CR2等控制寄存器内容的更改,一般是需要在特权级别(如Ring0)模式环境下去进行的!想要操作 控制寄存器 ,你必须拥有足够的权限!

分页机制的四级页表通常包括以下几个级别(注意,页表是一种数据结构):

  1. 页目录表‌(Page Directory Table):这是最高级别的页表,它包含了指向下一级页表的指针或页表项的基地址。
  2. 页中间目录表‌(Page Middle Directory Table):这是第二级别的页表,它同样包含了指向下一级页表的指针或页表项的基地址。
  3. 页表‌(Page Table):这是第三级别的页表,它直接包含了逻辑页号到物理页框号的映射关系。每个页表项都对应一个物理页框。
  4. (可选的)页内偏移表‌:在某些实现中,可能还存在更低级别的页表,用于进一步细分页面内的地址映射。但在4级页表的常规实现中,通常不包括这一级。

通过采用4级页表,操作系统可以更有效地管理内存,提高地址映射的效率,并减少页表占用的内存空间。同时,这种分级的方式也使得页表的扩展和修改更加灵活和方便‌。

以下是页目录表内容的详解:

  1. 页目录表的作用‌:

    • 页目录表是分级页表结构中的一级,它包含了指向下一级的页中间目录表的条目。
    • 通过页目录表,可以有效地将虚拟地址转换为物理地址,并在需要时将相应的页面从硬盘上加载到物理内存之中。
  2. 页目录表的结构‌:

    • 在x86-64架构中,页目录表通常是一个页大小的内存区域,包含512个8字节的页表条目(Page Table Entry,PTE)‌。
    • 每个页表条目都记录了下一级页中间目录表的信息‌。
  3. 页目录表的索引‌:

    • 虚拟地址中的特定部分用于索引页目录表。在四级分页结构中,虚拟地址的高位部分(通常是前9位)用于索引页目录表‌。
    • 通过索引,系统可以找到对应的页表条目,进而获取下一级页表的地址或物理页面的地址‌。
  4. 页目录表与页表的关系‌:

    • 页目录表是页表结构中的一级,它指向下一级的页中间目录表。在四级分页模型中,页目录表之后是页中间目录(Page Middle Directory),再之后是页表(Page Table)‌。
    • 每级页表都负责将虚拟地址的一部分映射到物理地址的一部分,通过多级映射,最终实现完整的虚拟地址到物理地址的转换‌3。
  5. 页目录表的更新与管理‌:

    • 随着虚拟页面的进出物理内存,页目录表的内容也会不断更新变化‌。
    • 操作系统负责维护页目录表及其下各级页表的内容,确保虚拟地址到物理地址的正确映射‌。

(未完待续)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值