基於int的Linux的經典系統呼叫實現

2022-01-12 04:30:37 字數 2056 閱讀 9533

先說明兩個概念:中斷和系統呼叫

一 系統呼叫: 是應用程式(執行庫也是應用程式的一部分)與作業系統核心之間的介面,它決定了應用程式是如何和核心打交道的。

1,  linux系統呼叫:2.6.19版核心提供了319個系統呼叫。比如 exit fork read open close ……

2,  對windows來說,作業系統提供給應用程式的介面不是系統呼叫,而是api。比如:readfile。我們暫時把api和系統呼叫等同起來

3,  linux中,每個系統呼叫對應乙個系統呼叫號,核心維護了乙個系統呼叫表,通過這張表可以找到對應的系統呼叫函式。

二 中斷

1,  現代的cpu常常可以在多種截然不同的特權級別下執行指令,所以有兩種特權級別,分別為使用者模式(user mode)和核心模式(kernel mode)

2,  系統呼叫執行在核心態,應用程式基本都是執行在使用者態。使用者態要切換到核心態,作業系統一般是通過中斷來完成

3,  linux使用0x80中斷作為系統呼叫的入口,windows採用0x2e號中斷作為系統呼叫入口

4,  中斷是乙個硬體或軟體發出的請求,要求cpu暫停當前工作轉手去處理更加重要的事。

5,  中斷一般有兩個屬性,中斷號和中斷處理程式。不同的中斷有不同的中斷號,也對應不同的中斷處理程式。

6,  在核心中有乙個陣列稱為中斷向量表,這個陣列的第n項包含了指向第n號中斷的中斷處理程式的指標。

三 基於int的linux的經典系統呼叫實現(進入正題)

1,  以fork為例 

void main(void

)

2,大概流程就是這樣:使用者呼叫fork  ->  eax=2(儲存系統呼叫號到暫存器中) -> int 0x80 (觸發中斷,切換到核心態)

->  在中斷向量表中查詢(0x80號) -> 執行0x80對應的中斷服務程式(system_call)

->  在系統呼叫表中找到系統呼叫號為2的那一項(通過之前儲存的eax=2) -> 執行系統呼叫(sys_fork)

3,  執行流程圖如下

4,  使用者呼叫某個系統呼叫,執行到int $0x80時,會儲存現場以便恢復,接著將特權狀態切換到核心態,然後cpu便會查詢中斷向量表中的第0x80號元素。

5,  切換堆疊:

(1)       在執行中斷處理函式之前,cpu首先還要進行棧的切換。

(2)       在linux中,使用者態和核心態使用的是不同的棧,兩者各自負責各自的函式呼叫。

(3)       呼叫0x80中斷時,程式執行流程從使用者態切換到核心態,當前棧也必須相應的從使用者棧切換到核心棧。從中斷處理程式中返回時,再切換回使用者棧

(4)       「當前棧」指的是esp的值所在的棧空間,若esp的值位於使用者棧的範圍內,那個當前棧就是使用者棧,反之就是核心棧。此外,暫存器ss的值還要指向當前棧所在的頁(5)

使用者棧 -> 核心棧的實際行為就是:

儲存當前的esp,ss的值   ->   將esp ss的值設定為核心棧的相應值

核心棧 -> 使用者棧的實際行為就是:

恢復原來的esp ss的值

(6)       使用者態的esp 和 ss儲存在核心棧中,這一行為由i386的中斷指令自動地由硬體完成。

(7)       中斷發生時,cpu切入核心態,還會接著做下面幾件事

找到當前程序的核心棧(每個程序都有獨立的核心棧) ->   在核心棧中一次壓入使用者態的暫存器ss、esp、eflags、cs、eip。

(8)       系統從系統呼叫中返回時,需要用iret指令回到使用者態,iret會從核心態中彈出暫存器ss、esp、eflags、cs、eip的值,使得棧恢復到使用者態的狀態

6,中斷處理程式:切換棧了以後,程式的流程就切換到了中斷向量表中記錄0x80號中斷處理程式,linux內部的i386中斷服務流程如圖

執行完sys_fork後再沿原路返回

參考: 《程式設計師的自我修養》

攻擊基於Windows平台的MySQL系統一例

1.用mysql pwd crack.exe工具掃瞄對方mysql的使用者名稱和密碼 mysql pwd crack.exe 192.168.1.14 x 3306 a 字典檔案分別命名為 user.dic pass.dic 2.登陸對方的mysql 假設已經掃出使用者名為為abc 密碼為abc m...

基於texLive2007的中文tex系統

texlive的關鍵在於建立起統一的tds目錄樹,可以同時在windows和linux系統下工作,並且texlive光碟還提供這兩種作業系統環境的安裝程式,很受歡迎。但是texlive本身的中文支援並不是很好,而且現有的中文解決方案一般都是分別針對兩種作業系統作各自的配置,沒有乙個統一的解決方案。另...

基於Jsp Servlet的新聞資訊管理系統

執行環境,jdk1.8或者jdk1.7 tomcat8或者tomcat8.5 mysql5.7 eclipse或者myeclipse開發環境。1 企鵝1748741328,基於jsp servlet的新聞資訊管理系統的登入介面,如下所示 2 基於jsp servlet的新聞資訊管理系統的註冊介面,如...