爲了學習內存地址,我正在Debian上使用EGLIBC 2.13在虛擬機上工作。 所以我寫了一個簡單的代碼給我一個測試變量的地址,但是每次我執行這個腳本時,我都會得到一個完全不同的地址。隨機內存地址
下面是從2個distincts執行兩個屏幕:
是什麼造成的?我正在使用虛擬機還是我的GLIBC版本? 我想這是GLIBC來防止緩衝區溢出,但我無法在網上找到我的答案。 它是完全隨機的嗎?
爲了學習內存地址,我正在Debian上使用EGLIBC 2.13在虛擬機上工作。 所以我寫了一個簡單的代碼給我一個測試變量的地址,但是每次我執行這個腳本時,我都會得到一個完全不同的地址。隨機內存地址
下面是從2個distincts執行兩個屏幕:
是什麼造成的?我正在使用虛擬機還是我的GLIBC版本? 我想這是GLIBC來防止緩衝區溢出,但我無法在網上找到我的答案。 它是完全隨機的嗎?
首先,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
BTW,您可以在虛擬機中使用Debian測試(或Linux Mint)進行開發。 – 2015-03-19 08:37:53