用于购买腾讯所有业务及游戏道具
充值游戏点券驰骋游戏世界
开通包月服务,享受精彩在线生活
当我们用汇编读写某一个地址时:
注意:GS 一走调试就必须进0环进0环后被内核清空
3、段描述符与段选择子
GDT(全局描述符表)和LDT(局部描述符表)
当我们执行类似MOV DS,AX指令时CPU会查表,根据AX的值来决定查找GDT还是LDT、查找表的什么位置、查多少数据
2)gdtr寄存器:存放GDT的位置和GDT的大小
GDT表里存放的数据就是段描述符,段描述符有8个字节64位结构如下
S=1是代码或数据段描述符
当S=1时根据Type区分是代码段还是数据段,如下表
S=0是系统段描述符系统描述符有如下类型
段描述符与段寄存器的对应关系
如果G=0,则在余下高位补0则最高为000FFFFF;如果G=1,则在余下高位补1则最高为FFFFFFFF
16位嘚段描述符,该描述符指向了定义该段的段描述符结构如下
0x0023二进制为 0000 0000 0010 0011
Index:0000 0000 0010 0 查GDT的第4个
Base31:24 0000 0000
Base23:16 0000 0000
第二,S=1说明是代码段或数据段
第四,DPL=RPL 如果CPL<=DPL(CPL后面介紹)则可以将GDT中的这个段描述符加载到段寄存器DS中
7)除了MOV指令我们还可以使用LES、LSS、LDS、LFS、LGS指令修改寄存器.
CS不能通过上述的指令进行修改,CS为代码段CS的改变会导致EIP的改变,要改CS必须要保证CS与EIP一起改。
4、段描述符的D/B位
情况一:对CS段的影响
前缀67 改变寻址方式
情况二:对SS段的影响
情况三:向下拓展的数据段
低两位为11说明当前程序为ring3的。
DPL存储在段寄存器中规定了访问该段所需要的特权级别,描述的是访问这個段需要什么权限
如果AX指向的段DPL=0,当前程序的CPL=3则这条指令会执行失败。
RPL是针对段选择子而言的每个段的选择子都有自己的RPL,描述的昰用什么权限去访问一个段
指向的是同一个段描述符,但RPL是不一样的
假设当前的程序处于ring0,也就是CPL=0
8、代码间的跳转(段间跳转)
同时修改CS和EIP的指令
指令格式 JMP 段选择子:要跳转的地址
第一步拆分段选择子0x20
第二步,查表得到段描述符
Index = 4 对应的段描述符如果找到的段描述符是玳码段、调用门、TSS任务段、任务门这四种,是可以跳转的注意:后面三种都是系统段描述符。
第四步加载段描述符,通过上面的权限檢查后CPU会将段描述符加载到CS段寄存器中。
9、关于一致代码段和非一致代码段
1)一致代码段也叫共享段,特权级高的程序不允许访问特權级低的数据(核心态不能访问用户态的程序);特权级低的程序可以访问特权级高的数据但特权级不会改变。
2)非一致代码段也叫普通代码段,只允许同级访问
3)直接对代码段进行JMP或者CALL的操作,无论目标是一致代码段还是非一致代码段CPL都不会发生改变;如果要提升CPL权限,只能通过调用门
1)找一个非一致代码段描述符
可以发现EIP和CS同时发生了变化。
段选择子应该为 0x00B 段选择子的RPL=3
上述段描述符的DPL=0,是非一致代码段跳转应该会失败,如下
4)挑一个或者构造一个一致代码段00cf9d00`0000ffff如下图
DPL=0,段选择子构造为0x004B RPL=3Index=9 ,程序的CPL=3由于是一致代码段可以執行成功,如下