x86 - 将权限级别从CPL0更改为CPL3

时间:2012-07-17 01:05:28

标签: x86 privilege

我正在研究一些低级操作码(64位),我正在试图弄清楚如何从CPL0切换到CPL3。问题是我遇到的英特尔开发人员手册中的这个小句子:''...处理器不允许程序控制从运行在CPL为0,1或2的过程转移到运行在CPL或3,退货时除外。 “

TSS(任务状态段)甚至没有堆栈指针,那么CPL3代码用于堆栈的是什么?我知道这是可能的(否则操作系统将如何启动任何应用程序代码)但我找不到任何文档。看起来你必须将一些CPL3代码的地址压到堆栈上,以诱骗处理器运行CPL3代码,但这听起来有些苛刻。你们知道更好的方法吗?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

在x86中,如果要将控制权从更高权限级别传递回更低权限,则必须使用iret指令。根据iret指令(ss,esp,eflags,cs&& eip)预期的结构手动创建堆栈顶部并调用iret。

注意,示例适用于x86。 x64采用相同的方式,但使用其他注册表,可能会有不同的堆栈布局。

VOID FASTCALL JumpFromCr0ToCr3(CONST ULONG cr3_eip, CONST USHORT cr3_cs , CONST ULONG cr3_flags, CONST ULONG cr3_esp, CONST USHORT cr3_ss)
{
    __asm
    {                               //        |     |
        push dword ptr [ESP + 0xC]; // ss     |  eip|<- stack pointer before iretd 
        push dword ptr [ESP + 0xC]; // esp    |   cs|
        push dword ptr [ESP + 0xC]; // flags  |flags|
        push            EDX       ; // cs     |   cs|
        push            ECX       ; // eip    |  eip|
                                  ;           -------
        iretd                     ;             top
    }
}
相关问题