BeneficialWeb 发表于 2019-9-2 17:33

实验基础 02段描述符表与段选择子

本帖最后由 BeneficialWeb 于 2019-9-4 16:42 编辑

1.段选择子

这个图就是讲解cpu如何去利用段寄存器,index GDT or LDT中的索引值,RPL:请求特权级,用于权限检查的 TI:决定查哪个表 LDT:1 GDT:0
在内核实验02中我们得到了一些段寄存器的值

现进行拆分解析:
0x33
0000000000110 0 11‬
Index: 6 TI: 0 RPL:3

ring3层,GDT表的第5项
0x10
0000000000010 0 00
Index:2 TI:0 RPL:0
ring0层,GDT表的第2项

0x2b
0000000000101 0 11
Index:5 TI:0 RPL:3
ring3层,GDT表的第5项
0x53
0000000001010 0 11
Index:10 TI:0 RPL:3
ring3层,GDT表的第10项
2.段描述符

这里不做过多解释,windbg通过r gdtr找到gdt表,对上述遇到的GDT段直接进行讲解


技巧:
先看P位(决定段的有效性)如:0020fb00中的第四位: f>=8,P位为1,段在内存中存在,若P位为0,则段是不存在的 如 00000000中的0<8,段不存在
再看S位(判断是属于什么段,系统段,数据段or代码段,本节尚未遇到系统段,以后进行讲解)
如果代码段或者数据段接着看Type位,然后查看下表 (进一步是属于确定数据段还是代码段)

至于基址和界限,在win7x64下,看了Intel白皮书,我也没完全吃透,先不做演示。

演示:
0x33
index: 0x6
0020fb00`00000000
P:1,段存在 S:1代码或者数据Type:1011 Code Execute/Read,accessed   G:1 byte unitsDPL:11 特权级3
由于是代码段,所以考虑查看L位
L:1 this code segment are executed in 64-bit mode.

0x10
index:0x2
00209b00`00000000
P:段存在S:代码或者数据 Type:1011 Code Execute/Read,accessedG:0 byte units DPL:00 特权级0
由于是代码段,所以考虑查看L位
L:1 this code segment are executed in 64-bit mode.

0x2b
index: 0x5
00cff300`0000ffff
P:1,段存在S:1代码或者数据Type:0011 Data Read/Write,accessed    G:1 4KB unitsDPL:11 特权级3

0x53
index:0xA
ff40f3fe`00003c00
P:段存在S:1代码或者数据 Type:0011 Data Read/Write,accessedG:0 byte units DPL:11 特权级3

Ok 和XueTr工具查出来的一样,我估计他GDT数量也是根据gdtl的长度,遍历GDT的P位统计得出来的。


3.int 20中断门的构造原理,仿造int 3
int 3
03e9ee00`0010aa00 00000000`fffff800
Segment Selector:0010
Offset: fffff80003e9aa00
Attribute: ee00
P:1DPL:11S: 0 系统段 TYPE:111064-bit Interrupt Gate
int 20
4000ee00`00101210 00000000`00000001
Segment Selector:0010
Offset: 140001210
Attribute: ee00
P:1 DPL:11S: 0 系统段 TYPE:111064-bit Interrupt Gate

Mangoの 发表于 2019-9-2 18:00

不错 不错 很厉害啊

sangong 发表于 2019-9-16 08:46

yyspawn 发表于 2019-10-1 08:15

cccc菜鸟 发表于 2022-2-22 15:28

感谢分享,正在学习

pgf1225 发表于 2022-4-29 15:35

(⊙o⊙)…这个基础~~
页: [1]
查看完整版本: 实验基础 02段描述符表与段选择子