代码段数据段的划分

embedded/2024/11/18 15:24:51/

DPL

DPL存储在段描述符中,规定访问该段的权限级别(Descriptor Privilege Level)

在这里插入图片描述

CPL

CPL是当前进程的权限级别(Current Privilege Level),是当前正在指向的代码段所在段的成绩,也就是CS段的DPL

RPL

RPL说明的是进程对段访问的请求权限(Request Privilege Level)

在这里插入图片描述

为了更好的加深印象,我们来尝试操作这几个位

对数据段的影响

首先还是得到现在GDT表,然后把index为4的段描述符放到index为9的地方,并且改变其DPL为0环,00cff3000000ffff改为00cf93000000ffff

0: kd> eq 807d4c68 0000000 00000000
WriteVirtual: 807d4c68 not properly sign extended
WriteVirtual: 807d4c70 not properly sign extended
0: kd> dq 807d4c20
ReadVirtual: 807d4c20 not properly sign extended
807d4c20  00000000`00000000 00cf9b00`0000ffff
807d4c30  00cf9300`0000ffff 00cffb00`0000ffff
807d4c40  00cff300`0000ffff 80008b7c`f75020ab
807d4c50  8040937c`c0003748 0040f300`00004000
807d4c60  0000f200`0400ffff 00000000`00000000
807d4c70  00000000`00000000 8000897d`1b300068
807d4c80  00000000`00000000 00000000`00000000
807d4c90  800092b9`900003ff 00000000`00000000

这是修改后的样子

0: kd> eq 807d4c68 00cf9300`0000ffff
WriteVirtual: 807d4c68 not properly sign extended
0: kd> dq 807d4c20
ReadVirtual: 807d4c20 not properly sign extended
807d4c20  00000000`00000000 00cf9b00`0000ffff
807d4c30  00cf9300`0000ffff 00cffb00`0000ffff
807d4c40  00cff300`0000ffff 80008b7c`f75020ab
807d4c50  8040937c`c0003748 0040f300`00004000
807d4c60  0000f200`0400ffff 00cf9300`0000ffff
807d4c70  00000000`00000000 8000897d`1b300068
807d4c80  00000000`00000000 00000000`00000000
807d4c90  800092b9`900003ff 00000000`00000000

这时候我们打开某个程序,用寄存器将ds的值换为48(0100 1000),也就是RPL为0环

在这里插入图片描述

再继续向下执行,没有任何影响

在这里插入图片描述

同理,如果我们将ds的值改为4b(0100 1011),也就是RPL为R3

在这里插入图片描述

也是能够正常执行的

在这里插入图片描述

所以,综上所述,我们得出结论在普通数据段下,RPL没有效果,是可以让我们随便改的

对堆栈段的影响

我们继续进行实验,这次要修改的是ss寄存器,之前我们已经将DPL改为了R0。所以我们在这里可以把ss改为R3,也就是4b,多余的过程就不截图了

在这里插入图片描述

这时候我们继续向下执行,这时候就又进入了错误分发,也就是报错

在这里插入图片描述

这时候我们将index号为9的段描述符DPL改为R3

1: kd> dq 807d4c20
ReadVirtual: 807d4c20 not properly sign extended
807d4c20  00000000`00000000 00cf9b00`0000ffff
807d4c30  00cf9300`0000ffff 00cffb00`0000ffff
807d4c40  00cff300`0000ffff 80008b7c`f75020ab
807d4c50  8040937c`c0003748 0040f300`00004000
807d4c60  0000f200`0400ffff 00cf9300`0000ffff
807d4c70  00000000`00000000 8000897d`1b300068
807d4c80  00000000`00000000 00000000`00000000
807d4c90  800092b9`900003ff 00000000`00000000
1: kd> eq 807d4c68 00cff300`0000ffff
WriteVirtual: 807d4c68 not properly sign extended
1: kd> dq 807d4c20
ReadVirtual: 807d4c20 not properly sign extended
807d4c20  00000000`00000000 00cf9b00`0000ffff
807d4c30  00cf9300`0000ffff 00cffb00`0000ffff
807d4c40  00cff300`0000ffff 80008b7c`f75020ab
807d4c50  8040937c`c0003748 0040f300`00004000
807d4c60  0000f200`0400ffff 00cff300`0000ffff//在这里
807d4c70  00000000`00000000 8000897d`1b300068
807d4c80  00000000`00000000 00000000`00000000
807d4c90  800092b9`900003ff 00000000`00000000

