《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(特权级,更新)

news2024/9/29 13:22:15

5.4 特权级深入浅出

5.4.1 特权级哪点事

计算机 访问 可分为访问者和被访问者。
建立特权机制为了通过特权来检查合法性。
0、1、2、3级,数字越小,权力越大。
0特权级是系统内核特权级。
用户程序是3特权级,被设计为“有需求就找操作系统”,所以不需要太大能力。

5.4.2 TSS 简介

Task State Segment 任务状态段。用于存储任务环境。104字节是TSS的最小尺寸,根据需要还可以接上个IO位图。

当任务在特权级变化的时候,如果说使用同一个栈来容纳所有特权级的数据,就会导致栈中数据混乱、栈溢出的问题。
所以TSS 中有3个栈。分别是:
ss0,sp0
ss1,sp1
ss2,sp2

TSS是处理器硬件原生的系统级数据结构。
特权级分为两类:

  1. 低特权到高特权级
    此时 3 可以到 2 1 0 ,2 可以到 1 0 ,1 可以到 0。这被称为“向内层转移”。
  2. 高特权级到低特权级。
    在处理器 从 低到高特权时,会自动地将低特权级的栈地址(SS 和 ESP)压入转移后的高特权级所在的栈中。在返回的时候,使用如retf / iret 从高到低的时候,处理器从当前高特权级的栈中将低特权级的栈段选择子和偏移量取回。 由高到低,过程被称为"向外层转移。

TSS 也是要加载的,由 TR 寄存器加载。每次执行不同任务时候,将TR寄存器加载不同的TSS就可以了。

5.4.3 CPL 和 DPL 入门

CPL 当前特权级
DPL 目标代码段的描述符上的特权级
RPL 请求特权级

处理器当前特权级的真实面目是什么?
在任意时刻,当前特权级CPL保存在CS选择子中的RPL部分。

当前特权级为什么会变化?
当处理器从一个特权级的代码段转移到另一个特权级的代码段上执行的时候。

访问者就是当前代码段中的指令。任何时候不允许访问比自己特权更高的资源。无论是数据还是代码,在不涉及RPL的情况下分情况讨论

  1. 受访者——数据段
    访问者特权级 >= 被访问资源特权级
  2. 受访者——代码段
    只能平级访问

既执行高特权级代码段上的指令,又不提升特权级,一方面是利用一致性代码段
1. 代码段是非一致性代码段,所以只能平级转移。
3. 一致性代码段(依从代码段)指如果自己是转移后的目标段,自己的特权级(DPL)一定要大于等于转移前的CPL。数值上 CPL >= DPL。一致性代码转移后的特权级不予自己的特权级(DPL)为主,而是与转移前的低特权级一致。

代码段:(比较为数值比较)
一致:CPL >= DPL:CPL 不变:低访问高
非一致:CPL == DPL:CPL 不变:平级访问

5.4.4 门、调用门 与 RPL 序

门结构就是记录一段程序起始地址的描述符。
描述符中有DPL。
任务门可以放在GDT、LDT、IDT中
调用门可以位于GDT、LDT中
中断和陷阱门只能在IDT中,不能主动调用,只能由中断信号触发。
都是来实现 低特权级转高特权级。

  1. 调用门
    call 、jmp
  2. 中断门
    int
  3. 陷阱门
    int3
  4. 任务门
    以任务状态段TSS为单位,用来任务切换。

实际上这些门都是有“门槛”的,就是 门描述符DPL
数值上:
当前特权级 CPL <= 门的DPL
当前特权级 CPL >= 门中目标代码段的DPL

在这里插入图片描述
调用门也是需要选择子的。既然门是指向某个内核例程,是例程就需要参数。
调用门如何在用户3特权级下位0特权级下的内核程序传递参数?
处理器的设计,在固件上实现了参数的复制,既将用户压在3特权级下的参数自动复制到0特权级的栈中。参数需在栈中按顺序挨着,处理器只需要知道有几个参数就好。

5.4.5 调用门的过程保护

调用门涉及2个特权级,CPL和门中目标代码的DPL。
用户进程通过call指令调用“调用门”过程。

  1. 在低特权级栈中压入参数。
  2. 处理器自动从TSS中找到高特权级的栈选择子SS和栈指针ESP。
  3. 检查新栈段描述符DPL和TYPE。
  4. 如果目标代码段的DPL 特权级高于 CPL。将ss_old和esp_old保存到其他地方,使用新栈。
  5. 将SS_old 和 ESP_old压入当前的高特权栈中。
  6. 将用户栈中参数复制到新栈。
  7. 段间远调用所以压入当前cs_old 和 eip_old。
  8. 将门中代码段选择子载入 CS,偏移量放入 EIP。

如果是平级处理,则不需要更新当前栈。
retf使用时:

  1. 先检查CS选择子中的RPL特权级检查.
  2. 获取CS_old 和 EIP_old并对 代码段的DPL 和 选择子中的RPL做特权级检查。如果通过,则从栈中弹出数据,eip_old到eip,CS_old到cs。
  3. 增加esp_new的值跳过栈中的参数。
  4. 如果第一步中改变了特权级,此时从栈中弹出esp_old和 ss_old。恢复旧栈。
    注意:返回的时候会检查数据段寄存器 DS、ES、FS、GS内容,如果其中选择子指向的数据段描述符DPL权限大于返回后的CPL,处理器会把数值0填充到相应的段寄存器中引发异常。

