9 呼叫門(無參)

2021-09-29 23:23:04 字數 2132 閱讀 9730

本篇,將真正的實現提權——當前特權級從 3 變為 0.

當然,cpu 不會讓你就這麼簡單的從 3 環跨到 0 環。但是,cpu 又必須提供一套方法,來讓你完成這個功能。

前面講過。dpl = 0 的非一致**段,是絕對不允許不同特權級的程式跳轉進來。可是,我給以給你開個後門,讓你進來,然後給你最高許可權,允許你胡作非為。

這個後門,必須由我(作業系統)來指定,而且只允許你跳轉到我指定的地方。

前面做過 jmp 跨段實驗,但是 jmp 跨段後,許可權是不會變的。cpu 提供給了我們另一種方法——呼叫門,來達到提權的目的。可以使用 call + 呼叫門的段選擇子,來達到提權的目的。通過呼叫門,可以讓 3 環程式進入 0 環,也就是由使用者態變成核心態。

call far cs:eip
由於在 vc6.0 中不支援這種寫法,所以可以寫成下面這種形式。(buffer是乙個長度為6位元組的緩衝區,高2位元組存放 cs 段選擇子,低 4 位元組存放偏移值。)

asm
實際上,call far 後面跟的 eip 已經廢棄。下面的實驗演示了如何讀取高 2g 記憶體。

#include #include word g_cs0, g_ss0, g_ds0, g_es0, g_fs0, g_gs0;

dword r0_data_lowdword, r0_data_hidword;

declspec(naked) void getdata()

}void printdata()

int main(int argc, char* ar**) ;// 這裡的 eip 被廢棄asm

printdata();

getchar();

return 0;

}

有一點需要注意的是,call far 函式指令的格式雖然是 call far cs:eip,但是這後面的 eip 已經被廢棄。而真正的 eip 是填寫到了呼叫門中。

1、呼叫門執行流程

指令格式:call  cs:eip(eip是廢棄的)

執行步驟:

1) 根據cs的值 查gdt表,找到對應的段描述符  這個描述符是乙個呼叫門.

2) 在呼叫門描述符中儲存另乙個**段段的選擇子.

3) 選擇子指向的段  段.base + 偏移位址 就是真正要執行的位址.

|   7    |     6  |     5     |    4    |   3    |   2    |   1    |   0    |  位元組

|76543210|76543210|7 65 4 3210|765 43210|76543210|76543210|76543210|76543210| 位元

|-----------------|1|--|0|1100|000|-----|--------|--------|--------|--------| 佔位

|offset in segment|p|d |s|type| |param|segment selector |offset in segment| 含義

呼叫門雖然是 cpu 提供給使用者提權的一種手段,但是 windows 中卻並未使用。在 windows 中,大量使用了中斷門來進行提權,包括後面的系統呼叫,都是採用中斷的方式實現。

另外,所謂的後門,其實有很多,比如中斷門,陷阱門,任務門。它們都可以實現提權。後續文章會陸續講解。

Windows核心 (7)呼叫門提權 無參

對呼叫門的呼叫可以訪問與當前 特權相同或者特權更高的 段中的過程。指令格式 call cs eip eip是廢棄的 執行步驟 根據cs的值 查gdt表,找到對應的段描述符 這個描述符是乙個呼叫門.在呼叫門描述符中儲存另乙個 段段的選擇子.選擇子指向的段 段.base 偏移位址 就是真正要執行的位址....

10 呼叫門(有參)實驗

可以看到位址為 0x00401020 呼叫門描述符結構 7 6 5 4 3 2 1 0 位元組 76543210 76543210 7 65 4 3210 765 43210 76543210 76543210 76543210 76543210 位元 1 0 1100 000 佔位 offset ...

tcl呼叫python檔案無傳參

tcl呼叫python檔案無傳參 首先新建乙個add.py檔案,該檔案實現兩個數的相加並返回結果,python中函式返回值用return實現,如果想要讓python檔案中值返回給tcl程式必須在python中print該值,add.py檔案 如下 coding utf 8 def add a,b r...