_nosay 发表于 2016-01-26 23:44

用户态修改RPL疑问?

本帖最后由 _nosay 于 2016-01-26 23:48 编辑



保护模式下:
15~3: 段描述符表下标
2:       GDTR/LDTR
1~0:   RPL

由于访问GDTR/LDTR的指令是“特权指令”,所以用户态不知道段描述符在什么位置,也就不能通过修改描述符的DPL值,来降低这个段对“访问者”的权限要求。
但是,不用担心用户程序通过修改段寄存器的RPL来提升本身的权限,从而达到访问目标段的目的吗?
实模式中,可以通过通用寄存器直接给DS、ES、SS赋值,CS段寄存器,也可以通过jmp,call,ret这些指令赋值,所以如果保护模式中,也可以对这四个段寄存器间接或直接的赋值,那不是很容易就修改RPL吗?所以请问保护模式是如何保证段寄存器不被随意修改的,至少不可以把“MOV”设置为“特权指令”,难道是把相应的机器码设置成“特权指令”了吗?



http: //demo.netfoucs.com/trochiluses/article/details/19573651

nswcfd 发表于 2016-01-27 15:02

1. mov普通寄存器和mov段寄存器的opcode的确不一样。

2. 除了rpl,dpl也在保护模式的访问控制中起作用。

以下摘自Intel手册

IF DS, ES, FS, or GS is loaded with non-NULL selector
THEN
IF segment selector index is outside descriptor table limits
or segment is not a data or readable code segment
or ((segment is a data or nonconforming code segment)
or ((RPL > DPL) and (CPL > DPL))
THEN #GP(selector); FI;
IF segment not marked present
THEN #NP(selector);
ELSE
SegmentRegister ← segment selector;
SegmentRegister ← segment descriptor; FI;
FI;

_nosay 发表于 2016-01-27 16:16

nswcfd 发表于 2016-01-27 15:02 static/image/common/back.gif
1. mov普通寄存器和mov段寄存器的opcode的确不一样。

2. 除了rpl,dpl也在保护模式的访问控制中起作用。 ...

@nswcfd 我要跟你做朋友 {:qq13:}。

nswcfd 发表于 2016-01-28 11:09

:lol

硬件手册多看看没有坏处

_nosay 发表于 2016-01-28 11:34

nswcfd 发表于 2016-01-28 11:09 static/image/common/back.gif
硬件手册多看看没有坏处

嗯,是的,我也知道这样的问题肯定能从手册找到答案,但是经验还没积累到位,不会确定答案在手册的哪些部分,所以就优先来问大活人了,这样整个学习进度可能会快一点,这也正是除了手册,还有论坛和社区的意义吧,以后多多指点噢 {:qq13:} 。
页: [1]
查看完整版本: 用户态修改RPL疑问?