Windows内核基础知识-4-权限级别
这里牵扯到三个东西:
1 段选择子里的RPL(请求权限级别 Request Authority Level)
2 段描述符里的DPL(段权限级别 Authority Level):
3:CPL(Current Authority Level)当前请求权限级别
CPL和RPL都是属于段选择子里的最低两位,只是在cs和ss段中是CPL,在别的段寄存器里就是RPL。CS和SS的CPL值一定相等。
请求级别
x86处理器里面有0 1 2 3四种权限级别:数字越小特权越高。Windows只采用了0和3,也就是0环和3环。
如何分析指令实在哪一种特权级别里面跑:
根据指令里的段寄存器不同又分不同的情况:
普通数据段ds、堆栈数据段、代码段。
当处于堆栈数据段ss和代码段cs时,CPL,DPL,RPL三个必须值相同,要么都为3要么都为0.
普通数据段:
RPL(请求权限级别):当前办事情的身份
DPL(段权限级别):去办什么权限的事情
CPL(当前权限级别):真实的身份
也就是说DPL其实是最终的考验,如果RPL小了,或者CPL也小了就不行
只有 CPL>=DPL && RPL >= CPL才行。
提权测试
RPL:可以通过查看段选择子
DPL:可以通过查看段描述符
CPL:可以通过查看CS和SS的RPL
RPL:可以通过除了CS,SS和GS的寄存来找
DPL:可以通过CS/SS寄存器来找
其实就用提高RPL和CPL就行了,DPL就像是一个写实的,然后用RPL和CPL来和DPL比较。
提高RPL
这里我们通过修改DS段的RPL来提高代码的RPL
这样就提高了RPL的权限了,就从3提高到了0。
提高CPL
通过提高RPL的办法不行,不能直接mov赋值给SS,CS寄存器。
但是可以通过jmp,call等修改CS:IP指令地址的方式来修改CS的段选择子也不行。所以CPL暂时无法解决。
得用CPU的选择们才行。