大神论坛

找回密码
快速注册
查看: 746 | 回复: 0

[语言编程类] 逆向脱壳之保护模式学习五 段权限检查

主题

帖子

13

积分

初入江湖

UID
38
积分
13
精华
威望
26 点
违规
大神币
68 枚
注册时间
2021-05-03 08:20
发表于 2021-05-15 17:22
本帖最后由 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时,权限检查才通过,段描述符才能够被加载到段寄存器中




总结

返回顶部