深入特权级转移

简介: 深入特权级转移

引言

  • 本章节需要自己通过实际实验来摸索 DPL、RPL、CPL 三者之间的关系,实验方式就是尝试改变不同的 DPL、RPL 的值,然后观察程序的运行状态及结果
  • 实验过程在这里就不一一记录了,建议自己摸索,这样才能较为深入的体会特权级相关知识

特权级转移小建议

  • 建议绝大多数情况下同一个类段的相关特权级保持一致,即如果代码段 DPL = 0,那么与之对应的栈段、数据段等的 DPL 也要设置为 0,又或者不要出现对应的 RPL != DPL 的情况
  • 我们在上一章节实现的 loader.asm 这个代码基础上做个小实验看一下
  • 仅将栈段描述符 STACK32_DESC 的特权级改为 3

; STACK32_DESC : Descriptor 0, TOP_OF_STACK32, DA_DRW + DA_32

STACK32_DESC : Descriptor 0, TOP_OF_STACK32, DA_DRW + DA_32 + DA_DPL3

  • 运行一下,程序并不能正确执行
  • 不是满足 CPL <= DPL 并且 RPL <= DPL 这个条件吗?怎么程序还是不能执行成功呢?
  • 原因就在于特权级 0 的代码段使用了特权级 3 的栈,CPU 肯定不会同意你这么干的
  • 所以绝大多数情况下相关特权级定义一致能够有效的避免很多错误

段的分类

  • 保护模式 中我们知道,描述符分系统描述符和非系统描述符
  • 系统段和非系统段的区分方式就是段描述符中的 S 位,系统描述符(S=0),非系统描述符(S=1)
  • 系统描述符包含 LDT,TSS 和各种门等
  • 非系统描述符其实说的就是代码段或数据段描述符
  • 对于代码段,又可以分为两类,一致性代码段和非一致性代码段
  • 那么怎么区分一致性代码段和非一致性代码段呢?
  • 见下图,段描述符中 TYPE 字段中的 C 位为 1,则为一致性代码段, C 位为 0,则为非一致性代码段
  • 说了等于没说,那么如何直观理解一致性代码段和非一致性代码段的区别的呢?
  • 在不借助调用门的情况下:
  • 非一致性代码段:代码段之间只能平级转移(CPL == DPL,RPL <= DPL)
  • 一致性代码段:支持低特权级代码段向高特权级代码段转移(CPL >= DPL),虽然可以成功转移到高特权级的代码段,但是当前特权级 CPL 不变
  • 注意:数据段只有一种,没有一致性和非一致性的区分,并且数据段不允许被低特权级的代码段访问

验证一致性代码段特性

  • 目的:验证一致性代码段是否支持低特权级代码段向高特权级代码段转移,当前特权级 CPL 是否发生改变
  • 首先我们实验所用的基础代码依旧是上面实验所用的基础代码:loader.asm
  • 原程序中 Task A(特权级 3)通过调用门跳转到特权级 0 执行打印,现在我们先把打印程序代码段属性改为一致性代码段即可
; FUNC_DESC : Descriptor 0, FUNC_SEG_LEN - 1, DA_C + DA_32
FUNC_DESC : Descriptor 0, FUNC_SEG_LEN - 1, DA_CCO + DA_32
  • Task A 中原调用门方式要改为 jmp 直接跳转
; call FUNC_PRINT_SELECTOR : 0
jmp FUNC_SELECTOR : printOffset
  • 实验结果,程序成功运行,现象与所期待的一致
  • 用反汇编方式断点调试,发现跳转后特权级并未改变,验证我们上面所说的理论

