x64保护模式_IA-32e

news/2024/10/20 11:34:56/

IA-32e

内核x64位,内核是64位的,用户可以是64也可以是32位。但是内核一定是64位的。

强制平坦段,段基址必须是0不支持TSS段切换了。把32位硬件不用的给删了。

MSR寄存器

这是x64独有的。

MSR寄存器c0000080如果位8=1,说明现在是IA-32e模式

Legacy

兼容模式,内核是32位的,用户是32位的。

也就是相当于32系统装载x64的硬件上面。完全把他当成32位用就行。

支持非平坦段,任务切换啥的一系列x86硬件模式。

注意,模式是不能随意切换的。

x64与x86的gdt表区别

IA-32e段描述符非常少了,优化了。x64对于段保护弱化。

代码段、数据段gdt

代码段,数据段仍使用64位的段描述符。

比如这就是一个IA-32e CS段描述符,Ds和这个是一样的。为什么没有基质了呢?强制平台,64位基质可以不写。

主要还剩下的就算DPL,代码段还是数据段。位21 L位表示了你是处在IA-32e还是Legacy模式。

Windbg使用dg +gdt表偏移,可以解析gdt表。

我们也可以在gdt表里面发现有界限的段,也就是L=0的,这种是给32位用的。

pl==3/0代表是内核还是用户,Type=Code,Long=Nl或者是Lo代表是不是x64的段

因此我们判断到底是不是64位程序,看cs段就行,cs==23,说明是32位,因为用的32位的。

cs=33,64位的。

Tss段描述符

Tss扩展到128位,因为这个不能强制平坦了。64位基质必须保存。

Tss是有用的,是需要保存权限切换时候的东西的。

windbg识别出来了,他是TSS,但是基质是错误的。需要加上后面的高32位。

也就是fffff80132c97000,这才是TSS段基质。

Tss段描述符

Tss段指向的内存:

现在TSS段寄存器保存的都是IST指针。当然,还是有RSP0 这种0环栈的

IST指针是什么呢?是中断,切换栈,默认可能是当前线程的RSP0,IST是指定中断的时候用哪个零环栈。

IDT描述符

IDT得提供中断地址,所以64位基质也得扩展。

基质就低64位 低16+高16+高64位低32==64位基质==中断门中断处理程序

==fffff80130208000

没问题,0号中断就算除0异常。

这个IST就是一个索引,代表我去TSS存的IST指针的哪个地方找栈。也就是低64高32位最后8位

我们可以看到大部分都是用的0,就算默认当前线程的RSP0,不是0就是索引。

windbg输入!idt命令我们可以看到对应的中断门都是什么异常。

fs/gs段寄存器

fs,gs段是不能够强制平坦的,为什么?因为里面存的是KPCR,64位地址。

但是fs,gs又只能装载数据段或者代码段。那该怎么办呢?

依旧是使用MSR寄存器补充基质

分别在MSR寄存器的

C00000100H==FS_BASE C000010H=GS_BASE

C0000102H=KERNEL_GS_BASE

c0000102H是什么?

x86中我们知道,切换到KPCR是靠切换fs来达到的。但是在x64中,我们只需要该基质就行了

swapgs指令,就可以来切换GS_BASE和KERNEL_GS_BASE。

零环,GS_BASE就是内核的基质,KERNEL_GS_BASE就算用户TEB的基质

三环,则反过来。

权限切换

x64下进0环和x86基本一致。

系统调用和中断。

x64进0环是通过syscall进入的内核,而不是sysenter。

系统调用就是syscall 然后根据SST找SSDT,根据rax索引找到地址。

x64兼容32位程序

也是通过jmp far 33:xxxx跳转到64位的代码段。然后开始执行。

我们看看这一段硬编码在x64汇编怎么解释

这个r15是一个结构 0xf8是偏移

r15默认就算KUSER_SHARED_DATA.偏移是什么暂时未知。

r15是创建进程的时候(当时还是x64环境)就已经设置过值了,从此便没在用过。

除此之外,r14 r13也是如此。都是在x64初始化的时候赋值好了。

