2015-10-22 47 views
-1

如果我在內核中控制了一個指向我想要的地方的函數指針,讓我們將它指向我自己設計的函數evil在用戶地。控制內核中的函數指針

err = writepage(page) //->writepage is a kernel function pointer pointing to a evil in the userland 

只有在evil一個printf,會不會有核恐慌如果內核解引用函數指針?由於evil在內核模式下運行(糾正我,如果我錯了),但內核不是什麼printf是。

int evil() { 
    printf("I don't think printf will be executed because evil is executed is kernel mode") 
} 
+0

我投票結束這個問題作爲題外話,因爲惡意軟件開發 –

+2

@MartinJames這是a)不是真實的情況,b)甚至不會成爲downvote的原因。我想說這是試圖瞭解操作系統如何工作,而不是寫入惡意軟件的有希望的嘗試。 –

回答

4

內核從未看到「printf」;它會看到對不同地址的調用,就像程序不按名稱調用該函數一樣,但會相應地設置包含參數的寄存器並調用該函數。

這是行不通的,因爲printf調用指向的地址是相對於用戶態進程的內存而言的,並且在內核內存中不存在。

你必須認識到,進程在自己的虛擬內存中運行 - 程序中使用的地址都不需要對不同進程有意義。

所以你不能甚至只是在一個用戶級進程中調用一個函數;你首先必須在內核看到內存時找出它的位置,然後調用它。當然,它會以內核模式運行,但這並不奇怪 - 沒有一個理智的操作系統會允許用戶態進程以這種方式彎曲內部函數調用。

+0

感謝您的回覆。根據你的解釋,我認爲我唯一能做的就是使用程序集。 – HuangJie

+0

@黃傑:沒有。彙編與任何編程語言沒有什麼不同:內核不關心你的軟件如何成爲。你無法讓你的內核做一些你無法使用的程序集。 C. –

+0

感謝您的時間。我正在研究Linux的一個非常古老的bug。那麼我可以用這個觸發什麼?我在內核中控制了一個函數指針。那麼一些shell代碼?非常感謝。 – HuangJie