532628838
圣骑士
圣骑士
  • 注册日期2011-06-10
  • 发帖数98
  • QQ
  • 火币517枚
  • 粉丝77
  • 关注39
阅读:2834回复:0

任务内无特权级变换的转移

楼主#
更多 发布于:2011-08-01 16:51
 所谓任务内无特权级变换的转移指:在转移到新的代码段时,当前特权级CPL保持不变。利用段间转移指令JMP、段间调用指令CALL和段间返回指令RET可实现任务内无特权级变换的转移。利用INT指令和IRET指令也可实现任务内无特权级变换的转移。  
    (1)利用段间直接转移指令JMP或CALL
在执行段间转移指令JMP时,如果指令内所含指针指示一个代码段,那么就直接开始上述向目标代码段转移的步骤;在执行段间调用指令CALL时,如果指令内所含指针指针指示一个代码段,那么就把返回地址指针压栈,然后就直接开始上述向目标代码段转移的步骤。顺利通过这几步(不调整RPL)后,就完成了任务内无特权级变换的转移。  
由此可见,利用段间直接转移指令JMP或调用指令CALL可方便地进行任务内无特权级变换的转移,但不能进行任务内特权级变换的转移。  
    (2)利用段间返回指令RET
在执行段间返回指令RET时,如果从堆栈中弹出的目标地址指针指示一个代码段,并且选择子符合RPL=CPL的条件,那么就开始上述向目标代码段的转移步骤。顺利通过这几步后,就完成了任务内无特权级变换的转移。  
通常情况下,段间返回指令RET与段间调用指令CALL对应。在利用段间调用指令CALL以任务内无特权级变换的方式转移到某个子程序后,在子程序内利用段间返回指令RET以任务内无特权级变换的方式返回主程序。由于调用时无特权级变换,所以返回时也无特权级变换,如果真是如此,那么必须能够满足条件RPL=CPL。  
    (3)利用调用门和其它途径
如何利用调用门实行和其它方法实现任务内无特权级变换的转移将在后面的文章中介绍。

喜欢0 评分0
游客

返回顶部