07 段权限检查

当我们要修改一个段寄存器的时候,CPU会检查当前程序有没有权限将段描述符加载到段寄存器中。
CPU的分级:
在这里插入图片描述
我们知道段选择子分为三部分,其中0~1位为RPL,当段寄存器为CS的时候此时的RPL我们成为CPL,也就是我们当前程序的特权等级,我们下面用OD随便打开一个程序来看看它的特权等级
在这里插入图片描述
上图段选择子的0~1位都为1,所以我们这个程序处于三环。
我们打开windbg的寄存器窗口
在这里插入图片描述
从上面的CS看出为8,其CPL为0,所以是一个0环的程序。
我们知道了RPL和CPL,那我们来看一下DPL
DPL为描述符的特权级别,规定了访问该段所需要的特权级别。举个例子,如下代码:
mov ds,ax
如果ax指向的段的DPL = 0, 当前程序CPL = 3,则这行代码不会执行成功。
数据段的权限检查:
假设当前程序处于0环,也就是CPL = 0,我们执行以下代码
mov ax,000B //RPL = 1011
mov ds , ax //ax指向的段描述符DPL = 0
数据段的检测:
在数值上CPL 和 RPL都要小于等于DPL, mov ds, ax才能执行成功;
RPL存在的原因,比如我们程序对一个文件有读写权限,但是我们有的时候只需要打开文件进行读操作,这时RPL就有意义了。

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/86524085
07