[转载]x86 控制转移权限检查精要

一、       直接转移(far call及  far jmp)

直接转移通过执行一条 call 或 jmp指令,在段内转移不需selector近跳转,段间转移通过selector(不带gate或  tss)远跳转,CPL不改变。

权限检查的4个要素:

★ CPL:当前运行级别(也就是CS.CPL)

★ RPL:门符选择子(RPL for code descriptor)

★ DPL:门符DPL(DPL of code descriptor)

★ nonconforming/conforming:目标代码段类型(C flag of code segment descriptor)

权限的检查:

●    当 nonconforming时:CPL == DPL且 RPL <= DPL

●    当 conforming时:仅需 CPL >= DPL

注意事项:

★可直接转移到conforming 类型的高权限代码。

★转移后CPL不会改变。

二、   使用call gate进行控制权的转移

使用call gate进行转移控制,目的是建立一个利用gate进行向高权限代码转移的一种保护机制。gate符相当一个进入高权限代码的一个通道。

权限检查的5个要素:

★ CPL:当前运行级别(也就是CS.CPL)

★ RPL:门符选择子(RPL for call gate descriptor)

★ DPLg:门符DPL(DPL of call gate descriptor)

★ DPLs:目标代码段DPL(DPL of descstination code segment descriptor)

★ nonconforming/conforming:目标代码段类型(C flag of descstination code segment descriptor)

1、             使用call访问门符时:

●    CPL <= DPLg 且 RPL <= DPLg

●    当 nonconforming时:CPL >= DPLs

●    当 conforming 时:CPL >= DPLs

2、             使用jmp访问门符时:

●    CPL <= DPLg 且 RPL <= DPLg

●    当nonconforming 时:CPL == DPLs

●    当 conforming 时:CPL >= DPLs

注意事项:

★仅有使用 call 才能转到高权限的nonconforming code segment

★仅有使用 call 转到高权限nonconforming code segment时,才改变CPL并且发生stack切换。

★当使用call或jmp转到高权限conforming code segment时,不会改变CPL并且不发生  stack切换。

----------------------------------------------------

Conforming and Non-Conforming Code Segments

Non-conforming code segments are far more common than conforming code segments. The definitions of both follow:

  • Non-Conforming (you must match me). A code segment with C = 0 is a non-conforming code segment. Code in a non-conforming code segment can only be jumped to or called by programs whose CPL matches the target code segment‘s DPL (i.e., CPL = DPL).
  • Conforming (I‘ll lower myself to your level). A code segment with C = 1 is a conforming code segment. Code in a conforming code segment can be jumped to or called by programs whose CPL is the same as or less privileged than the target segment‘s DPL. Furthermore, the processor then executes the code in the conforming code segment at the same privilege level as that of the program that called it. In other words, the code in the conforming code segment "conforms to" or assumes the privilege level of the program that called it. The CPL remains the same as that of the calling program.

As an example, if the CPL of the currently executing program = 2, it may successfully call or jump to one of the following:

  • a non-conforming code segment with a DPL = CPL of the calling program (in other words, the DPL = 2).
  • a conforming code segment with a privilege level (i.e., a DPL) of 0, 1 or 2.

It cannot jump to or call code in either of the following without causing a GP exception:

  • a non-conforming code segment with a DPL | its CPL (in this case, privilege level two).
  • a conforming code segment with a privilege level (i.e., a DPL) of 3.
时间: 2024-10-10 08:50:59

[转载]x86 控制转移权限检查精要的相关文章

[转载]x86控制转移及相关的权限检查

■ 数据访问时的权限check 一. 访问data segment时(ds.es.fs 及gs) 1. 程序指令要访问数据时,data segment selector 被加载进 data segment register(ds.es.fs 和 gs)前,处理器会进行一系列的权限检查,通过了才能被加载进入segment register.处理器分为两步进行检查: ★ CPL(当前程序运行的权限级别)与RPL(位于selector中的 RPL)作比较,并设置有效权限级别为低权限的一个. ★ 得出的

