[保护模式]段间跳转和跨段跳转
文章目錄
- 段間跳轉(zhuǎn)
- 段寄存器
- 段間跳轉(zhuǎn)
- 段間跳轉(zhuǎn)的執(zhí)行流程
- 1.段選擇子拆分
- 2.查表得到段描述符
- 3.權(quán)限檢查
- 4.加載段描述符
- 5.代碼執(zhí)行
- 總結(jié)
- 跨段跳轉(zhuǎn)
- 短調(diào)用
- 長(zhǎng)調(diào)用
- 跨段不提權(quán)
- 跨段提權(quán)
- 總結(jié)
段間跳轉(zhuǎn)
代碼跨段,本質(zhì)就是修改CS段寄存器
段寄存器
段寄存器有下面幾個(gè):ES CS SS DS FS GS LDTR TR。除了CS以外,其他的段寄存器都可以通過MOV LES LSS LDS LFS LGS指令進(jìn)行修改。
那么CS為什么不能直接修改呢?因?yàn)閏s.base+eip=真正執(zhí)行的地址。CS的改變意味著EIP的改變,改變CS的同時(shí)必須修改EIP,所以我們無法使用上面的指令來進(jìn)行修改
段間跳轉(zhuǎn)
段間跳轉(zhuǎn)有兩種情況,即要跳轉(zhuǎn)的段是一致代碼段還是非一致代碼段。那么如果想要修改CS,可以使用下面的指令同時(shí)修改EIP和CS段寄存器
jmp far call far retf int ireted段間跳轉(zhuǎn)的執(zhí)行流程
jmp far的指令格式為
jmp 0x20 0x12345678CPU在遇到這行代碼時(shí),執(zhí)行流程如下:
1.段選擇子拆分
0x20對(duì)應(yīng)的二進(jìn)制數(shù)為0000 0000 0010 0000
RPL=00 代表請(qǐng)求特權(quán)等級(jí)為0環(huán)權(quán)限
TI=0 代表查GDT表
Index=4代表查GDT表第5項(xiàng)(下標(biāo)為4)
2.查表得到段描述符
通過段選擇子的Index找到對(duì)應(yīng)的段描述符后,滿足四種情況則繼續(xù)執(zhí)行:代碼段 調(diào)用門 TSS任務(wù)段 任務(wù)門
3.權(quán)限檢查
如果GDT表項(xiàng)是非一致代碼段,要求:CPL==DPL并且RPL<=DPL
如果GDT表項(xiàng)是一致代碼段,要求CPL>=DPL
原因在于一致代碼段允許權(quán)限低的代碼段訪問權(quán)限高的代碼段,而非一致代碼段只能被同等級(jí)權(quán)限或更高權(quán)限的代碼訪問。
4.加載段描述符
通過上面的權(quán)限檢查后,CPU會(huì)將段描述符加載到CS段寄存器中
5.代碼執(zhí)行
CPU將cs.base+offset的值寫入EIP,然后執(zhí)行CS:EIP處的代碼,段間跳轉(zhuǎn)結(jié)束
總結(jié)
對(duì)于一致代碼段:也就是共享的段
- 特權(quán)級(jí)高的程序不允許訪問特權(quán)級(jí)低的數(shù)據(jù):內(nèi)核態(tài)不允許訪問用戶態(tài)的數(shù)據(jù)
- 特權(quán)級(jí)低的程序可以訪問到特權(quán)級(jí)高的數(shù)據(jù),但特權(quán)等級(jí)不會(huì)改變:用戶態(tài)還是用戶態(tài)
對(duì)于非一致代碼段:
- 只允許同級(jí)訪問
- 絕對(duì)禁止不同級(jí)別的訪問
直接對(duì)代碼段進(jìn)行JMP或者CALL的操作,無論目標(biāo)是一致代碼段還是非一致代碼段,CPL都不會(huì)發(fā)生改變。如果要提升CPL的權(quán)限,只能通過調(diào)用門。
跨段跳轉(zhuǎn)
一致代碼段允許特權(quán)級(jí)低的代碼訪問特權(quán)級(jí)高的代碼,那么如果遇到非一致代碼段怎么辦呢?那么就需要提權(quán)了。也就是所謂的跨段跳轉(zhuǎn)。
我們通過JMP FAR可以實(shí)現(xiàn)段間跳轉(zhuǎn),如果要實(shí)現(xiàn)跨段跳轉(zhuǎn)就必須用CALL FAR。CALL FAR比JMP FAR要復(fù)雜,JMP并不影響堆棧,但CALL指令會(huì)影響
短調(diào)用
普通的調(diào)用指令格式為:call 立即數(shù)/寄存器/內(nèi)存。短調(diào)用執(zhí)行時(shí)會(huì)先將返回地址壓入到堆棧,然后修改EIP。堆棧圖如下:
而ret指令則相當(dāng)于是pop eip+jmp eip。call和ret指令影響的寄存器有ESP和EIP。
長(zhǎng)調(diào)用
跨段不提權(quán)
指令格式:CALL CS:EIP(EIP是廢棄的),其堆棧圖如圖所示:
長(zhǎng)調(diào)用執(zhí)行時(shí)會(huì)將當(dāng)前的CS段寄存器和返回地址壓入到堆棧,RETF指令執(zhí)行時(shí)則會(huì)將當(dāng)前的CS和返回地址彈出堆棧。CALL指令執(zhí)行完成之后當(dāng)前的EIP會(huì)指向哪由CS指向的段描述符決定。發(fā)生改變的寄存器有:ESP EIP CS
跨段提權(quán)
指令格式:CALL CS:EIP(EIP是廢棄的),其堆棧圖如圖所示:
跨段提權(quán)時(shí)當(dāng)前CS的寄存器的CPL會(huì)發(fā)生改變,CS發(fā)生改變必然伴隨著SS的改變。所以跨段提權(quán)的長(zhǎng)調(diào)用執(zhí)行后會(huì)將SS ESP CS和放回地址都?jí)喝氲蕉褩V小?/p>
發(fā)生改變的寄存器:ESP EIP CS SS。
總結(jié)
總結(jié)
以上是生活随笔為你收集整理的[保护模式]段间跳转和跨段跳转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows内核实验005 Inlin
- 下一篇: [保护模式]调用门