本节内容
通过JMP FAR指令修改CS段寄存器
要点回顾
在上一节课种重点介绍了JMP 0x20:0x004183D7
跨段跳转的五个步骤,分别是:
1、段选择子拆分
2、查表得到段描述符
3、权限检查
4、加载段描述符
5、代码执行
1、构造段描述符
找一个非一致代码段描述符,复制一份,写入到GDT表中
kd> r gdtr
gdtr=8003f000
kd> dq 8003f000
8003f000 0000000000000000 00cf9b00
0000ffff
8003f010 00cf93000000ffff 00cffb00
0000ffff
8003f020 00cff3000000ffff 80008b04
200020ab
8003f030 ffc093dff0000001 0040f300
00000fff
8003f040 0000f2000400ffff 00000000
00000000
8003f050 80008954b1000068 80008954
b1680068
8003f060 000093022f40ffff 0000920b
80003fff
8003f070 ff0092ff700003ff 80009a40
0000ffff
将 00cffb000000ffff 数据写如某个P位为0的位置 kd> eq 8003f048 00cffb00
0000ffff(用内核工具查看新增是否成功)
2、OD中进行测试
在OD中,执行跨段跳转 JMP FAR 004B:0041840D
3、修改段描述符的权限级别,并再次在OD中进行测试
将00cffb000000ffff 改为00cf9b00
0000ffff
在OD中,执行跨段跳转 JMP FAR 004B:0041840D
4、将该段描述符的属性更改为一致代码段.
将00cffb000000ffff 改为00cf9f00
0000ffff
在OD中,执行跨段跳转 JMP FAR 004B:0041840D
5、总结:
1、为了对数据进行保护,普通代码段是禁止不同级别进行访问的。用户态的代码不能访问内核的数据,同样,内核态的代码也不能访问用户态的数据.
2、如果想提供一些通用的功能,而且这些功能并不会破坏内核数据,那么可以选择一致代码段,这样低级别的程序可以在不提升CPL权限等级的情况下即可以访问.
3、如果想访问普通代码段,只有通过“调用门”等提示CPL权限,才能访问。
6、课后练习:
自己动手实现代码跨段访问.