博客
关于我
代码段段间跳转流程
阅读量:659 次
发布时间:2019-03-16

本文共 1092 字,大约阅读时间需要 3 分钟。

修改cs段寄存器

除了cs段寄存器之外,其他的段寄存器都可以通过mov,les,lds这样的指令修改。但是cs不行,cs的修改涉及到eip指令指针的修改。

只修改eip

jmp,call,ret等都是段内跳转指令,他们都是在不改变cs的情况下只改变eip。因为jmp,call是段内跳转指令,所以不需要进行权限的检查。

同时修改eip和cs

jmp far,call far,retf,int等都是段间跳转指令,他们改变cs跳向其他的代码段,同时也改变了eip。因为jmp far,call far指令是段间跳转指令,所以需要进行必要的权限检查。

跳转形式

jmp far,call far根据段选择子指向的段描述符的不同分成四种形式进行段间跳转。

  1. 段选择子指向的段描述符是一个普通的代码段的段描述符
  2. 段选择子指向的段描述符是一个调用门的门描述符
  3. 段选择子指向的段描述符是一个TSS任务段的描述符
  4. 段选择子指向的段描述符是一个任务门的门描述符

段选择子指向的段描述符是一个普通代码段的段描述符

jmp far跳转流程

例如指令 jmp far 0x20:0x00401005

  • 拆分段选择子

    段选择子为0x20,Index索引为4,TI位为0,RPL为0。

  • 查找段描述符

    因为其TI位为0,所以CPU会向GDT表中查找索引为4的段描述符。
    其会先检查此段描述符的P位是否为1,如果为0此段描述符就无效。因为是代码段跳转,所以要求此段描述符为代码段或者是系统段(调用门,TSS任务段,任务门),但是不能为数据段。

  • 权限检查

    如果是非一致代码段,要求CPL == DPL (权限要一致)且 RPL <= DPL。
    如果是一致代码段,要求 CPL >= DPL(低权限使用)

  • 加载段描述符

    cpu将段描述符加载到cs段寄存器中(可见与不可见部分)

  • 代码执行

    CPU将cs.base + offset值写入EIP,执行cs:eip完成段间跳转

call far跳转流程

call far和jmp far差不多,但是其涉及到堆栈的变化(返回地址和cs寄存器的保存与还原)。

注意:对于段选择子指向的段描述符是一个普通代码段的段描述符时,无论是一致代码段还是非一致代码段,CPL都不会变(CPL不变其堆栈也不会切换)。无论什么时候段选择子的RPL并不会影响CPL。

例如:cs本来是0x1b,CPL为3,如果jmp far 0x48:0x004014FD ,段选择子的RPL为0。执行此指令CS会变为0x4B,而不是0x48,CPL没有改变还是3。要想改变CPL(提升权限)只能通过调用门等一些门。

转载地址:http://qvcqz.baihongyu.com/

你可能感兴趣的文章
flink启动(二)
查看>>
pair的用法
查看>>
Flex 布局的自适应子项内容过长导致其被撑大问题
查看>>
PL/SQL 动态Sql拼接where条件
查看>>
Error:Cannot read packageName from AndroidManifest.xml
查看>>
【自学Flutter】4.1 Material Design字体图标的使用(icon)
查看>>
【换行符】什么时候用cin.get()吃掉输入流中的换行符
查看>>
广东外语外贸大学第三届网络安全大赛Writeup
查看>>
SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
查看>>
Thymeleaf sec:authorize 标签不生效
查看>>
微信JS-SDK DEMO页面和示例代码
查看>>
一张图搞定RPC框架核心原理
查看>>
他来了他来了,他带着云栖大会的免费门票走来了
查看>>
获取linux 主机cpu类型
查看>>
测试tensorflow是否安装成功 出现 SyntaxError: invalid syntax的错误
查看>>
Flask--简介
查看>>
16 python基础-恺撒密码
查看>>
Frame--Api框架
查看>>
Boostrap技能点整理之【网格系统】
查看>>
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
查看>>