1 CPL/DPL/RPL
- DPL(Descriptor Privilege Level)
指GDT或LDT描述符中的DPL字段嘲碧,根據(jù)段的類型不同其處理規(guī)則而異:- 數(shù)據(jù)段:指定了訪問該數(shù)據(jù)段的最低特權(quán)級(如DPL為1的數(shù)據(jù)段,只有特權(quán)級 0 和 1 下才能訪問邓深。
- 非一致代碼段:規(guī)定了只有在特權(quán)級等于 DPL 時才能訪問阶淘。
- 一致代碼段和通過調(diào)用門訪問非一致代碼段:規(guī)定只有在特權(quán)級等于或高于 DPL的情況下才能訪問
- TSS 段:規(guī)定了訪問此段的最低特權(quán)級衙吩,與數(shù)據(jù)段一致。
- CPL(current privilege level)
指當(dāng)前執(zhí)行任務(wù)或程序代碼段寄存器(CS)或堆棧寄存器(SS)中第 0 位和第 1 位的值溪窒。此一般等于程序和任務(wù)的代碼所在段的 DPL坤塞。注意:當(dāng)跨特權(quán)級訪問一致代碼段時,此時CPL與訪問者一致霉猛,不會與此一直代碼段DPL相等尺锚。
- RPL(Requested privilege Level)
指程序或任務(wù)所在段所對應(yīng)的選擇子的第0位和第 1 位所代表的值珠闰。處理器比較 RPL 和 CPL 來判斷是否為一個合法訪問惜浅,即選擇 CPL 與 RPL 較大的值來判定是否有權(quán)執(zhí)行某一訪問動作。RPL可以很好的限制用戶態(tài)程序?qū)τ趦?nèi)核態(tài)內(nèi)存的訪問伏嗜。用戶態(tài)程序執(zhí)行系統(tǒng)調(diào)用或中斷等轉(zhuǎn)移到內(nèi)核態(tài)執(zhí)行時坛悉,在內(nèi)核態(tài)執(zhí)行時的RPL由調(diào)用者使用的選擇子來決定,從而保證了用戶態(tài)執(zhí)行時的 RPL 仍然是用戶態(tài)權(quán)限承绸,所能訪問的內(nèi)存仍僅限于用戶態(tài)內(nèi)存裸影。
2 不同特權(quán)級代碼段之間的轉(zhuǎn)移
特權(quán)級是以段為單元來劃分的,故特權(quán)級的轉(zhuǎn)移必然伴隨著代碼段之間的跳轉(zhuǎn)军熏。程序從一個代碼段跳轉(zhuǎn)到另外一個代碼段之前轩猩,目標代碼段的選擇子會加載到 cs 中。但是在加載的過程中荡澎,系統(tǒng)會根據(jù)當(dāng)前現(xiàn)狀進行特權(quán)級均践、類型、代碼段界限等進行檢查摩幔,若檢查通過彤委,則進行跳轉(zhuǎn)。
程序控制權(quán)的轉(zhuǎn)移可通過指令 jmp或衡、call焦影、int, ret封断, sysenter斯辰、sysexit、iret等坡疼,也可由硬中斷和異常引起彬呻。
使用jmp 和call 實現(xiàn)以下 4 種轉(zhuǎn)移:
- 目標操作數(shù)包含目標代碼段的選擇子
- 目標操作數(shù)指向一個包含目標代碼段選擇子的調(diào)用門描述符
- 目標操作數(shù)指向一個包含目標代碼段選擇子的TSS
- 目標操作數(shù)指向一個任務(wù)門,這個任務(wù)門指向一個包含目標代碼段選擇子的TSS
2.1 通過jmp 或 call 進行直接轉(zhuǎn)移
- 如果目標是非一致代碼段,要求CPL必須等于目標段的DPL废岂,同時要求RPL小于等于DPL祖搓。
- 如果目標是一致代碼段,則要求CPL大于或等于目標段的DPL湖苞,RPL此時不做檢查拯欧。當(dāng)轉(zhuǎn)移到一致代碼段后,CPL會被延續(xù)下來财骨,而不會變成目標代碼段的DPL镐作。
2.2 call調(diào)用時的堆棧變化
- 短調(diào)用時的堆棧變化
call時:
ret時:
- 同特權(quán)級段間跳轉(zhuǎn)
call:
ret:
- 不同特權(quán)級段間跳轉(zhuǎn)
call:
ret: