JMP FAR实现跨段跳转

本文主要通过理论和实验,验证JMP FAR跨段跳转。

1.指令分析

JMP 0x20:0x004183D7
上面是一条 JMP FAR 指令,FAR根据地址格式自动添加,如果是:JMP 0x004183D7就只修改EIP,如果是 JMP 0x20:0x004183D7就同时修改CS和EIP,查不查表是由指令格式决定的,0x20就是段选择子,通过段选择子的index查GDT的gdt[index]获取段描述符,CPU执行该指令分为以下5步:

(1)拆分段选择子

0x20 = 00100 0 00
RPL = 0
TI = 0
INDEX = 4


(2)查GDT表得到段描述符

根据段选择子拆得的下标,找到GDT表第5项。如果P=1,S=1,TYPE高1位=1,则表明这是一个代码段,就可以进行下一步。

(3)权限检查

TYPE域高2位是C属性,C=0表示非一致代码段,C=1表示一致代码段。
如果是非一致代码段,要求:CPL == DPL 并且 RPL <= DPL;
如果是一致代码段,要求:CPL >= DPL。

(4)加载段描述符

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

(5)执行代码

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

2.实验操作

1.启用双击调试环境
2.在WinDbg查看系统段

kd> r gdtr
gdtr=8003f000
kd> dq 8003f000
8003f000  00000000`00000000 00cf9b00`0000ffff
8003f010  00cf9300`0000ffff 00cffa00`0000ffff
8003f020  00cff300`0000ffff 80008b04`200020ab
8003f030  ffc093df`f0000001 0040f300`00000fff
8003f040  0000f200`0400ffff 00000000`00000000
8003f050  80008954`b1000068 80008954`b1680068
8003f060  00009302`2f40ffff 0000920b`80003fff
8003f070  ff0092ff`700003ff 80009a40`0000ffff

3.进入windows系统打开OD,随便加载一个exe,在上面找到:00cffa00`0000ffff段,RPL可以取00或11,TI=0,INDEX=00011,所以段选择子可以取0x18或0x1B.为了看到清晰的变化,我们选0x18

4.执行:JMP 0x18:0x12345678 ,然后观察EIP和CS变化

5.执行结果:EIP=0x12345678 但是CS并没有变化,原因可能是:可能OD认为CS寄存器指向的段没有改变(1B和18的区别是RPL,但是在GDT里是同一个地方),所以就没更新
6.在WinDbg中修改段8003f048 的值为 00cffa000000ffff,执行:eq 8003f048 00cffa000000ffff

kd> eq 8003f048 00cffa00`0000ffff
kd> dq 8003f000
8003f000  00000000`00000000 00cf9b00`0000ffff
8003f010  00cf9300`0000ffff 00cffb00`0000ffff
8003f020  00cff300`0000ffff 80008b04`200020ab
8003f030  ffc093df`f0000001 0040f300`00000fff
8003f040  0000f200`0400ffff 00cffa00`0000ffff
8003f050  80008954`b1000068 80008954`b1680068
8003f060  00009302`2f40ffff 0000920b`80003fff
8003f070  ff0092ff`700003ff 80009a40`0000ffff

7.修改段选择子为0x48
8.在OD中执行:JMP 0x48:0x12345678,我们发现此时EIP=0x12345678,CS=4B(并没有改为4B,这个不太清楚是怎么回事儿, 但时CS确实改变了,说明JRM FAR可以实现跨段跳转)

3.总结:

(1)对于一致代码段:也就是共享的段
特权级别高的程序不允许访问特权级别低的数据:核心态不允许访问用户态的数据
特权级别低的程序可以访问到特权级别高的数据,但特权级别不会改变:系统调用,用户态还是用户态
(2)对于普通代码段:也就是非一致代码段,(windows只使用了非一致代码段)
只允许同级访问
绝对禁止不同级别的访问:核心态不允许访问用户态,用户态也不允许访问核心态
(3)直接对代码段进行JMP或者CALL的操作,无论目标是一直代码段还是非一致代码段,CPL都不会发生改变,如果要提升CPL的权限,只能通过调用门





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章