2016-12-02 24 views
7

Hôm nay tôi đã xem xét tình huống sau. Tôi chạy nhiều lần chương trình sau đây:Tại sao địa chỉ của argc khác nhau ở mỗi lần chạy chương trình?

#include <stdio.h> 
int main(int argc, char **argv) { 
    printf("%p\n", &argc); 
} 

Trên một i7 với Linux và trình biên dịch gcc Intel, chương trình này cung cấp cho đầu ra khác nhau ở mỗi lần chạy:

i7:~/tmp$ gcc t.c 
i7:~/tmp$ ./a.out 
0x7fffc127636c 
i7:~/tmp$ ./a.out 
0x7fffdefed97c 
i7:~/tmp$ ./a.out 
0x7fff7f32454c 

Tôi hy vọng rằng các nhà phát triển của Linux, elf , gcc hoặc bất cứ điều gì có liên quan sẽ cố gắng để đảm bảo rằng ngăn xếp được định vị trên cùng một địa chỉ tại mỗi lời gọi của một chương trình. Nó sẽ tạo điều kiện truy tìm và sửa chữa các lỗi lạ có thể xảy ra khi giao dịch với con trỏ và địa chỉ của các biến (tương tự như địa chỉ ảo là tốt hơn để sửa lỗi so với địa chỉ vật lý).

Tôi tự hỏi tại sao ngăn xếp được ánh xạ tới các địa chỉ khác nhau ở mỗi lần gọi chương trình?

+11

https://en.wikipedia.org/wiki/Address_space_layout_randomization? – dbrank0

+2

OT: Nó phải là 'printf ("% p \ n ", (void *) &argc);', BTW. Bộ định danh chuyển đổi 'p' được định nghĩa cho' void'-con trỏ chỉ. – alk

+2

Related: http: // stackoverflow .com/questions/11238457/vô hiệu hóa và bật lại-địa chỉ-không gian-bố cục-ngẫu nhiên-chỉ-cho-bản thân mình – alk

Trả lời

14

Đây là vì lý do an ninh, vì vậy mà một kẻ tấn công không thể có thể làm cho quá nhiều giả định về bố trí bộ nhớ chính xác các biến, chức năng, ...

Hãy để tôi khuyến khích bạn đọc điều về «tràn bộ đệm các cuộc tấn công »(một trong những nguyên nhân có thể) và« ASLR »(Random Space Layout Randomization) là một trong những curation có thể ngăn ngừa một phần.

Vì vậy, nó là trường hợp mà các trình biên dịch tạo ra các địa chỉ cố định, nhưng thời gian chạy thay đổi một số trong những điều ...

Nếu bạn muốn thay đổi hành vi, xem disable ASLR in Linux ví dụ.

Các vấn đề liên quan