5.4.6 RPL的前世今生

在访问代码段的时候,是一个特权限制条件;
在访问数据段的时候,将CPL赋值给RPL 确定对数据操作的真实身份是用户还是操作系统。

要让受访问者清除真正请求资源的是用户还是系统。
在请求某特权级位DPL级别的 资源(数据) 的时候,参与检查的除了 CPL 还要加上 RPL。
数值上:
CPI <= DPL && RPL <= DPL
;
为了安全起见 操作系统会将RPL改为用户程序的CPL。
RPL引入是为了避免低特权级的程序访问高特权级的资源。

符合的样例如 0 <= 3 && 3 <= 3 当前为系统权限,之前是用户,对用户数据操作
或是 0 <= 3 && 0 <= 3 当前为系统权限,之前是系统,对用户数据操作
或是 0 <= 0 && 0 <= 0。当前为系统权限,之前是系统,对系统数据操作

特权级检查发生在什么时候?
在段寄存器中加载选择子访问描述符的时候。

不通过调用门直接访问数据和代码时的特权级检查规则
代码段

  • 目标非一致代码段
    数值上 CPLRPL目标代码段DPL
  • 一致性代码段
    数值上 CPL >= 目标代码段 DPL && RPL >= 目标代码段DPL。

数据段
数值上: CPL <= 目标数据段 DPL && RPL <= 目标数据段 DPL。
栈段
数值上:CPLRPL用作栈的目标数据段DPL。

对于门来说,处理器在检查特权级时:

  1. 要求CPL 和 RPL 在 DPL_GATE 和 DPL_CODE 之间
  2. (选择子上的)RPL 只在近调用门时 和 DPL_GATE 比较一次,然后 CPL 和 DPL_CODE 比较。
    数值上:DPL_GATE >= CPL >= DPL_CODE
    数值上:RPL <= DPL_GATE。

调用门使用 call 指令 和 jmp 指令。
jmp 只能平级

数值上:CPL == 目标代码段DPL
数值上:DPL_GATE >= CPL = =DPL_CODE && RPL <= DPL_GATE。

jmp就是被设计用于平级转移的。所以jmp 只用在不需要特权级变化,且不从调用门返回的场合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/349120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT+OpenGL光照

QTOpenGL光照 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 颜色 现实生活中看到的物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的颜色 太阳光能被看见的白光是多找演的的组合…

Linux部署项目

一、手动部署 1、终端直接部署&#xff08;前台运行&#xff09; &#xff08;1&#xff09;在IDEA中开发SpringBoot项目并打成jar包 &#xff08;2&#xff09;将jar包上传到Linux服务器 mkdir /usr/local/app #创建目录&#xff0c;将项目jar包放到此目录&#xff08;3&…

C++——哈希4|布隆过滤器

目录 布隆过滤器 完整代码 布隆过滤器应用 布隆过滤器的查找 布隆过滤器删除 布隆过滤器优点 布隆过滤器缺陷 布隆过滤器海量数据处理 布隆过滤器 位图只能映射整形&#xff0c;而对于字符串却无能为力。 把字符串用哈希算法转成整形&#xff0c;映射一个位置进行标…

Axure教程(一)——线框图与高保真原型图制作

前面我们学习了制作网页的技能&#xff0c;从这里开始我们来学习前端必备技能&#xff0c;就是用Axure来制作原型图&#xff0c;一方面我们能提前绘制出我们所需的页面&#xff0c;这在我们开发的时候能节省大量的时间&#xff0c;另一方面我们能通过给用户进行体验从而能够发现…

robotframework + selenium自动化测试常见的问题

