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 实验
注意:需要在单CPU单核心环境下运行
1:使用windbg在GDT表中构造一个代码段
构造了一个DPL为3 类型为非一致代码段的段描述符
2: 此处的段选择子为4B ,在虚拟机中使用OD做跳转实验
在EIP处写如下的跳转代码执行
执行后,已跳转成功
修改DPL为0 ,测试一次
修改DPL为如下的数值
在OD中修改跳转代码
运行测试
程序跳转到ntDLL异常处理模块,跳转失败。
改为数据段测试一次
windbg中修改为如下数据
OD修改跳转代码
跳转失败