深入理解调用门

  • 调用门用于低特权级代码段向高特权级代码段转移
  • 调用门描述符的特权级低于或小于当前特权级(DPL(Gate) >= CPL)
  • 用图形的形式直观理解

  • 关于调用门的注意事项
  • 调用门支持特权级同级转移
  • 调用门同级转移被处理位普通函数调用或直接调用
  • call 通过调用门提升特权级,jmp 只能同级转移
  • 通过调用门降特权级返回(retf)时,CPU 会对目标代码段及栈段进行特权级检查;对相关段寄存器强制清零
  • 通过反汇编后断点调试,发现执行 retf 指令(特权级降低)后,相关段寄存器都被清零了,这是为什么呢?
  • 原因就是处理器为了内核数据的安全,当发生高特权级代码段向低特权级代码段转移时,CPU 会将这些寄存器全部自动清零,这样子低特权级程序就没有机会非法的访问内核数据了

IO 特权级

  • 在保护模式下,特权级检查保护机制不光体现在数据和代码的访问,还体现在 I/O 读写控制上
  • I/O 读写特权是由标志寄存器 eflags 中的 IOPL 位(bit12-bit13)和 TSS 中的 IO 位图决定的,它们用来指定执行IO 操作的最小特权级。I/O 相关的指令只有在当前特权级大于等于 IOPL 时才能执行。如果当前特权级小于 IOPL 时执行这些指令会引发处理器异常。这类指令有 in、out、cli、sti
  • CPL 为 0 的时候 I/O 操作是不受限制的
  • 做个小实验验证一下,我们在上一章节实现的 loader.asm 代码上 TASK A 中添加如下指令

mov al, 0x0A

out 0x20, al

  • 不用在乎这个指令是什么意义,知道这是 I/O 操作就可以了
  • 结果程序运行崩溃
...
(0).[16768112] [0x00002065] 0007:0000002d (unk. ctxt): out 0x20, al              ; e620
00016768112e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00016768112i[SYS  ] bx_pc_system_c::Reset(HARDWARE) called
00016768112i[CPU0 ] cpu hardware reset
  • 从打印提示中可以看出程序死在 out 指令处
  • 那么,如何才能操作 eflags 的 IOPL 位呢?
  • 可惜汇编中没有直接读写 eflags 寄存器的指令,不过可以使用如下指令迂回实现 eflags 读写操作
pushf
pop eax 
or eax, 0x3000 ; bit12-bit13:11b
push eax
popf
  • 解释一下,pushf 作用是将 eflags 寄存器入栈,再利用 pop eax 将刚刚入栈的 eflags 值弹出到 eax 寄存器中,然后改动 eax 的值,接下来 push eax 再将改动后的 eax 值入栈,最后再利用 popf 指令把改动过后的值弹出的 eflags 寄存器中
  • 接下来就将上面的指令写到 TASK A 代码中,发现还是报错了,而且通过reg 指令发现 eflags 中 IOPL 位还是 0,并没有改变,这又是怎么回事呢?
  • 只有在 0 特权下才能执行上面的指令。如果在其他特权级下执行此指令,处理器也不会引发异常,只是没任何反应
  • 于是我们再把指令复制到 CODE32_START 代码段(特权级为 0)下,这回程序运行一切正常了。Ctrl+C 强制退出程序,再用 reg 命令查看 IOPL=3
  • 最后提供一下实验完整代码:loader.asm
