(3)段描述符,段选择子,LES指令
生活随笔
收集整理的这篇文章主要介绍了
(3)段描述符,段选择子,LES指令
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
一、段描述符
GDT表里面存的东西叫段描述符,一个段描述符占8字节,结构如下
暂时不需要知道各个位的作用,先练习一下拆分,在windbg中输入以下命令,打印GDT表。
这里我们打印了GDT表的前5个段描述符。以第2个为例,演示拆分。
00cf9b00 0000ffff
0000 0000 1100 1111 1001 1011 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111
Base 31:24: 00000000
G: 1
D/B: 1
0: 0
AVL: 0
Segment Limit 19:16: 1111
P: 1
DPL: 00
S: 1
Type: 1011
Base 23:16: 0000 0000
Base 15:00: 0x00000000
Segment Limit: 0xFFFFFFFF
二、段选择子
段选择子有16位,结构如下图:
其中,0-1位是RPL(暂时不知道是啥);2位是TI位,0表示查GDT表(windows不使用LDT所以此位永远是0),3-15位是GDT表的下标。
下面是段选择子拆分实验:
0x0023
0000000000100 0 11
Index: 0x4
TI: 0
RPL: 11
三、使用LES指令修改ES
// LES.cpp : Defines the entry point for the console application. //#include "stdafx.h"// RPL <= DPL // Selector: 0000 0000 0011 1000(0038) // LES高2字节给ES,低4字节给ECX,其他指令如LSS,LDS依此类推 // RPL是段选择子的权限,DPL是段描述符的权限,数值越大权限越小 // 因此当RPL=3时,只能访问DPL=3的段描述符;当RPL=0时,可以访问所有段描述符 // 下面的buffer作为源操作数执行les指令,会把ES写为0x0038,EAX写为0x11223344 char buffer[6] = {0x44,0x33,0x22,0x11,0x38, 0x00};int main(int argc, char* argv[]) {// LES修改段寄存器__asm{les ecx,fword ptr ds:[buffer]}return 0; }
总结
以上是生活随笔为你收集整理的(3)段描述符,段选择子,LES指令的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: (2)双机调试+符号文件
- 下一篇: (4)段描述符P,G位