手动更改 RFLAGS 寄存器
Manual alteration of RFLAGS register
根据维基百科,RFLAGS 寄存器在 x64 架构中包含一些特殊值,例如保留值和 I/O 特权级别。我想知道是否可以将状态寄存器压入堆栈,修改它然后将其弹回。
我也怀疑操作系统是否可以阻止这种情况,或者它们是否允许这种篡改。我在想这样的事情:
pushfq # pushing onto the stack
pop rax # loading the value in rax
xor rax, 0xcafebabe # performing some random operation
push rax # pushing the brand new RFLAGS
popfq # popping it back
是的,你可以做到。但是,如果您在没有足够特权的情况下更改特权标志,则不会修改相关标志。具体规则有点复杂,详见manual
根据维基百科,RFLAGS 寄存器在 x64 架构中包含一些特殊值,例如保留值和 I/O 特权级别。我想知道是否可以将状态寄存器压入堆栈,修改它然后将其弹回。
我也怀疑操作系统是否可以阻止这种情况,或者它们是否允许这种篡改。我在想这样的事情:
pushfq # pushing onto the stack
pop rax # loading the value in rax
xor rax, 0xcafebabe # performing some random operation
push rax # pushing the brand new RFLAGS
popfq # popping it back
是的,你可以做到。但是,如果您在没有足够特权的情况下更改特权标志,则不会修改相关标志。具体规则有点复杂,详见manual