1、 插入中文数据提示 FAIL UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 92-107: ordinal not in range(25 DataBaseLibrary插入中文乱码的解决&#xff1a;修改D:\Python27\Lib\site-packages\DatabaseLibrary\connection_manager.py里的co…

极客大挑战 2021

题量很大&#xff0c;收获挺多&#xff0c;持续时间也长&#xff0c;据说结束之后会再持续一段时间&#xff0c;然后题目会开源。 WEB Dark 暗网签到&#xff0c;难以置信 Welcome2021 改个请求方法会提示你文件&#xff0c;再进去就好了 babysql 直接把请求包扔sqlmap里&…

什么是仓库管理?

仓库管理包括仓库日常运营所触及的准绳和流程。从较高的层次上讲&#xff0c;这包括接纳和组织仓库空间、布置劳动力、管理库存和完成订单。放大来看&#xff0c;你会发现有效的仓库管理触及到优化和集成这些过程中的每一个&#xff0c;以确保仓库操作的一切方面协同工作&#…

ElasticSearch之RestClient操作索引库和文档

前言&#xff1a;上文介绍了使用DSL语言操作索引库和文档&#xff0c;本篇文章将介绍使用Java中的RestClient来对索引库和文档进行操作。 希望能够加深自己的印象以及帮助到其他的小伙伴儿们&#x1f609;&#x1f609;。 如果文章有什么需要改进的地方还请大佬不吝赐教&#x…

linux系统编程1--文件编程read和write

write函数进行文件写入操作1.write函数原型&#xff1a;ssize_t write(int fd, const void *buf, size_t count);2.参数1&#xff1a;int fd&#xff0c;文件描述符即open函数的返回值&#xff1b;参数2&#xff1a;const void *buf&#xff0c;写入到fd文件内容的写入缓冲区&a…

10万字企业数字化(技术中台、数据中台、工业互联网平台建设方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料关注公众号“智慧方案文库”&#xff0c;部分资料内容&#xff1a; 目录 1 概述 …

【nodejs-05】黑马nodejs学习笔记05-数据库基本操作02

文章目录4.在项目中操作MySQL4.1 在项目中操作数据库的步骤4.2 安装与配置 mysql 模块4.3 使用 mysql 模块操作 MySQL 数据库5.前后端的身份认证5.1 Web 开发模式5.2 身份认证5.3 Session 认证机制5.4 在 Express 中使用 Session 认证5.5 JWT 认证机制5.6 在 Express 中使用 JW…

用类比方式学习编程中函数递归(个人理解仅供参考)(内含汉诺塔问题的求解)

目录 1.前言 2.递归的数学模型 3.相关的c语法 4.将递归的数学模型写成编程语言 5.利用类比方法将实际问题的代码写成函数递归的形式 例1: 例2: 6.汉诺塔问题的求解 1.前言 本人在学习函数递归编程方法的过程中&#xff0c;发现用类比的方式学习递归法可帮助我们在各种编…

day14_类中成员之一:构造器

由来 我们发现我们new完对象时&#xff0c;所有成员变量都是默认值&#xff0c;如果我们需要赋别的值&#xff0c;需要挨个为它们再赋值&#xff0c;太麻烦了。我们能不能在new对象时&#xff0c;直接为当前对象的某个或所有成员变量直接赋值呢。可以&#xff0c;Java给我们提…

【算法】二分

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录1.二分思想2.二分模板3.二分应用1.二分思想 思想 单调的元素&#xff0c;一定可以二分&#xff1b;非单调不一定不能二分 每次把整个区间 [ …

【企业云端全栈开发实践-1】项目介绍及环境准备、Spring Boot快速上手

本节目录一、 项目内容介绍二、Maven介绍2.1 Maven作用2.2 Maven依赖2.3 本地仓库配置三、Spring Boot快速上手3.1 Spring Boot特点3.2 遇到的Bug&#xff1a;spring-boot-maven-plugin3.3 遇到的Bug2&#xff1a;找不到Getmapping四、开发环境热部署一、 项目内容介绍 本课程…

肿瘤HRR和HRD 简单记录

最近看到两个在肿瘤领域高频出现的词HRR和HRD&#xff0c; 遂简单记录下。 HRR和HRD的概念 当细胞受到外界不良环境的压力下往往会导致DNA的损伤&#xff0c;此时便会触发DNA 损伤反应 (DDR)&#xff0c;从而激活许多DNA修复通路。在这些DNA损伤中&#xff0c;DNA 双链断裂&a…

【云原生】centos7搭建安装k8s集群 v1.25版本详细教程实战

文章目录前言一. 实验环境二. k8s 的介绍三 . k8s的安装3.1 搭建实验环境3.1.1 硬件层面的要求3.1.2 软件层面环境配置3.2 docker的安装3.2.1 搭建docker3.2.2 部署 cri-dockerd3.3 部署k8s3.3.1 配置添加阿里云的yum源3.3.2 安装kubeadm kubelet kubectl3.3.3 k8s-master节点初…

浪涌保护器,防雷浪涌保护器的作用和类型指南

1&#xff0e; 什么是SPD浪涌保护器&#xff1f;地凯防雷SPD浪涌保护器是防止雷击导致故障的避雷器和浪涌保护设备。广泛用于电源浪涌对策的变阻器在通电超过规格的雷电浪涌电流、超过最大容许电路电压的过电压、过电流时&#xff0c;会进入短路故障模式&#xff0c;存在冒烟起…

Mysql元数据获取方法(information_schema绕过方法)

前提&#xff1a;如果waf或其它过滤了information_schema关键字&#xff0c;那我们该如何获取元数据呢&#xff1f;能够代替information_schema的有&#xff1a;sys.schema_auto_increment_columnssys.schema_table_statistics_with_bufferx$schema_table_statistics_with_buff…

大数据框架之Hadoop:HDFS(七)HDFS 2.X新特性

7.1集群间数据拷贝 scp实现两个远程主机之间的文件复制 ​ scp -r hello.txt roothadoop103:/root/hello.txt // 推 push ​ scp -r roothadoop103:/root/hello.txt hello.txt // 拉 pull ​ scp -r roothadoop103:/root/hello.txt roothadoop104:/root //是通过本地主机中…