本帖最后由 dragon 于 2021-05-15 17:22 编辑
前言所有保护模式索引链接:逆向脱壳之保护模式学习一 保护模式介绍 先前学习了段描述符的结构,这次来补充段描述符结构中的DPL(特权等级)相关的内容 段权限检查CPU权限分级在补充段权限检查之前,要了解CPU的权限分级 
- 处理器的段保护机制定义了RING0,RING1,RING2,RING3一共4个特权级别
- 大多数现代操作系统将0级用于内核/可执行程序,将3级用于应用程序
- 可用于级别n的任何资源也可用于级别0到n,因此特权级别是环
- 当特权较低的进程尝试访问特权较高的进程时,将向操作系统报告常规保护错误异常
- 8086中的实模式程序在级别0(最高特权级别)上执行,而8086中的虚拟模式在级别3执行所有程序
- 多数现代x86内核仅使用两个特权级别,即RING0和RING3

内核层在内核模式下,CPU可以执行其体系结构允许的任何操作。可以执行任何指令,启动任何I / O操作,访问任何内存区域,使用特权指令,控制中断、修改页表、访问设备等等 应用层硬件会对CPU操作施加某些限制。通常,某些指令是不允许的(尤其是那些指令(包括I / O操作)可能会改变机器的全局状态),某些内存区域无法访问等。CPU的用户模式功能通常是这些指令的子集可以在内核模式下使用,但是在某些情况下,例如非本机体系结构的硬件仿真,它们可能与标准内核模式下的可用软件有显着差异
应用层切换内核层应用程序的代码运行在最低运行级别上ring3上,不能做受限操作 如果要做受限操作,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成之后再从ring0返回ring3。这个过程也称作用户态和内核态的切换
CPU权限分级的作用RING设计的初衷是将系统权限与程序分离出来,使之能够让OS更好的管理当前系统资源,也使得系统更加稳定 举个很常见的例子: 普通的应用程序崩溃一般是程序未响应或者停止运行,并不会影响系统的正常运行 但当驱动程序出现问题后,动辄 BSOD (蓝屏死机)
判断程序特权级别了解了CPU的权限分级后,再来了解 如何查看程序处于几环 这涉及到了CPL(Current Privilege Level) :当前特权级别 CPL是段寄存器CS和SS的段选择子的后两位 在逆向脱壳之保护模式学习三 段描述符和段选择子中已经说明了段选择子的结构 
对比可知,当段寄存器为CS和SS时,其段选择子的RPL就是CPL
通过OD附加应用程序后查看其段寄存器: 

根据CS和SS的段选择子可以得到CPL为3,印证了应用程序的CPU权限分级为RING3
EPL(有效特权级别)上面提到了CPL(当前特权级别)和RPL(请求特权级别) 所谓的有效特权级别EPL(Effective Privilege Level),顾名思义就是最终的确定可否执行的特权 EPL = max(RPL,CPL) 即 EPL 等于 RPL和CPL的最大值,EPL为RPL和CPL中较低的权限
DPL(描述符特权级别)关于DPL,在逆向脱壳之保护模式学习四 段描述符结构中已经略微说明了,现在展开细说 DPL的作用DPL存储在段描述符中,规定了访问该段所需要的特权级别是什么;即 如果想要加载某个段描述符,就必须具备对应的特权级别 DPL权限检查当加载一个段描述符时,首先CPU要判断其P位(有效位),如果该段描述符有效,则继续进行DPL权限检查 所谓的DPL权限检查 就是 判断 DPL是否满足:EPL=max(RPL,CPL)<=DPL是否成立 只有当EPL<=DPL时,权限检查才通过,段描述符才能够被加载到段寄存器中

总结
|