[windows内核]代码段跳转实验
本次实验是为了加深对跨段跳转流程的印象
首先选一个已有的非一致代码段的段寄存器,将其复制过来,写入一个GDT表里无效的位置中,怎么区分段寄存器是否是代码段前面已经有了,这里不再重复
成功写入
之后打开R3调试器
输入汇编指令修改JMP FAR 004B:0040130C
4B是因为我们刚才修改GDT表里段寄存器的位置在第9个,RPL不变
如果成功执行那么cs和eip都会改变
我们单步一下
可以看到成功执行了
如果我们把我们修改的段寄存器DPL修改为0是否还能执行成功呢
我们来尝试一下
还是原来的位置但是DPL已经被我们修改成了00,怎么改的可以看以前分析段寄存器的文章
我们还是打开R3的调试器写入汇编JMP FAR 004B 0040130C
,和上面操作一样如果执行成功cs和eip会改变,这时候我们单步一下
可以看到主线程模块直接进入了异常,这就和我们之前说的代码段跳转流程的一致,段权限检查没有通过,因为非一致代码段 要求CPL == DPL 并且 RPL <= DPL
这里CPL=3 DPL=0 所以段权限检查失败
我们继续实验,如果这是个一致代码段的效果又会怎么样呢
怎么改就是TYPE域中的C位
我们再来重复上面的操作看是否能成功
可以看到是成功的执行了跳转,如果是一致代码段,那么是允许低权限跳转到高权限的,这里手册的3.4.5.1 中有说明
至于为什么就是我们之前说到的,在手册中5.8.1.2可以找到
实验已经做完了
大概对代码段跳转流程已经有了更深的印象。