段间转移、长调用、短调用

段间转移不同于段内转移,段间转移同时修改CS:EIP,而段内转移只修改EIP
如JMP FAR 与JMP之间的区别

段间转移

JMP 0x20:0x004183D7
流程
            1、段选择子拆分:0x20=0x00100000
                                           RPL=00,TI=0,Index=10(4)
            2、查表得段描述符:
                                           TI=0代表查找GDT表,Index=4找到对应的段描述符(只有是代码段、调用门、TSS任务段、任务门的情况下,才可以跳转
            3、权限检查:
                                           如果是非一致代码段,要求:CPL==DPL&&RPL<=DPL
                                           如果是一致代码段,要求:CPL>=DPL
            4、加载段描述符:
                                           CPU将段描述符加载到CS段寄存器
            5、代码执行:
                                           CPU将CS.base+Offset(0x004183D7)值写入EIP,执行CS:EIP处代码。

一致代码段

又称共享段,该段代码可让应用层直接访问,故CPL>=DPL,即CPL权限可以低于DPL

非一致代码段

只有同级权限可以使用。即CPL==DPL。

以下部分转载自:https://blog.csdn.net/qq_35425243/article/details/82705581

短调用

指令格式: CALL 立即数/寄存器/内存
在这里插入图片描述
发生改变的寄存器 ESP EIP

长调用(跨段不提权):

指令格式:CALL CS:EIP
在这里插入图片描述
发生改变的寄存器 ESP EIP CS
调用时会先PUSH调用者的CS,再PUSH返回地址

长调用(跨段并提权):

指令格式:CALL CS:EIP(EIP废弃)
在这里插入图片描述
发生改变的寄存器 ESP EIP CS SS
调用前,程序处于3环堆栈,CALL 执行后,先后PUSH调用者SS,ESP(3环栈顶),CS,返回地址(3环EIP返回地址)
CALL执行后,程序CPL为0,具有CPU最高特权级别,堆栈转入0环堆栈,返回时读取PUSH的数据返回3环
以上表明,不同权限级别的环对应的堆栈不同

总结

1、跨段调用时,一旦有权限切换,就会切换堆栈
2、CS的权限一旦改变,SS的权限也要随着改变,CS和SS的等级一样
3、JMP FAR只能跳转到同级非一致代码段,但CALL FAR可以通过调用门提升CPL权限
4、SS和ESP(0)来自TSS段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值