代码段数据段的划分

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会有处理机制自动帮助我们纠错

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML5+CSS前端开发【保姆级教学】+前端介绍和软件安装

学习了基础编程刚刚开始学习计算机的程序员&#xff0c;你是否会这样的想法:前端和后端是什么呢&#xff1f;如果你是刚上大学的大一大二基础小白&#xff0c;但是身边的卷王同学已经超前知道之后要从事前后端开发了&#xff0c;并且在学习各种框架的课程&#xff0c;Aahhahah,…

【Rabbitmq篇】RabbitMQ⾼级特性----消息确认

目录 前言&#xff1a; 一.消息确认机制 • ⾃动确认 • ⼿动确认 手动确认方法又分为三种&#xff1a; 二. 代码实现&#xff08;spring环境&#xff09; 配置相关信息&#xff1a; 1&#xff09;. AcknowledgeMode.NONE 2 &#xff09;AcknowledgeMode.AUTO 3&…

QT入门之下载、工程创建、学习方法

1.QT下载链接 因为我的是下载在LINUX上面&#xff0c;所以这里提供LINUX平台下的下载方式&#xff1a; wget http://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run 赋予可执行权限&#xff0c;加上 sudo 权限进入安装&#xff0c;这样会安装在…

初识Linux—— 基本指令(上)

前言 Linux简述 ​ Linux是一种开源、自由、类UNIX的操作系统&#xff0c;由著名的芬兰程序员林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。Linux的内核在GNU通用公共许可证&#xff08;GPL&#xff09;下发布&#xff0c;这意味着任何人都可以自由…

劳动力市场

1.劳动力市场概述 &#xff08;1&#xff09;劳动力&#xff1a;所有有工作能力且愿意工作的人的总称&#xff0c;由那些正在工作&#xff08;就业&#xff09;和正在寻找工作&#xff08;失业&#xff09;的人组成&#xff0c;表示为&#xff1a;L&#xff08;劳动力&#xf…

PHP代码审计 --MVC模型开发框架rce示例

MVC模型开发框架 控制器Controller&#xff1a;负责响应用户请求、准备数据&#xff0c;及决定如何展示数据 模块Model&#xff1a;管理业务逻辑和数据库逻辑&#xff0c;提供链接和操作数据库的抽象层 视图View&#xff1a;负责前端模板渲染数据&#xff0c;通过html呈现给用户…

Dify 通过导入 DSL 文件创建 Workflow 过程及实现

本文使用 Dify v0.9.2 版本&#xff0c;主要介绍 Dify 通过导入 DSL&#xff08;或 URL&#xff09;文件创建&#xff08;或导出&#xff09;Workflow 的操作过程及源码分析实现过程。Dify通过导入DSL文件创建Workflow过程及实现&#xff1a;https://z0yrmerhgi8.feishu.cn/wik…

Redis五大基本类型——List列表命令详解(命令用法详解+思维导图详解)

目录 一、List列表类型介绍 二、常见命令 1、LPUSH 2、LPUSHX 3、RPUSH 4、RPUSHX 5、LRANGE 6、LPOP 7、RPOP 8、LREM 9、LSET 10、LINDEX 11、LINSERT 12、LLEN 13、阻塞版本命令 BLPOP BRPOP 三、命令小结 相关内容&#xff1a; Redis五大基本类型——Ha…

有序数组的平方(leetcode 977)

一个数组&#xff0c;返回一个所有元素的平方之后依然是一个有序数组。&#xff08;数组中含负数&#xff09; 解法一&#xff1a;暴力解法 所有元素平方后再使用快速排序法重新排序&#xff0c;时间复杂度为O(nlogn)。 class Solution { public:vector<int> sortedSqu…

调用门提权

在我写的2.保护模式&#xff0b;段探测这篇文章中&#xff0c;我们提到了S位对于段描述符的控制&#xff0c;之前我们已经介绍了代码段和数据段&#xff0c;现在我们来把目光转到系统段 在这么多中结构里面&#xff0c;我们今天要介绍的就是编号为12的&#xff0c;32位调用门 结…

Web Service 学习笔记

Web Service 学习笔记 Web Service 基本概念 Web Service 即 web 服务&#xff0c;它是一种跨编程语言和跨操作系统平台的远程调用技术。 Java 中共有三种 Web Service 规范&#xff1a; JAX-WS(JAX-RPC): 基于 xml 数据JAXM&SAAJJAX-RS&#xff1a;基于 xml 或 json 数…

爬虫——JSON数据处理

第三节&#xff1a;JSON数据处理 在爬虫开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;是最常见的数据格式之一&#xff0c;特别是在从API或动态网页中抓取数据时。JSON格式因其结构简单、可读性强、易于与其他系统交互而广泛应用于前端与后端的数…

计算机编程中的设计模式及其在简化复杂系统设计中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的…

【Tealscale + Headscale + 自建服务器】异地组网笔记

文章目录 效果为什么要用 Headscale云服务器安装 Headscale配置 config.yaml创建反向代理搭建管理 UI授权管理 UI添加互联设备参考 效果 首先是连接情况&#xff0c;双端都连接上自建的 Headscale&#xff0c; 手机使用移动流量&#xff0c;测试一下 ping 值 再试试进入游戏 可…

单片机学习笔记 2. LED灯闪烁

目录 0、实现的功能 1、Keil工程 2、代码实现 0、实现的功能 LED灯闪烁 1、Keil工程 闪烁原理&#xff1a;需要进行软件延时达到人眼能分辨出来的效果。常用的延时方法有软件延时和定时器延时。此次先进行软件延时 具体操作步骤和之前的笔记一致。此次主要利用无符号整型的范…

【Cesium】自定义材质,添加带有方向的滚动路线

【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f356; 前言&#x1f3b6;一、实现过程✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f3b6;一、…

Vue之插槽(slot)

插槽是vue中的一个非常强大且灵活的功能&#xff0c;在写组件时&#xff0c;可以为组件的使用者预留一些可以自定义内容的占位符。通过插槽&#xff0c;可以极大提高组件的客服用和灵活性。 插槽大体可以分为三类&#xff1a;默认插槽&#xff0c;具名插槽和作用域插槽。 下面…

从零开始深度学习:全连接层、损失函数与梯度下降的详尽指南

引言 在深度学习的领域&#xff0c;全连接层、损失函数与梯度下降是三块重要的基石。如果你正在踏上深度学习的旅程&#xff0c;理解它们是迈向成功的第一步。这篇文章将从概念到代码、从基础到进阶&#xff0c;详细剖析这三个主题&#xff0c;帮助你从小白成长为能够解决实际…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

【C++】vector 类模拟实现:探索动态数组的奥秘

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; 如果你对string&#xff0c;vector还存在疑惑&#xff0c;欢迎阅读我之前的作品 &#xff1a; 之前文章&#x1f525;&#x1f52…