段间转移不同于段内转移,段间转移同时修改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段