问题:
使用调用门如何实现不同特权级代码之间的跳转(如:从高特权级到低特权级)?
不幸的事实:
调用门只支持从低特权级到高特权级执行
无法利用调用门从高特权级到低特权级执行
从高特权级的代码段通过return far可以返回到低特权级的代码段执行。这时return far是一个跳转指令,完成从高特权级到低特权级的跳转,这正是我们想要的。
return的本质是做跳转的,而不是我们根深蒂固的做返回的。只是最常用的方式是做返回使用。
思路整理:
调用门的特权级跳转:
1、通过远调用(call far),低特权级 -> 高特权级
2、通过远返回(retf),高特权级 -> 低特权级
retf的本质就是恢复cs和eip的值,因此,我们需要首先将cs和eip的值放入栈中。
需要提前知道的事实:
x86处理器对于不同的特权级需要使用不同的栈
每一个特权级对应一个私有的栈(最多四个栈)
特权级跳转变化之前必须指定好相应的栈
解决方案(高特权级 -> 低特权级)
1、指定目标栈段选择子(push)
2、指定栈顶指针位置(push)
3、指定目标代码段选择子(push)
4、指定目标代码段偏移(push)
5、跳转(retf)
原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9623482.html
时间: 2024-10-13 04:04:07