修改IOPL位和IF位的四条指令

修改IOPL位和IF位的四条指令

Content #

通过将EFLAGS 寄存器的内容压入栈,局部修改后,再弹出到EFLAGS,可以间接地改变它的各种标志位。对多数标志位的修改不会威胁到整个系统的安全,但是,如果修改了IOPL 位和IF 位,就不同了。

能够修改这两个标志的指令是 popf iret cli sti 注意没有pushf指令,保存eflags到栈中,并不会改变标志位。中断应由操作系统或者内核统一管理,但cli 和sti指令不是特权指令,低特权级的程序与能调用。

对这四条指令的调用是用 IOPL 本身来控制的。如果当前特权级CPL 高于,或者和当前I/O 特权级IOPL 相同,即,在数值上 CPL <= IOPL 则允许执行以上4条指令,也允许访问所有的硬件端口。否则,执行popf 和iret 指令时,会引发处理器异常中断;执行cli 和sti 时,不会引发异常中断,但不改变标志寄存器的IF 位。

From #