代码段跳转流程

JMP 0x20:0x423633 CPU如何执行这一条代码?

1:段选择子拆分
RPL =0
TI =0
Index=4

2:查表得到段描述符
TI=0 查GDT表
Index=4 在表里找到对应的段描述符,判断段描述符的S位为下列之一则可以跳转。
四种情况可以跳转:代码段,调用门,TSS任务段,任务门

3:权限检查
如果是非一直代码段,要求CPL==DPL 并且 RPL<=DPL
如果是一直代码段,要求:CPL>=DPL(3环可以访问0环)

4:加载段描述符
通过以上的权限检查后,CPU会将段描述符加载到CS段寄存器中

5:CPU将cs.Base+Offset的值写入EIP 然后执行CS:EIP处的代码,段间跳转结束 CS修改为段选择子的值

jmp far 实验

1:使用windbg在GDT表中构造一个代码段
代码段跳转流程
构造了一个DPL为3 类型为非一致代码段的段描述符

2: 此处的段选择子为4B ,在虚拟机中使用OD做跳转实验

在EIP处写如下的跳转代码执行
代码段跳转流程
执行后,已跳转成功
代码段跳转流程

修改DPL为0 ,测试一次

修改DPL为如下的数值
代码段跳转流程
在OD中修改跳转代码
代码段跳转流程
运行测试
代码段跳转流程
程序跳转到ntDLL异常处理模块,跳转失败。

改为数据段测试一次

windbg中修改为如下数据
代码段跳转流程
OD修改跳转代码
代码段跳转流程

跳转失败
代码段跳转流程

相关文章: