JMP FAR實現跨段跳轉

本文主要通過理論和實驗,驗證JMP FAR跨段跳轉。

1.指令分析

JMP 0x20:0x004183D7
上面是一條 JMP FAR 指令,FAR根據地址格式自動添加,如果是:JMP 0x004183D7就只修改EIP,如果是 JMP 0x20:0x004183D7就同時修改CS和EIP,查不查表是由指令格式決定的,0x20就是段選擇子,通過段選擇子的index查GDT的gdt[index]獲取段描述符,CPU執行該指令分爲以下5步:

(1)拆分段選擇子

0x20 = 00100 0 00
RPL = 0
TI = 0
INDEX = 4


(2)查GDT表得到段描述符

根據段選擇子拆得的下標,找到GDT表第5項。如果P=1,S=1,TYPE高1位=1,則表明這是一個代碼段,就可以進行下一步。

(3)權限檢查

TYPE域高2位是C屬性,C=0表示非一致代碼段,C=1表示一致代碼段。
如果是非一致代碼段,要求:CPL == DPL 並且 RPL <= DPL;
如果是一致代碼段,要求:CPL >= DPL。

(4)加載段描述符

通過上面的權限檢查後,CPU會將段描述符加載到CS段寄存器中。

(5)執行代碼

CPU將 CS.Base + Offset 的值寫入EIP 然後執行CS:EIP處的代碼,段間跳轉結束。

2.實驗操作

1.啓用雙擊調試環境
2.在WinDbg查看系統段

kd> r gdtr
gdtr=8003f000
kd> dq 8003f000
8003f000  00000000`00000000 00cf9b00`0000ffff
8003f010  00cf9300`0000ffff 00cffa00`0000ffff
8003f020  00cff300`0000ffff 80008b04`200020ab
8003f030  ffc093df`f0000001 0040f300`00000fff
8003f040  0000f200`0400ffff 00000000`00000000
8003f050  80008954`b1000068 80008954`b1680068
8003f060  00009302`2f40ffff 0000920b`80003fff
8003f070  ff0092ff`700003ff 80009a40`0000ffff

3.進入windows系統打開OD,隨便加載一個exe,在上面找到:00cffa00`0000ffff段,RPL可以取00或11,TI=0,INDEX=00011,所以段選擇子可以取0x18或0x1B.爲了看到清晰的變化,我們選0x18

4.執行:JMP 0x18:0x12345678 ,然後觀察EIP和CS變化

5.執行結果:EIP=0x12345678 但是CS並沒有變化,原因可能是:可能OD認爲CS寄存器指向的段沒有改變(1B和18的區別是RPL,但是在GDT裏是同一個地方),所以就沒更新
6.在WinDbg中修改段8003f048 的值爲 00cffa000000ffff,執行:eq 8003f048 00cffa000000ffff

kd> eq 8003f048 00cffa00`0000ffff
kd> dq 8003f000
8003f000  00000000`00000000 00cf9b00`0000ffff
8003f010  00cf9300`0000ffff 00cffb00`0000ffff
8003f020  00cff300`0000ffff 80008b04`200020ab
8003f030  ffc093df`f0000001 0040f300`00000fff
8003f040  0000f200`0400ffff 00cffa00`0000ffff
8003f050  80008954`b1000068 80008954`b1680068
8003f060  00009302`2f40ffff 0000920b`80003fff
8003f070  ff0092ff`700003ff 80009a40`0000ffff

7.修改段選擇子爲0x48
8.在OD中執行:JMP 0x48:0x12345678,我們發現此時EIP=0x12345678,CS=4B(並沒有改爲4B,這個不太清楚是怎麼回事兒, 但時CS確實改變了,說明JRM FAR可以實現跨段跳轉)

3.總結:

(1)對於一致代碼段:也就是共享的段
特權級別高的程序不允許訪問特權級別低的數據:核心態不允許訪問用戶態的數據
特權級別低的程序可以訪問到特權級別高的數據,但特權級別不會改變:系統調用,用戶態還是用戶態
(2)對於普通代碼段:也就是非一致代碼段,(windows只使用了非一致代碼段)
只允許同級訪問
絕對禁止不同級別的訪問:核心態不允許訪問用戶態,用戶態也不允許訪問核心態
(3)直接對代碼段進行JMP或者CALL的操作,無論目標是一直代碼段還是非一致代碼段,CPL都不會發生改變,如果要提升CPL的權限,只能通過調用門





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章