x64保护模式_IA-32e

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时出错。线程切换出问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值