Windows x64内核

天堂之门简介

在x86-64 架构中,有一个特殊的机制可以让 CPU 在 64 位模式和 32 位模式之间进行切换。Heaven's Gate 就是利用这个机制,在 32 位环境下进入 64 位模式,从而执行 64 位代码并调用 64 位 API。

在长模式下(即 64 位处理器启用 64 位功能时),段选择子可以用来确定 CPU 运行在 64 位模式还是兼容模式。 (具体是CS段寄存器的L位,设置为1就是64位模式)

通过以下代码,32位程序可以转而执行64位汇编代码

1
2
3
push 0x33            ; 将 64 位代码段选择子压入堆栈
push 64bit_address ; 压入 64 位模式下要执行的代码地址
retf ; 远返回,切换到 64 位模式

实战一波

具体我们实验一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
__asm
{
int 3
}
__asm
{
push 0x33
push x64
retf
}
//x64代码
x64:
__asm
{
//对应x64代码 mov rax,8
_emit 0x48
_emit 0xc7
_emit 0xc0
_emit 0x8
_emit 0x0
_emit 0x0
_emit 0x0
}
}

只能用windbg来调试,其他调试器不行,其他调试器会跑飞

现在看这些代码,发现0x12c100F开始的代码并没有被正确地识别为x64的汇编因为此时还处于x86汇编模式下,cs段寄存器为0x23

1725274181289

1725274064844

当我们执行完retf,指令被识别成了x64汇编,此时cs为0x33,就是x64模式

1725274261593

那咋从x64回到x86嘞,我这有点问题,待解决…….

我发现如果三环程序写retfq这个指令根本写不出来,写retf也回不去x86架构,干脆直接call far得了 cs:eip。。。。