段描述符属性
文章目錄
- 簡述
- S位
- s=1代碼段或者數據段描述符
- 數據段TYPE屬性
- 代碼段TYPE屬性
- s=0系統段描述符
- DB位(高四字節的第22位)
簡述
整個GDT表中的段描述符分為兩大類,一類是數據段或者代碼段的描述符;一類是系統段描述符。當我們需要拆分段描述符來判斷時,順序如下:
1.首先看P位,決定是否有效,無效則沒必要繼續
2.然后看S位,通過S位把它分為兩大類,當S位為1時,它就是數據段或者代碼段的描述符;當S位為0時,它就是系統段描述符。
3.然后看TYPE域所在 的位
這里的P位必須為1才有分析的價值
DPL的話,在Windows里面,只能出現兩種情況,00或11
S位
s=1代碼段或者數據段描述符
此時的TYPE域
此時S為1
當DPL為00時,那么第12位~第15位值為9
當DPL為11時,那么第12位~第15位值為F
所以在GDT表中,需要找代碼段和數據段時
只需要看一組段描述符從左往右數的第五位是9或者F時,此時才為代碼段或者數據段。因為第16位~第31位占四個字節,第12位 ~ 第15位也就是第五個字節
那么又該如何區分是代碼段還是數據段呢?
仔細觀察后,即TYPE域的第11位如果為0的話,則為數據段;TYPE域的第11位如果為1的話,則為代碼段
總結:
通過看一組段描述符從左往右數的第五位可以區分代碼段或數據段和系統段;通過看第6位可以區分出到底是代碼段還是數據段(第6位大于等于8的話,則為代碼段;第6位小于8的話,則為數據段)
數據段TYPE屬性
如果此時為數據段的話:
A代表是否訪問過的意思,比如:操作系統在啟動的時候,這個段描述符并未被加載,那么A位則為0,如果被訪問過后,此位被置位1
W代表是否可寫
E位為1時,向上拓展;E位為0時,向下拓展;
解釋:
向上拓展(從fs.Base+0 ~ fs.Base+Limit):即下圖的左邊紅色部分地址為有效地址:
向下拓展:跟向上拓展互補部分的地址才為有效地址,即下圖的右邊紅色部分地址為有效地址:
代碼段TYPE屬性
A代表是否訪問過的意思,比如:操作系統在啟動的時候,這個段描述符并未被加載,那么A位則為0,如果被訪問過后,此位被置位1
R可讀位,是否是可讀的
C一致位
C=1 一致代碼段
C=0 非一致代碼段
s=0系統段描述符
DB位(高四字節的第22位)
情況1:對CS段的影響
D=1采用32位尋址方式
D=0采用16位尋址方式
前綴67 改變尋址方式
情況2:對SS段的影響
D=1隱式堆棧訪問指令(PUSH POP CALL)使用32位堆棧指針寄存器ESP
D=0隱式堆棧訪問指令(PUSH POP CALL)使用16位堆棧指針寄存器SP
情況3:向下拓展的數據段
D=1段上限為4GB
D=0段上限為64KB
總結
- 上一篇: 一次讲清UNICODE
- 下一篇: BabyXor flower逆向寒假生涯