2009-12-17 3 views
6

Tôi đang chơi xung quanh với một số mã khi tôi nhận thấy một cái gì đó kỳ lạ:Con trỏ ngăn xếp giả ngẫu nhiên dưới Linux?

[~] main% cat test.cc 
#include <stdio.h> 

void f() 
{ 
    int i; 
    fprintf(stderr, "&i = 0x%08X\n", (long)&i); 
} 

int main(int argc, char**argv) 
{ 
    f(); 
} 
[~] main% g++ test.cc 
[~] main% ./a.out 
&i = 0xBFA27AB4 
[~] main% ./a.out 
&i = 0xBFAD7E24 
[~] main% ./a.out 
&i = 0xBFCA3464 
[~] main% ./a.out 
&i = 0xBF96C064 
[~] main% 

Điều kỳ lạ đối với tôi là sự thay đổi trong địa chỉ của biến i.

Tôi đoán là hạt nhân cung cấp các địa chỉ bắt đầu ngăn xếp khác nhau để cố gắng ngăn chặn một số loại vết nứt. Lý do thực sự là gì?

Trả lời

8

Address space layout randomisation được sử dụng trên một số hệ điều hành vì lý do chính xác này. Biến thể của bạn trong địa chỉ con trỏ ngăn xếp cũng có thể được gây ra bởi điều này - rất có thể là trường hợp trên các phiên bản gần đây của Linux và hoặc * BSD. Các phiên bản Windows gần đây của IIRC cũng thực hiện điều này.

+5

Nếu bạn muốn thử nghiệm với ASLR bị vô hiệu hóa, bạn có thể làm điều đó với 'echo 0>/proc/sys/kernel/randomize_va_space' (như là thư mục gốc, tất nhiên). – caf

+1

@caf: Cảm ơn gợi ý. http://en.wikipedia.org/wiki/Address_space_layout_randomization –