这时候重新启动,还是一样将ss修改为4b,这时候就可以正常执行了

在这里插入图片描述

所以,综上所述,对于ss堆栈段来说,需要DPL和RPL保持一致,再由CS和SS必须保持一致的原则我们可以知道 对于堆栈来说,只有DPL== RPL==CPL,那么代码才能正常执行

对于代码段的影响

先说在前面,由于编译器的影响,将我的jmp far segement:offset 语句错误的翻译成了jmp dword ptr [offset],导致我光是排错就思考了2小时。这个大坑点后面的人一定不要再踩上去

上网查阅资料,果然,jmp far 这种被认为是16位时期的指令,不过我也是第一次知道原来万能的编译器也会乱翻译(笑

正确的我的能够运行的代码如下

#include "stdafx.h"
#include<Windows.h>void __declspec(naked) test(){__asm{ret;}
}int _tmain(int argc,_TCHAR* argv[]){printf("%x\r\n",test());char bufcode[6] = {0,0,0,0,0x48,0};*(int *)&bufcode[0] = (int)test;printf("bufcode: %02X %02X %02X %02X %02X %02X\n",(ungigned char)bufcode[0],(ungigned char)bufcode[1](ungigned char)bufcode[2](ungigned char)bufcode[3](ungigned char)bufcode[4](ungigned char)bufcode[5]);__asm{jmp fword ptr bufcode;//}
}

赘述不多说,运行到跳转的这一步,此时cs的值是1b

在这里插入图片描述

然后继续向下运行,此时CS被改了

在这里插入图片描述

但是随着我们继续运行,CS又被改了回来

在这里插入图片描述

综上所述,CPL == DPL,和RPL无关,CPU会有处理机制自动帮助我们纠错


http://www.ppmy.cn/embedded/138574.html

相关文章

第四章:存储器管理

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…

ThriveX 博客管理系统前后端项目部署教程

前端 前端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Blog 控制端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Admin Vercel 首先以 Vercel 进行部署&#xff0c;两种方式部署都是一样的&#xff0c;我们以前端项目进行演示 首先我们先…

Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化…

网络工程实验一:静态路由的配置

#实验仅供参考&#xff0c;勿直接粘贴复制&#xff0c;用以学习交流# 1、实验目的&#xff1a; 熟悉eNSP网络仿真工具平台。 掌握静态路由配置方法。 能够配置路由器接口地址。 2、实验内容&#xff1a; 2.1、安装对应的软件&#xff1a; &#xff08;1&#xff09;Virtual …

如何在 Ubuntu 上使用 Docker 部署 LibreOffice Online

简介 LibreOffice Online&#xff08;也称为Collabora Online&#xff09;是一个开源的在线办公套件&#xff0c;它提供了与LibreOffice桌面版相似的功能&#xff0c;但完全在云端运行。这意味着用户可以通过浏览器访问和编辑文档&#xff0c;而无需在本地计算机上安装任何软件…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,

也就是将摄像头采集到的YUV 的数据换成 AVFrame&#xff0c;然后再次转成 AVPacket&#xff0c;那么这AVPakcet数据要怎么办呢&#xff1f;分为三种情况&#xff1a; 一种是将AVPacket存储成h264文件&#xff0c;由于h264编码器在将avframe变成avpacket的时候就是按照h264的格…

VUE+SPRINGBOOT实现邮箱注册、重置密码、登录功能

随着互联网的发展&#xff0c;网站用户的管理、触达、消息通知成为一个网站设计是否合理的重要标志。目前主流互联网公司都支持手机验证码注册、登录。但是手机短信作为服务端网站是需要付出运营商通信成本的&#xff0c;而邮箱的注册、登录、重置密码&#xff0c;无疑成为了这…

[Docker#8] 容器配置 | Mysql | Redis | C++ | 资源控制 | 命令对比

目录 一&#xff1a;Mysql 容器化安装 二&#xff1a;Redis 容器化安装 Redis 简介 Redis 容器创建 三&#xff1a;C容器制作 四&#xff1a;容器资源更新 常见问题 一&#xff1a;Mysql 容器化安装 进入 mysql 的镜像网站&#xff0c;查找 mysql 的镜像 mysql docker…