目录
相关文章
|
数据挖掘 数据处理 索引
如何使用Python的Pandas库进行数据筛选和过滤?
Pandas是Python数据分析的核心库,其DataFrame数据结构便于数据操作。筛选与过滤数据主要包括:导入pandas,创建DataFrame,通过布尔索引、`query()`或`loc[]`、`iloc[]`方法筛选。
346 0
|
5月前
|
人工智能 自然语言处理 Java
DeepSeek 满血版在 VScode 和 IDEA 中怎么用?手把手教程来了
沉默王二分享了通义灵码的使用教程,这款插件集成了DeepSeek-R1和Qwen等模型,支持Java、Python、Go等多种编程语言,适用于IDEA、VSCode等开发环境。它不仅能提供智能问答、代码补全和Bug修复功能,还能通过“AI程序员”实现多文件代码修改。体验流畅,算力充足,无需担心限流问题。文章详细介绍了安装步骤及各项功能的实际操作,展示了其在提升开发效率方面的强大实力。目前,通义灵码正持续优化,未来将带来更多惊喜。
656 1
ly~
|
11月前
|
存储 安全 数据库
密码管理器哪个比较好用?
介绍几款常用的密码管理器:Bitwarden功能全面、价格合理,适合个人用户;KeePass高度安全、免费开源,但数据同步不便;LastPass界面友好、跨平台支持好,曾有安全事件;1Password安全性高、用户体验佳,价格偏高;ProtonPass隐私保护强,功能实用,适合Proton生态用户。
ly~
1548 9
|
9月前
|
传感器 算法 机器人
《深度解析基于 C++的机器人操作系统(ROS)底层原理与开发之道》
在科技飞速发展的今天,机器人技术正在各个领域掀起革命。机器人操作系统(ROS)作为开源的机器人软件框架,占据着重要地位。C++作为ROS中常用的编程语言,其在ROS中的底层原理和开发方法对于机器人开发者至关重要。本文介绍了ROS的架构基础、C++在ROS中的节点和服务开发原理、参数管理以及开发方法与实践要点,帮助开发者深入了解和掌握ROS的开发技术。
621 41
|
10月前
|
存储 关系型数据库 数据库
PostGIS简介
PostGIS是PostgreSQL的扩展插件,增强其处理地理空间数据的能力,支持空间数据存储、索引、查询及分析等功能。它适用于2D和3D空间数据,提供多种几何类型和栅格数据支持,兼容多种第三方工具。安装需先配置EPEL和PowerTools仓库,然后通过DNF安装PostGIS包,并在目标数据库中启用扩展。PostGIS支持geometry、geography和raster等数据类型,适用于不同场景的空间数据分析。
545 0
|
11月前
|
传感器 人工智能 自动驾驶
未来出行新纪元:智能交通系统的崛起与影响
【10月更文挑战第13天】 本文深入探讨了智能交通系统(ITS)的发展背景、关键技术及其对社会、经济和环境的深远影响。通过对现有技术的评估和未来趋势的展望,揭示了ITS在提升交通效率、减少碳排放、增强安全性和推动经济发展方面的巨大潜力。同时,也讨论了在技术实施过程中面临的挑战和潜在的解决方案。
|
弹性计算 数据安全/隐私保护
【畅玩雾锁王国】阿里云雾锁王国服务器手动部署教程
想要部署属于自己的雾锁王国服务器(Dedicated Server),您首先需要拥有一台服务器,服务器是雾锁王国运行的基础。部署完成后,您和您的朋友便可以登入专属的游戏服进行体验。使用云服务器搭建雾锁王国服务器,便可以让您与您的朋友在一个相对独立且私密的空间中进行游戏,确保获得更加畅快的游戏体验。
643 0
|
云安全 人工智能 安全
2024云安全洞察报告:趋势与策略
随着数字化转型的逐步推进,云计算已成为企业IT基础设施的核心。然而,云环境的复杂性也带来了新的安全挑战。本文通过大量数据、案例和专家洞察,全面剖析2024年云上安全态势,并为企业提供切实可行的安全建议。
1212 0
2024云安全洞察报告:趋势与策略
|
Linux 虚拟化 云计算
虚拟化技术及实时虚拟化概述
本文探讨了实时虚拟化技术,它是虚拟化技术的一种,旨在保证严格的时间约束和高可靠性。文章介绍了虚拟化的起源、分时系统的历史以及虚拟化技术在云计算时代的复兴。内容涵盖分时系统、虚拟化技术的定义、类型(全虚拟化、半虚拟化、硬件辅助完全虚拟化和操作系统级虚拟化)及其优缺点。此外,还讨论了不同类型虚拟化技术的实现方式,如Type-1和Type-2虚拟化,以及容器技术。文章强调了实时虚拟化在工业实时控制、汽车、通信等领域的应用,并预告后续将重点讨论实时虚拟化技术。
836 0
虚拟化技术及实时虚拟化概述