概述

这一篇 hin 重要。

一般来说,我们在 Windows 中写的代码,都运行在 3 环(应用层)。只有在调用一些系统接口的时候,或者中断等情况的时候,才会进入 0 环(内核)。

为什么 CPU 要给代码赋予不同的权限?这是为了防止你任意妄为。在 Windows 中,如果你随意更改了内核的重要数据,操作系统必然面临着危险——蓝屏。

为了防止这种情况发生,CPU 把执行权限分成了4个等级,0,1,2,3. 其中 0 表示最高级,可以执行任意代码,而执行权限为 3 的程序,只能执行普通的指令。Windows 和 Linux 只使用了 0 和 3 这两种。

而 CPU 的有些指令,只能在 0 环执行。有些内存的访问,也只能在 0 环。这就是所谓的保护

之前已经学过,代码段描述符中,有 DPL 字段,它是专门用来描述代码段级别的。前面分析过 Windows 的GDT 表中段描述符,就发现有 0 环的代码段和 3 环代码段。这里的 DPL 表示,只允许相同级别的下的程序跳过来执行,除非被我同意,低特权级的程序才能跳进来执行。

所谓的特定级别下的程序,是指的当前 CPL 的级别。见后文。

CPU 是不允许 CPL = 3 的程序直接跳转到 DPL=0 的代码中去执行。

当前特权级

为了防止意外,有必要再次重复下 CPL。

这个值可以始终保存在 cs 或者 ss 段寄存器的低 2 位。在OD里打开一个程序,如果你细心观察,你总会发现,cs 的最低2位一定是2进制 11,也就是3. 你绝对不可能看到这个值变成 0. 因为 OD 本身就是运行在 3 环的调试器。

这是不是意味着,当前特权级永远不会变成 0?

不会的,后面的实验将验证这一点。

如果你想在 VC6.0 中写程序,直接去读取高 2G 地址的数据,一定会报错。如果你当前的特权级被提升为 0 环(简称提权),这时候再去读取高 2G 地址数据,就没有问题了。然而提权并不是这么简单。后文会陆续介绍。

跨段执行——就是改变 CS 段寄存器

跨段执行,就是指改变当前的 cs 段寄存器,把另一个代码段的描述符加载到 cs 段寄存器。千万不要想当然的使用 mov ax, 0x08; mov cs, ax,编译器都不会让你通过。前面你也发现,也不存在lcs这样的指令加载段寄存器。

改变 cs 段寄存器,可以使用 jmp far 和 call far 等等。注意,除了这两个指令,还有别的,这里不能讲太多。本篇只介绍 jmp,原因还是那样,因为它简单。

指令 jmp 可以实现跨段执行代码,但是它并不能提权(无法改变当权特权级),也就是说,即便你跨到了 DPL = 0 的段,你的 CPL 也不会发生任何改变。 除非你原来就是 0.

使用 jmp 跨到 0 环代码段,也是有要求的,除非这个0环代码段描述符同意(这就是所谓的一致代码段)。

一致代码段与非一致代码段

当段描述符描述代码段时,TYPE 字段的 c 位置 1 说明该段是一致代码段,否则是非一致代码段。

  • 只有得到段描述符的同意,才允许低权限的程序跳转进去执行。这种段称为一致代码段
  • 而有些代码段描述符,绝对不允许低权限的程序跳转进去执行,这种段称为非一致代码段

实现跨段:一致代码段(比当前权限高的)

要求:CPL >= DPL
步骤:

1. 在8003f048 处添加描述符 00cf9f00`0000ffff,该描述符描述的段为一致代码段,DPL = 0命令 eq 8003f048 00cf9f00`0000ffff
2.  打开 OD,修改当前指令为 jmp 48:0044420c
3.  执行指令后跳转到了 0044420c 处,且 cs 变为 0x4b


图1 安装描述符

图2 跨段跳转

实现跨段:非一致代码段(与当前权限一致)

要求:CPL == DPL 并且 RPL <= DPL
步骤:

1. 在8003f048 处添加描述符 00cffb00`0000ffff,该描述符描述的段为非一致代码段,DPL = 3命令 eq 8003f048 00cffb00`0000ffff
2.  打开 OD,修改当前指令为 jmp 48:0044420c
3.  执行指令后跳转到了 0044420c 处,且 cs 变为 0x4b


图3 安装段描述符

图4 跨段跳转

总结

使用 jmp 跨段,并不能改变当前特权级 CPL。

代码间的跳转(段间跳转  非调用门之类的)  执行流程

JMP 0x20:0x004183D7 CPU如何执行这行代码?

(1) 段选择子拆分

0x20 对应二进制形式 0000 0000 0010 0000

RPL = 00   TI = 0  Index = 4

(2) 查表得到段描述符

TI = 0 所以查GDT表

Index = 4 找到对应的段描述符

四种情况可以跳转:代码段、调用门、TSS任务段、任务门

(3) 权限检查

如果是非一致代码段,要求:CPL == DPL 并且 RPL <= DPL

如果是一致代码段,要求:CPL >= DPL

(4) 加载段描述符

通过上面的权限检查后,CPU会将段描述符加载到CS段寄存器中.

(5) 代码执行

CPU将 CS.Base + Offset 的值写入EIP 然后执行CS:EIP处的代码,段间跳转结束.

