段暫存器是什麼?
segment register 也可以稱作 selector register
當我們用彙編讀寫某個位址時
mov dword ptr ds:[0x00401000],eax
我們讀寫的位址其實是ds.base+0x00401000
0x00401000被稱為讀寫的有效位址
ds.base+0x00401000被稱為線性位址,這裡做了解即可
段暫存器有自己結構
段暫存器一共96位,但是可見部分只有16位
struct segment
其中不可見部分暫不理會,可見部分可以通過od隨便開啟乙個程式檢視
其中紅色部分就是段選擇子select
段暫存器 select attribute base limit
es 002b 可讀/可寫 0 0xffffffff
cs 0023 可讀/可執行 0 0xffffffff
ss 002b 可讀/可寫 0 0xffffffff
ds 002b 可讀/可寫 0 0xffffffff
fs 0053 可讀/可寫 0x7ffde000 0xfff
gs - - - -
為了驗證段暫存器的屬性:
selector:
mov ax,es
這裡的段選擇子為16位,只能使用16位ax暫存器,不能使用32位eax暫存器
eax 0000002b
ecx 00ff0000
...通過讀取段暫存器,我們發現只能讀取16位,這可見部分就是段選擇子
attribute:
int var = 0;
__asm
執行上面**發現並沒有什麼用,因為ds修飾的段指向了ss,ss段暫存器可讀可寫
如果把ss換成cs,就會發現訪問錯誤,因為cs可讀可執行,但是並不可寫
base:
int var = 0;
__asm
如果訪問位址0會報記憶體訪問錯誤0xc0000005錯誤這是常識,但是由於fs段暫存器的base為0x7ffdf000
線性位址=fs.base+有效位址 ---------------------- fs.0x7ffdf000+0x00000000
等於說直接訪問了0x7ffdf000這個位置,雖然我們**裡寫的是0
如果換成其他base為0的暫存器就會發現記憶體訪問錯誤
limint:
int var = 0;
__asm
0x0x7ffdf000+0x1000
fs段暫存器的段限長為fff,但是我們讀取的是0x1000位置的資料,這就能證明段的limint真實存在
posted @
2019-01-01 21:41
史d芬周 閱讀(
...)
編輯收藏
保護模式驗證段暫存器的屬性
保護模式第一篇段暫存器,學習過8086彙編的同學應該知道段暫存器在8086種的重要程度,8086cpu的暫存器都是16位,8086cpu能夠以16位的位址匯流排訪問到1mb的記憶體位址,採用的就是段位址 16 偏移位址 實體地址的方式,以16位位址匯流排訪問1mb的物理記憶體,8086時代訪問的位址...
保護模式 2講 段 段暫存器結構
目錄保護模式,主要學習的就是段 與 頁 的關係.學習段的時候先學習段暫存器 所以先從段開始學.先看一段彙編 如下 mov eax,fs 0 mov eax,fs eax 0x30 上面的 學過 teb peb 結構的人應該知道.是在做什麼.而我麼你這裡所說不講 peb teb 看彙編 我們操作了fs...
段暫存器屬性的探測
在之前段暫存器隨筆中說了一下段暫存器是用來保護記憶體中的資料不被隨意訪問 當然還有頁 那如何限制你的呢 首先要了解段暫存器的結構 段暫存器的結構長度是96位,可以顯示的只是16位的selecter 段選擇子 剩餘部分不可見,但是可以探測到的 在段暫存器中有個attribute屬性,它會限制你能不能寫...