(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位