【Windows内核】(5) 代码跨段跳转

代码跨段跳转

一、前言

段寄存器:

ES,CS,SS,DS,FS,GS,LDTR,TR

段寄存器读写:

除CS外,其他的段寄存器都可以通过MOV,LES,LSS,LDS,LFS,LGS指令进行修改

CS为什么不可以直接修改呢?

CS是代码段 CS的改变意味着EIP的改变,改变CS的同时必须修改EIP,所以我们无法使用上面的指令来进行修改

二、代码间的跳转(段间跳转 非调用门之类的)

段间跳转,有2种情况,即要跳转的段是一致代码段还是非一致代码段

同时修改CS与EIP的指令

JMP FAR / CALL FAR / RETF / INT /IRETED

注意:

只改变EIP的指令

JMP / CALL / JCC / RET

三、代码间的跳转(段间跳转 非调用门之类的) 执行流程

JMP 0x20:0x004183D7 CPU如何执行这行代码?

(1) 段选择子拆分

0x20 对应二进制形式 0000 0000 0010 0000

RPL = 00

TI = 0

Index = 4

(2) 查表得到段描述符

TI = 0 所以查GDT表

Index = 4 找到对应的段描述符

四种情况可以跳转:代码段、调用门、TSS任务段、任务门

(3) 权限检查

如果是非一致代码段,要求:CPL == DPL 并且 RPL <= DPL

(4) 加载段描述符

通过上面的权限检查后,CPU会将段描述符加载到CS段寄存器中.

(5) 代码执行

CPU将 CS.Base + Offset 的值写入EIP 然后执行CS:EIP处的代码,段间跳转结束.

练习

非一致代码段跳转:

跳转过程:

1.段选择子拆分 4b : Index--9 TI--0 RPL --3

2.段描述符 Index --9 --00cffb00`0000ffff --> 代码段的非一致代码段 DPL--3

3.权限检查 非一致代码段--CPL == DPL 并且 RPL <= DPL CPL=3 DPL=3 RPL=3 检查通过

4.加载段描述符 跳转

一致代码段跳转:

跳转过程:

1.段选择子拆分 4b : Index--9 TI--0 RPL --3

2.段描述符 Index --9 --00cfff00`0000ffff --> 代码段的一致代码段 DPL--3

3.权限检查 如果是一致代码段,要求:CPL >= DPL CPL=3 DPL=3 检查通过

4.加载段描述符 跳转

总结

对于一致代码段:也就是共享的段

□ 特权级高的程序不允许访问特权级低的数据:核心态不允许访问用户态的数据

□ 特权级低的程序可以访问到特权级高的数据,但特权级不会改变:用户态还是用户态

对于普通代码段:也就是非一致代码段

□ 只允许同级访问

□ 绝对禁止不同级别的访问:核心态不是用户态,用户态也不是核心态.

​ 直接对代码段进行JMP 或者 CALL的操作,无论目标是一致代码段还是非一致代码段,CPL都不会发生改变.如果要提升CPL的权限,只能通过调用门.

posted @ 2021-03-08 09:48  一窝吉尼斯  阅读(207)  评论(0)    收藏  举报