7- 代码段权限检查与 jmp相关推荐

  1. 2020-11-24(Windows保护模式学习笔记(1)—— 段寄存器与段权限检查)

    X86 CPU的三个模式:实模式.保护模式和虚拟8086模式 0x01 段寄存器 通常情况下,我们认为有8个段寄存器,他们分别是 ES CS SS DS FS GS LDTR TR 其中,后四个寄存器 ...

  2. (7)数据段权限检查

    代码段和系统段描述符的权限检查方式并不一样,详见后续课程,本文只探讨数据段. 一.数据段权限检查 DPL是段的权限属性,要想访问一个数据段,段选择子和CPU当前权限必须高于DPL.要注意,权限数值越低 ...

  3. CPL DPL RPL的区别 一致性代码段和非一致性代码段

    概述:在谈论保护模式编程的时候,一直会有这样的困惑:为什么除了CPL和DPL还有RPL?什么时候高特权级不能访问低特权级?什么时候低特权级不能访问高特权级?一致性代码和非一致性代码有什么区别?等等这些 ...

  4. Bochs源码分析 - 16:conforming与non-conforming代码段区别以及Bochs代码的实现

    前言 之前在学习x86架构时,在代码段中有一个点让我感到困惑,就是type field 11位.这个之前一直似懂非懂,说不理解吧知道这么个玩意,说理解吧又不知道其具体干嘛,感觉是方便系统调用加快速度, ...

  5. X86(IA32)段权限标志位CPL DPL RPL详解

    1.DPL,RPL,CPL 之间的联系和区别是什么?RPL和CPL是必须相同吗?如果相同,为什么要釆用两个而不改用一个呢? 答:特权级是保护模式下一个重要的概念,CPL,RPL和DPL是其中的核心概念 ...

  6. 一致代码段与非一致代码段

    首先,我们先来看几个问题: 一致代码段和非一致代码段是什么? 为什么要有一致代码段和非一致代码段? 系统提供怎样的机制来使用户程序访问内核数据? 程序如何在段与段之间跳转? 接下来,我们将讨论上述这些 ...

  7. 统一代码段与非一致代码段

    一致代码段与非一致代码段 上几篇文章,我们一直在讨论的都是 GDT 相关的一些问题,现在我们知道在系统在从实模式向保护模式跳转时,GDT 是必须要准备的结构.在介绍这一跳转之前,这篇文章我们来介绍两个 ...

  8. 代码段间转移控制时的特权级检查(JMP/CALL)——《x86汇编语言:从实模式到保护模式》读书笔记28

    代码段间转移控制时的特权级检查(JMP或者CALL指令) 在保护模式下,JMP或CALL指令可以用以下四种方法之一来引用另外一个代码段: 1. 目标操作数含有目标代码段的段选择子和偏移 2. 目标操作 ...

  9. 特权级——保护模式的特权级检查 DPL,RPL,CPL, 一致代码段,非一致代码段

    特权级是保护模式下一个重要的概念,CPL,RPL和DPL是其中的核心概念,查阅资料无数,总结如下. 一.CPL.RPL.DPL简单解释     CPL是当前进程的权限级别(Current Privil ...

  10. 不同特权级间代码段的跳转{ 门 + 跳转(jmp + call) + 返回(ret) }

    [0]写在前面 0.1)我们讲 CPU的保护机制,它是可靠的多任务运行环境所必须的: 0.2) CPU保护机制:分为段级保护 + 页级保护: 0.2.1)段级保护分为:段限长 limit 检查.段类型 ...

最新文章

  1. 崔强:如果有知识就做一个内裤外穿飞行的超人
  2. verilog基础--sign表达式
  3. IIS7.5 部署WCF项目问题集锦
  4. iOS模型输出和打印
  5. vue3,vite2,json数据通过拼接显示链接src
  6. 面试题 16.18. 模式匹配
  7. es6 提取数组对象一部分_ES6新特性你了解了多少呢?
  8. uc如何HTML编辑,电脑端UC浏览器如何对书签进行编辑
  9. wifi678响应超时服务器无应答,Win8宽带连接出现错误678的处理方法
  10. echarts 设置地图默认缩放比例 尺寸
  11. appium IOS 报错 [iProxy] recv failed: Operation not permitted
  12. 计算机存储密码的方式,WinRAR常用的密码存储起来的方法
  13. 分布式事务的四种解决方案
  14. Es7.x使用RestHighLevelClient进行聚合操作
  15. Edge浏览器检查更新时出错: 无法创建该组件(错误代码 3: 0x80004002 -- system level)如何更新
  16. 微信视频号封面怎么设置?怎么改?封面制作全教程,快来解锁!
  17. 冯诺依曼体系结构、哈佛体系结构与改进型哈佛结构之间的区别
  18. 一起开心2020蓝桥寒假训练(二)7-6 彩虹瓶 (25分)用到栈,队列
  19. 超市结算系统软件测试,软件测试报告-超市管理系统【参考】.doc
  20. 计算机图像技术在医学上的应用,计算机图像处理技术在医学中的应用

热门文章

  1. 在网站中使用VideoJs视频播放器播放视频
  2. 小众绿软|媒体:myPlayer 2.1
  3. 最详细移动硬盘安装linux过程,装在移动硬盘上的linux系统不能在另一台电脑启动的解决办法
  4. 【源码】MATLAB的专业绘图工具
  5. 怎么样使prestashop 运行速度更快
  6. C# Winform SplitContainer组件创建侧边菜单
  7. c语言怎么添加按钮,关于用C语言制作按钮的问题
  8. 2016/2/19:ApplePay
  9. Web聊天室历史记录解决方案(轻喷。。)
  10. html5在线拍照,h5调用html5拍照上传功能