通过调用门进行控制转移 ——《x86汇编语言:从实模式到保护模式》读书笔记29

通过调用门进行控制转移 1. 关于堆栈切换 如果通过调用门把控制转移到了更高特权级的非一致代码段中,那么CPL就会被设置为目标代码段的DPL值,并且会引起堆栈切换.为什么要切换堆栈呢?原因有以下几点: 1. 因为栈段的特权级必须同CPL保持一致: 2. 防止高特权级程序由于栈空间不足而崩溃: 3. 防止低特权级程序通过共享的栈有意或无意地干扰高特权级程序. 为了切换栈,每个任务除了自己的固有栈之外,还必须额外定义一套或多套栈,具体是多少取决于任务的特权级别. 0特权级的任务不需要额外的栈,因为除

[转载]x86 的 TSS 任务切换机制

segment descriptors 构建保护模式下的最基本.最根本的执行环境.system descriptors 则构建保护模式下的核心组件: 1.TSS descriptor 提供硬件级的进程切换机制 2.LDT descriptor 供进程使用多个 descriptor 3.Gate descriptor 提供 processor 权限级别的切换机制. 5.7.1. TSS 提供的进程切换机制 TSS 是一段内存区域,存放进程相关的执行环境信息.初始化的 TSS 是由用户提供,进程切换

第七章.控制转移语句

控制转移语句 控制转移语句改变你代码的执行顺序,通过它你可以实现代码的跳转.Swift有四种控制转移语句. continue break fallthrough return 我们将会在下面讨论continue ,break,和fallthrough语句.return语句将会在函数章节讨论. Continue continue告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代.就好像在说“本次循环迭代我已经执行完了”,但是并不会离开整个循环体. 注意:在一个for-condition-in

MVC5+EF6 入门完整教程12--灵活控制Action权限

大家久等了. 本篇专题主要讲述MVC中的权限方案. 权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一. 前面的系列文章中我们用到了 SysUser, SysRole, SysUserRole 这几个示例表. 我们以此为基础,完成RBAC (基于角色的控制) 的核心功能. 在此给出我的最佳实践,最终的效果是针对任意一个Action或Controller,都可以根据配置的角色来控制访问权限. 完成此核心功能后,可以再往两方面扩展常用功能: 1. 可以根据 组织/用户/角色 的并集来控

MVC用户登陆验证及权限检查(Form认证)

1.配置Web.conf,使用Form认证方式 <system.web> <authentication mode="None" /> <compilation debug="true" targetFramework="4.6.1" /> <httpRuntime targetFramework="4.6.1" /> <authentication mode="

Mysql 权限检查

权限检查 权限存储在mysql库的user, db, tables_priv, columns_priv, and procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中. 用户信息存储在mysql.user表.安装时默认只有超级用户root(如果不创建匿名用户). mysql> desc mysql.user; +------------------------+-----------------------------------+------+-----+--------

(笔记)Mysql命令grant on:增加新用户并控制其权限

grant on命令用于增加新用户并控制其权限. grant on命令格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”; 1) 增加一个用户test1,密码为abc,让他可以在任何主机上登录,并对所有数据库有查询.插入.修改.删除的权限.首先用root用户连入MYSQL,然后键入以下命令:    grant select,insert,update,delete on *.* to [[email protected]”%][emai

SQL Server 2005 控制用户权限访问表

转自:http://www.cnblogs.com/gaizai/archive/2011/07/14/2106617.html 一.需求 在管理数据库过程中,我们经常需要控制某个用户访问数据库的权限,比如只需要给这个用户访问某个表的权限,甚至是CRUD的权限,更小粒度的还可以去到某几个字段的访问权限.写这篇文章就是说明下这个操作过程. 其实这只是SQL Server权限管理很简单的一小块,有些地方并没有深入理解和讲述,只是希望对一些刚入门的童鞋有帮助,其它大侠就当是:我当堂吓一跳,然后得啖笑.