6、程式碼間的跳轉--Windows核心學習筆記
阿新 • • 發佈:2021-01-17
1、程式碼間的跳轉(段間跳轉、非呼叫門值類的)
1、同時修改CS和EIP的指令
JMP FAR/CALL FAR/RETF/INT/IRETED
2、只改變EIP的指令
JMP/CALL/JCC/RET
3、JMP 0x20:0x004183D7 CPU如何執行這行程式碼?
-首先JMP後面跟了6個位元組,分別是0020:004183D7
-0x0020是兩個位元組,0x004183D7是第四個位元組
-如果是這樣的話 JMP 0x004183D7,CPU直接修改EIP的值,不需要查表
-JMP 0x20:0x004183D7對於這種指令我們稱之為常跳轉,這種指令需要進入零環,需要查表,查那一張表是由指令本身決定的
-第一步、段選擇子拆分
0x20 對應二進位制形式 0000 0000 0010 0000
Index = 二進位制0000 0000 0010 0 = 4:說明查詢GDT表中下標為4的項
TI = 二進位制0 = 0
RPL = 二進位制00 = 0
-第二步、查表得到段描述符(通過0x20找到對應的段)
TI = 0:說明需要查詢GDT表
Index = 4:找到對應的段描述符
段描述符只有四種情況可以跳轉:程式碼段、呼叫們、TSS任務段、任務門、(如果0x20對應的是資料段,那麼跳轉失敗)
-第三步、段許可權檢查
如果是非一直程式碼段,要求 CPL == DPL && RPL <= DPL (CPL是當前CPU的特級許可權)
如果是一直程式碼段,要求 CPL >= DPL
-第四步、載入段描述符
通過上面的許可權檢查後,CPU會將段描述符載入到CS段暫存器中
-第五步、執行程式碼
CPU將CS.Base + Offset(偏移的值)的值寫入EIP,然後執行CS:EIP處的程式碼,段間跳轉結束
RPL 我以什麼樣的許可權訪問你
DPL 如果你要訪問我,你需要具備什麼樣的許可權
拓展、
有點不明白,就算用0x20限制了,我直接JMP 0x004183D7就可以訪問任何地址啊,還要這個段間跳轉有什麼用呢?
答:保護模式是保護記憶體,主要通過段機制和頁機制來保護。當我們啟動OD時,
發現段暫存器中的值(除了FS )起始位置和界限沒有區別,
但是 WORD Attribute //屬性 段描述符高四位元組的第8位開始 到第23位結束 是有區別的
例如:一個地址是0x12345678當用段地址A修飾的時候,這個地址可以訪問
當用段地址B修飾的時候,這個地址就不可以訪問。這就是段的作用
-段的作用主要是保護GDT表和IDT表,GDT一張表是記憶體,有保護
實驗、
1、我修改段描述符的base後無法執行,例如:0x00cffb00:0x0001ffff
2、在JMP far成功後,在OD中發現CS段的base和Limit永遠都是0
3、高許可權的如何訪問低許可權的段?
4、記住以上的流程