本次實驗是爲了加深對跨段跳轉流程的印象
首先選一個已有的非一致代碼段的段寄存器,將其複製過來,寫入一個GDT表裏無效的位置中,怎麼區分段寄存器是否是代碼段前面已經有了,這裏不再重複
成功寫入
之後打開R3調試器
輸入彙編指令修改JMP FAR 004B:0040130C
4B是因爲我們剛纔修改GDT表裏段寄存器的位置在第9個,RPL不變
如果成功執行那麼cs和eip都會改變
我們單步一下
可以看到成功執行了
如果我們把我們修改的段寄存器DPL修改爲0是否還能執行成功呢
我們來嘗試一下
還是原來的位置但是DPL已經被我們修改成了00,怎麼改的可以看以前分析段寄存器的文章
我們還是打開R3的調試器寫入彙編JMP FAR 004B 0040130C
,和上面操作一樣如果執行成功cs和eip會改變,這時候我們單步一下
可以看到主線程模塊直接進入了異常,這就和我們之前說的代碼段跳轉流程的一致,段權限檢查沒有通過,因爲非一致代碼段 要求CPL == DPL 並且 RPL <= DPL
這裏CPL=3 DPL=0 所以段權限檢查失敗
我們繼續實驗,如果這是個一致代碼段的效果又會怎麼樣呢
怎麼改就是TYPE域中的C位
我們再來重複上面的操作看是否能成功
可以看到是成功的執行了跳轉,如果是一致代碼段,那麼是允許低權限跳轉到高權限的,這裏手冊的3.4.5.1 中有說明
至於爲什麼就是我們之前說到的,在手冊中5.8.1.2可以找到
實驗已經做完了
大概對代碼段跳轉流程已經有了更深的印象。