2015-04-17 34 views
0

我一直在閱讀關於ASLR的問題,我有幾個問題。我沒有什麼編程經驗,但我對它背後的理論很感興趣。關於ASLR的2個問題

我知道它會隨機化DLLs,堆棧和堆在虛擬地址空間中,以便惡意代碼不知道它們的位置,但實際程序在需要它們時如何知道它們的位置?

如果合法進程能夠找到它們,什麼能阻止惡意代碼的執行?

最後,是ASLR試圖防止在正在攻擊的進程的用戶空間中運行的惡意代碼?

感謝

回答

2

作爲背景,ASLR意在攻擊者嘗試將應用程序利用溢出的漏洞,以到運行攻擊者的代碼code injection attacks複雜化。例如,在成功的stack buffer overflow attack中,攻擊者將其代碼推入堆棧並修改調用幀的返回指針以指向堆棧內代碼。

大多數代碼注入攻擊要求攻擊者知道進程內存佈局的某個部分的絕對地址。對於堆棧緩衝區溢出攻擊,他們需要知道有漏洞的函數調用的堆棧幀的地址,以便他們可以將函數返回指針設置爲指向堆棧。對於其他攻擊,這可能是堆變量,異常表等的地址...

一個更重要的背景事實:與編程語言不同,機器代碼具有絕對地址。雖然您的程序可能會調用功能foo(),但機器代碼將調用地址0x12345678

但是實際的程序在需要時如何知道它們的位置?

這是由dynamic linker和其他操作系統功能負責將磁盤上的可執行文件轉換爲內存中進程。這涉及替換對foo的引用,並參考0x12345678

如果合法進程可以找到它們,什麼能阻止惡意代碼執行相同的操作?

合法的進程知道地址是在哪裏,因爲動態鏈接器創建了進程,使得實際地址被硬連接到進程中。所以這個過程本身並沒有定位它們。過程開始時,地址全部計算並插入代碼中。攻擊者不能利用它,因爲他們的代碼沒有被動態鏈接器修改。

考慮一下攻擊者擁有他們試圖攻擊的可執行文件副本的情況。他們可以在他們的機器上運行可執行文件,檢查它並找到所有相關的地址。如果沒有ASLR,那麼當您運行可執行文件時,這些地址在您的機器上具有相同的機會。 ASLR將這些地址隨機化,這意味着攻擊者無法(輕鬆地)找到地址。

最後,是ASLR試圖防止在正在攻擊的進程的用戶空間中運行的惡意代碼?

除非存在內核注入漏洞(這可能會非常糟糕,並會導致操作系統出現補丁),是的,它在用戶空間中運行。更具體地說,它可能位於堆棧或堆上,因爲這是存儲用戶輸入的地方。使用data execution prevention也有助於防止成功的注入攻擊。

+0

謝謝你的回答尼爾,真的幫助清除了一切。 – RJSmith92