实验基础 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
不错 不错 很厉害啊 感谢分享,正在学习 (⊙o⊙)…这个基础~~
页:
[1]