代码段跳转流程

在这里插入图片描述

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修改跳转代码
在这里插入图片描述

跳转失败
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值