大神论坛

找回密码
快速注册
查看: 796 | 回复: 0

[语言编程类] 逆向脱壳之保护模式学习四 段描述符结构

主题

帖子

13

积分

初入江湖

UID
38
积分
13
精华
威望
26 点
违规
大神币
68 枚
注册时间
2021-05-03 08:20
发表于 2021-05-15 17:17
本帖最后由 dragon 于 2021-05-15 17:17 编辑

前言

所有保护模式索引链接:逆向脱壳之保护模式学习一 保护模式介绍

先前了解了段描述符和段选择子之间的对应关系,继续深入学习段描述符的结构

段描述符结构






段描述符与段寄存器的对应关系


P位

当段描述符加载至段寄存器时,CPU首先要做的事就是检查段描述符的P位


也就是说:P位决定了该段描述符是否有效


G位

CPU判断完段描述符P位有效后,还需要判断地址是否超出Limit

但会发现这里的Limit分为了两段,但两段的总长度也只有4+16=20位,和段寄存器中的Limit的32位不匹配

这里的Limit的最大表示范围是:0~2的20次方-1=0~0xFFFFF

而段寄存器中的Limit的最大表示范围是:0~2的32次方-1=0~0xFFFFFFFF

很显然现在的Limit无法表示段寄存器中的Limit了,为了解决这个问题,引入了G位:粒度(用来表示Limit的单位)


也就是说:G位决定了limit的单位


S位

S位用来标记当前描述符的类型


段描述符可以分为系统描述符、代码段描述符和数据段描述符

根据S位的不同(描述符类型的不同)对应的Type域也不同

也就是说:S位决定了Type域的含义


Type域

Type占据了第11位到第8位,共4位


S位为1时

当S==1时,该段描述符为代码段描述符或者数据段描述符



主要说明一下向下扩展和非向下扩展(向上扩展)

向上扩展就是:该段描述符所描述的地址的有效范围是从Base开始到Base+Limit结束

为下图中的红色部分:


与之相反,向下扩展则是:该段描述符所描述的地址的有效范围除了 从Base开始到Base+Limit结束 之外的部分

为下图中的红色部分


S位为0时

当S==0时,该段描述符为系统描述符

系统描述符有分为以下类型:




关于系统描述符中的TSS、调用门、中断门、陷阱门 留作之后的笔记,这里不再展开


Type域决定了当前段的属性


D/B位

D/B位分别作用于3种情况:

  1. 对CS段的影响
  2. 对SS段的影响(SS段也属于数据段)
  3. 对向下扩展的数据段的影响




主要说明一下对 向下扩展的数据段的影响

D/B位为1时


D/B位为0时


DPL

DPL=Descriptor privilege level(描述符特权等级)为:访问这个描述符所需的特权级别(环ring)

关于段的权限检查,留作之后的笔记,这里不再展开


根据结构分析段描述符

大致了解了段描述符的结构后,就可以通过结构来分析一个段描述符了

给出的示例段描述符为:00cffb00`0000ffff

先转换成二进制:0000 0000 1100 1111 1111 1011 0000 0000 ` 0000 0000 0000 0000 1111 1111 1111 1111

按照对应的格式填入:






P位

此时P位为1,表明当前的段描述符有效


G位

此时的G位为1,表明此时limit以4096字节为单位


Limit

此时的Limit为0xFFFFF,但其单位为4096字节,于是Limit等于0xFFFFF FFF 字节


S位

此时的S位为1,表明该段描述符为代码段描述符或者数据段描述符


Type域

此时的Type域为1011,表明该段描述符为代码段描述符,且可执行可读,可访问


D/B位

此时的D/B位为1,表明此时采用32位寻址方式


DPL

此时的DPL为11,表明访问这个描述符所需的特权级别为ring3(应用层)


说明

此篇笔记大体介绍了段描述符的结构,以及如何通过结构来解析一个段描述符的含义

目前还剩下段的权限检查和系统描述符没有具体说明,留作之后的笔记( ̄( ̄ )

返回顶部