4.代码跨段跳转
代碼的跨段就是修改CS段寄存器
段寄存器:
ES,CS,SS,DS,FS,GS,LDTR,TR
段寄存器讀寫:
除CS外,其他的段寄存器都可以通過 MOV,LES,LSS,LDS,LFS,LGS指令進行修改
CS的改變意味著EIP的改變,改變CS的同時必須修改EIP,所以我們無法使用上面的指令來進行修改.
同時修改CS與EIP的指令.JMP FAR /CALL FAR /RETF /INT/IRETED
注意:
只改變EIP的指令JMP/ CALL/ JCC /RET
JMP FAR
代碼間的跳轉(段間跳轉非調用門之類的)執行流程
JMP 0x20:0x004183D7 CPU如何執行這行代碼?
段選擇子拆分0x20對應二進制形式0000 0000 0010 0000
段描述符必須為代碼段,數據段是不能執行的。通過索引找到的描述符有4種情況是允許的:代碼段,調用門,TSS任務段,任務門
權限檢查:
如果為非一致代碼段,要求:CPL==DPL && RPL<=DPL
如果為一致代碼段,要求:CPL>=DPL
加載段描述符:
通過上面的權限檢查后,CPU會將段描述符加載到CS段寄存器中
代碼執行
CPU將CS.Base+Offset(就是0x20后面的)的值寫入EIP然后執行CS:EIP處的代碼,段間跳轉結束
1、段選擇子拆分
2、查表得到段描述符
3、權限檢查
4、加載段描述符
5、代碼執行
3.段描述符屬性。有看代碼段或數據段,一致代碼段,非一致代碼段的技巧
------------------------------------------------------------
對于一致代碼段:也就是共享的段
對于普通代碼段:也就是非一致代碼段
總結
1、為了對數據進行保護,普通代碼段是禁止不同級別進行訪問的。
用戶態的代碼不能訪問內核的數據,同樣,內核態的代碼也不能訪問用戶態的數據.
2、如果想提供一些通用的功能,而且這些功能并不會破壞內核數據,那么可以選擇一致代碼段,這樣低級別的程序可以在不提升CPL權限等級的情況下即可以訪問.
3、如果想訪問普通代碼段,只有通過調用門等提示CPL權限,才能訪問。
總結