Windows保护模式学习笔记(二)—— 代码跨段跳转
Windows保護模式學習筆記(二)—— 代碼跨段跳轉
- 要點回顧
- 代碼跨段跳轉
- 執行流程
- 1)段選擇子拆分
- 2)查表得到段描述符
- 3)權限檢查
- 4)加載段描述符
- 5)代碼執行
- 6)總結
- 一致代碼段(共享的段)
- 非一致代碼段(普通代碼段)
- 實驗
- 第一步:
- 第二步:
- 第三步:
- 第四步:
- 總結
要點回顧
段寄存器:
ES,CS,SS,DS,FS,GS,LDTR,TR
除CS外,其他的段寄存器都可以通過MOV,LES,LSS,LDS,LFS,LGS指令進行修改
思考:CS為什么不可以直接修改呢?
CS的改變意味著EIP的改變,改變CS的同時必須修改EIP,所以我們無法使用上面的指令來進行修改.
代碼跨段跳轉
段間跳轉分為兩種情況:
同時修改CS與EIP的指令:
JMP FAR / CALL FAR / RETF / INT /IRETED
只改變EIP的指令:
JMP / CALL JCC / RET
執行流程
思考:CPU如何執行 JMP 0x20:0x004183D這行指令
1)段選擇子拆分
0x20 二進制:0000 0000 0010 0000 即
RPL = 00 TI = 0 Index = 42)查表得到段描述符
TI=0:查GDT表
Index=4:找到對應的段描述符
四種情況可以跳轉:
3)權限檢查
一致代碼段:要求 CPL >= DPL
非一致代碼段:要求 CPL == DPL并且 RPL <= DPL
4)加載段描述符
通過上面的權限檢查后,CPU會將段描述符加載到CS段寄存器中
5)代碼執行
CPU 將 CS.Base + Offset的值寫入EIP,然后執行CS:EIP處的代碼
段間跳轉到此結束
6)總結
一致代碼段(共享的段)
非一致代碼段(普通代碼段)
注意:直接對代碼段進行JMP 或者 CALL的操作,無論目標是一致代碼段還是非一致代碼段,CPL都不會發生改變.如果要提升CPL的權限,只能通過調用門
實驗
第一步:
復制一個非一致代碼段描述符,寫入GDT表空白處
第二步:
在OD中執行 JMP FAR 命令
執行前,CS = 001B
執行后,CS = 004B
執行成功!
第三步:
將段描述符的 DPL 置為 0,再在OD中執行JMP FAR命令
執行后,程序進入了ntdll,也就是異常模塊,說明執行失敗
失敗原因:
要跳轉的代碼段是一個非一致代碼段(DPL=0),而程序的CPL=3,權限檢查未通過
非一致代碼段要求CPL=DPL時才允許跳轉
這樣設計的目的是防止3環的程序跳轉到系統段執行
第四步:
將段描述符Type域的C位改為1,令其成為一致代碼段
再次執行JMP FAR命令
執行成功!
總結
一、為了對數據進行保護,普通代碼段禁止用戶態的代碼/數據和內核態的代碼/數據相互訪問
二、如果選擇一致代碼段,低級別的程序就可以在不提升CPL權限等級的情況下進行訪問,并且不會破壞內核態的數據
三、如果想訪問普通代碼段,必須通過"調用門"等方式提升CPL權限
總結
以上是生活随笔為你收集整理的Windows保护模式学习笔记(二)—— 代码跨段跳转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows保护模式学习笔记(一)——
- 下一篇: Windows保护模式学习笔记(三)——