我们可以用内核调试器记录这个地址来调试

步骤:就算attch 进程 .process /i EPROCESS 然后调试 加/i会自动中断到当前进程的环境上

附加后 我们可以看到如下内容

单步跟,就能跟到syscall。

这也说明了32位程序用的系统调用都是64位的。

x96

指里面既有64位代码的32位的程序

也有x96dbg。

我们可以在32位的程序中写入shellcode,从而达到64位的效果。

x86支持内联汇编,可以用__emit xx 一字节shellcode更方便。

x64返回的时候

tword是是个字节 前八个字节指跳转的地址, 后面两个字节是段选择子.

这样返回即可。

补充:

为什么不用陷阱门?

陷阱门不屏蔽中断,容易设置KPCR时出错。线程切换出问题。


http://www.ppmy.cn/news/892702.html

相关文章

【操作系统】X86架构的64位操作系统探索

背景 8086 系列芯片的成功带领英特尔 IA-32 指令集架构占据芯片市场的主导地位。20 世纪末,英特尔与惠普一同针对 64 位芯片展开研究,并推出 IA-64 指令集架构。然而,该架构与已经流行的 IA-32 架构不兼容,这导致它的发展受到阻碍…

启明云端分享|乐鑫ESP32-WROOM-32E和ESP32-WROOM-32UE两款模组的区别

提示:ESP32-WROOM-32E 和 ESP32-WROOM-32UE 是两款通用型 Wi-FiBTBLE MCU 模组,功能强大,用途广 泛,可以用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和 MP3 解码等。 这两款模组在应用中,有…

import错误:undefined symbol: _ZN6caffe26detail37_typeMetaDataInstance_preallocated_32E

在使用DCN_V2时遇到了这个错误, 发现还是这个包没装好得原因,所以解决办法就是,cd进入这个包的文件夹 然后依次操作这两句 cd /root/data/snake-master/lib/csrc/extreme_utils rm -r build python setup.py develop 问题解决!…

情感分析之情绪原因识别

一. 情绪原因识别概述 1.1 什么是情绪原因识别 大部分针对情绪分析的研究主要集中在情绪识别和情绪分类方面,只关注情绪的类别,属于比较浅层的情绪分析任务。情绪原因识别是近年来出现的深层次文本分析与理解的研究,它能针对文本中出现的情…

ESP32学习笔记(一) 芯片型号介绍

ESP32学习笔记(一) 芯片型号介绍 目录: ESP32学习笔记(一) 芯片型号介绍 ESP32学习笔记(二) 开发环境搭建 VSCodeplatformio ESP32学习笔记(三) 硬件资源介绍 ESP32学习笔记(四) 串口通信 ESP32学习笔记(五) 外部中断 ESP32学习笔记(六) 定时器 ESP32学习笔记(七) 复位和时钟 …

Arduino-ESP32-WROOM-32E—PulseSensor传感器测心率

1、下载ESP32驱动 2、右击以管理员身份运行 3、运行完成后,即可安装成功。打开Adruino,选中如图开发板 4、双击打开.ino文件 5、 选择合适的开发板型号和端口 6、 安装库文件ESP32time、U8g2、PulseSensor Playground 7、修改为自己的传感器S口连接的引脚…

(操作系统开发)从实模式---->保护模式---->IA-32e模式( 64位模式)

实模式和保护模式都是CPU的工作模式。 实模式与保护模式介绍 在实模式下,程序可以操作任何地址空间,而且无法限制程序的执行权限。尽管这种模式给设置硬件功能带来许多方便,但却给程序执行的安全性和稳定性带来了灾难性的后果,一…

构建64位操作系统-Intel架构:实模式,保护模式,实模式长寻址,IA-32e

1.Intel处理器架构-实模式 BIOS加载引导程序开始执行时&#xff0c;程序位于实模式。 实模式下特点有&#xff1a; 1.1.实模式下的物理寻址 jmp 0x1000:0x0010 实模式下上述0x1000:0x0010对应的目标位置物理地址为0x1000 << 4 0x0010 0x10010。 1.1.1.实模式下…