2015-03-19 71 views
0

爲了學習內存地址,我正在Debian上使用EGLIBC 2.13在虛擬機上工作。 所以我寫了一個簡單的代碼給我一個測試變量的地址,但是每次我執行這個腳本時,我都會得到一個完全不同的地址。隨機內存地址

下面是從2個distincts執行兩個屏幕:

enter image description here

enter image description here

是什麼造成的?我正在使用虛擬機還是我的GLIBC版本? 我想這是GLIBC來防止緩衝區溢出,但我無法在網上找到我的答案。 它是完全隨機的嗎?

+0

BTW,您可以在虛擬機中使用Debian測試(或Linux Mint)進行開發。 – 2015-03-19 08:37:53

回答

2

首先,Glib(從GTK)不是GNU libc(又名glibc

然後,你正在觀察ASLR(地址空間佈局隨機化)的效果。不要試圖禁止它連接到服務器直接連接到Internet,這是一個有價值的安全措施。

ASLR主要是由所提供的Linux kernel(例如,用於初始堆棧移交時mmap(2)而不MAP_FIXED,作爲malloc大多數實現做,大概也在execve(2)時間)。改變你的libc(例如musl-libc)不會禁用它。

你可以在筆記本電腦上禁用系統範圍的ASLR(或某些VM內運行在Linux系統上)使用proc(5):運行

echo 0 > /proc/sys/kernel/randomize_va_space 

爲根。要小心,這樣做會降低系統的安全性。

我不知道你叫什麼完全隨機,但ASLR是夠隨機。 IIRC,(但我可能是錯的)64位地址的中間32位(假設一個64位的Linux系統)是非常隨機的,使得結果mmap(因此malloc使用它)實際上不可預測和非-reproducible。

BTW,看到ASLR在實踐中,多試幾次(啓用ASLR)以下命令

cat /proc/self/maps 

process的這個命令顯示的address space(在virtual memory)的文本表示運行cat命令。當您多次運行它時,您會看到不同的輸出!

對於調試memory leaks,請使用valgrind。用最近的GCC 4。9或更高(或最近Clang/LLVM)編譯器,address sanitizer也是有用的,所以你可以用gcc然後-Wall -Wextra編譯把所有的警告甚至多餘的,那麼-g獲得調試信息,然後-fsanitize=address

+0

好,所以這不是我想到的兩種可能性,完美! :) 不,我不會放棄它,不要擔心。我猜想攻擊者必須有真正的糟糕時間來猜測它的內存地址! – DoT 2015-03-19 08:30:45

+0

我不擔心。在實踐中,當用'gdb'在C(甚至C++)中調試低級內存問題時,我禁用ASLR以具有更多可重複的運行。 – 2015-03-19 08:32:02

+0

感謝大量的信息和鏈接,我會檢查一切。 但是這意味着ASLR不能在MacOS和Windows上運行? – DoT 2015-03-19 08:43:39