据我所知,当我们想要访问堆栈段时,描述符的DPL应该等于
MAX(RPL,CPL)
其中RPL是SS段寄存器,CPL表示当前特权级别。
我们可以通过使用RPL削弱我们的CPL来访问弱势群体吗? 例如,CP段= 0,SS段寄存器的RPL = 3。所以我们应该能够访问PL 3的堆栈。这是真的吗?
答案 0 :(得分:2)
没有
英特尔SDM的第5.7节是明确的
当SS寄存器加载了堆栈段的段选择器时,也会发生权限级别检查 此处与堆栈段相关的所有权限级别必须与CPL匹配;也就是说,CPL,堆栈段选择器的RPL和堆栈段描述符的DPL必须相同。 如果RPL和DPL不相等 对CPL,生成一般保护异常(#GP)。
基本原理是,出于安全原因,特权代码无法与非特权代码共享堆栈 - 每个特权都有自己的堆栈,如TSS中所定义。
您可以使用数据段寄存器访问堆栈(例如通过ds
),在这种情况下,必须具有 max(CPL,RPL)< = DPL (削弱的CPL是仍然比该段的DPL更多或同等特权。)