2012-01-14 60 views
7

如果地址空間佈局隨機化(ASLR)被禁用,我們是否有確定性的mmap?通過確定性,我的意思是如果我用相同的輸入一次又一次地運行相同的應用程序,我會得到相同的地址mmap?我最感興趣的是匿名mmap。如果ASLR被禁用,mmap是確定性的嗎?

+0

你問獨立。 「mmap」的第一個參數是請求的地址嗎? – 2012-01-14 19:50:10

+0

我在問關於匿名的mmap。 – MetallicPriest 2012-01-14 19:51:56

+0

你可以請求任何映射的具體地址 – 2012-01-14 19:56:58

回答

4

如果地址空間佈局隨機化(ASLR)被禁用,我們是否有確定性的mmap?

如果你的應用程序在第i個mmap時刻有完全相同的內存佈局(根據虛擬地址空間的哪些頁面被映射,哪些沒有)。那麼mmap應該在Linux內核中是確定性的。

存在一些可能會改變內存佈局的奇怪情況。例如,附加的命令行參數可以將堆棧轉換爲較低的地址。有很多文件在m運行時(例如語言環境)中進行縮放,並且如果某些文件的大小已從上一次開始更改,那麼內存佈局也會發生更改。即使堆棧消耗也可能會影響它。

如果您的應用程序內存分配(包括大小和分配順序)通過malloc更改,mmap將不確定。所以,如果你的應用程序是線程的;它應該修復malloc調用的順序或限制所有malloc到主線程。

mm/mmap.c: arch_get_unmapped_area - 默認的非固定MMAP地址解析器是確定IIF的VMA樹是相同的,以前MMAP的歷史是一樣的(有一個緩存mm->free_area_cache其爲活的調用MMAP之間

+1

請注意,不僅命令行參數而且環境都可以將堆棧向下移動。 – 2012-02-20 19:09:56

+0

另外,AUXV矢量可以改變;動態鏈接器和任何共享庫構造函數。 – osgx 2012-02-20 19:38:28

4

根據我的經驗,它是可重複的。當我在gdb下運行幾次(具有相同的輸入和條件)的確定性程序(由我編寫)(禁用ASLR)時,指針是相同的。

然而,作爲一個確定性程序是一個屬性,它不是靜態檢測(我只是碰巧知道我編碼的某些程序足夠確定)。

+3

請注意,「確定性程序」意味着沒有線程,一旦線程進入,所有投注都關閉。另外請注意,一些libc工具(例如aio)會在您的背後創建線程」。 – 2012-01-14 22:14:21

+0

如果使用同步原語以嚴格排列所有分配(包括分配線程堆棧)的方式,它仍然可以是線程確定性的。 – 2012-02-20 19:10:54

2

內核可能會重新映射多次相同的虛擬內存地址。但是,我不會依賴內核每次給你相同的地址,因爲它不是必需的。如果你需要一個固定的地址,並且你需要內核把它放在虛擬內存中的特定位置,使用MAP_FIXED

+1

除非目標地址範圍已存在於進程的地址空間中,並且您知道要替換的內容,否則'MAP_FIXED'使用非常危險。否則,你可能會破壞屬於你不知道的程序的其他部分的內存! – 2012-02-20 19:12:02