在this question中,我了解到在不在0环时尝试运行特权指令可能会导致用户进程中看起来像segfault
,并且我有两个后续问题。
答案 0 :(得分:2)
通读指令集参考,并查看列出非内存问题#GP
的位置。不完整列表:CLI
,CLTS
,HLT
,IN
,INT
(带有无效的向量),INVD
,INVLPG
,IRET
(在某些情况下),LDMXCSR
(设置保留位),LGDT
,LIDT
,LLDT
,LMSW
,{{1} },LTR
(包含MONITOR
),ECX != 0
(至MOV
或CRx
),DRx
(无效MWAIT
) ,ECX
,OUT
,RDMSR
,RDPMC
,SWAPGS
,SYSEXIT
,SYSRET
,WBINVD
,{ {1}}(无效WRMSR
),XGETBV
,ECX
答案 1 :(得分:-1)
它始终是无效的内存引用,但是,您可能会想到MOV指令从/向无效的内存位置加载或保存数据。
事实是任何访问任何“错误”的内存位置都会产生错误。因此,如果你JMP或CALL到一个无效的地址,你会得到相同的结果。如果你从一个错误的内存位置添加,同样的问题。
但请注意,LEA指令实际上并不访问它生成的内存指针,因此不会产生此类错误。
如果堆栈指针现在出错,处理堆栈的指令也可能会出现SEGV,因此POP,PUSH,CALL或RET等指令也会产生这些错误(如果是CALL,即使目标地址是如果您无意中炸掉了堆栈内容,RET会执行此操作...认为缓冲区溢出。)
最后,你的IP地址可能会出错,因为程序永远不会返回,而另一条指令的下一个位置也会在la la land ...也可能产生一个SEGV。如果你编写了正确的代码,就不会发生这种情况(即确保在所有函数的末尾都有一个RET,加上汇编程序倾向于将INT 3添加为填充,这样你的代码就会破坏,而不是继续下一步。 ..)