2012-01-23 29 views
5

Tôi đã tạo hai chương trình C là bản sao chính xác của nhau. Biên dịch chúng trên nền tảng Linux (Ubuntu 10.04) bằng trình biên dịch gcc và thu được hai tệp thực thi riêng biệt. mã của cả hai tập tin thực thi bằng cách sử dụng objdump và thấy rằng mã lắp ráp là chính xác giống nhau và thậm chí cả địa chỉ của các lệnh tương ứng trong hai tập tin lắp ráp là giống nhau. Chương trình được in địa chỉ của một biến trong chương trình. và hơn nữa cùng một chương trình tạo ra một địa chỉ khác nhau khi chạy mỗi lần. Tại sao địa chỉ của các dòng mã là giống nhau trong hai chương trình nhưng địa chỉ của các thay đổi biến ngay cả đối với cùng một chương trình mỗi khi nó được chạy.I nghĩ rằng địa chỉ được in của biến trên màn hình là địa chỉ ảo nhưng nếu ảo của nó tại sao nó không thể giống nhau mỗi lần. Là địa chỉ được hiển thị trong mã lắp ráp thu được bởi objd ump cũng là ảo?Tại sao địa chỉ của biến tiếp tục thay đổi giữa các lần chạy

+0

Hầu như tất cả các địa chỉ hiển thị đều nằm trong các hệ điều hành + CPU hiện đại. Hơn nữa, địa chỉ không cần phải giống nhau, bởi vì không có yêu cầu cho hầu hết các ngôn ngữ lập trình. –

Trả lời

5

Đó là do address space layout randomization.

Để trích dẫn Wikipedia:

Địa chỉ bố trí không gian ngẫu nhiên (ASLR) là một phương pháp bảo mật máy tính trong đó bao gồm việc sắp xếp một cách ngẫu nhiên vị trí của khu vực dữ liệu quan trọng, thường bao gồm các cơ sở của thực thi và vị trí của các thư viện, đống và ngăn xếp, trong không gian địa chỉ của quy trình.

Lợi ích

gian Địa chỉ ngẫu nhiên gây cản trở một số loại tấn công bảo mật bằng cách làm cho nó khó khăn hơn cho một kẻ tấn công để dự đoán địa chỉ đích. Ví dụ, những kẻ tấn công đang cố gắng thực hiện các cuộc tấn công trả về-libc phải xác định mã được thực thi, trong khi những kẻ tấn công khác đang cố gắng thực thi shellcode được tiêm trên ngăn xếp phải tìm chồng trước. Trong cả hai trường hợp, các địa chỉ bộ nhớ liên quan bị che khuất bởi những kẻ tấn công. Những giá trị này phải được đoán, và một phỏng đoán sai lầm thường không thể phục hồi do ứng dụng bị lỗi.

Ví dụ, khi tôi liên tục chạy file thực thi tương tự sản xuất từ ​​mã C sau trên Ubuntu 10.10 hộp của tôi:

#include <stdio.h> 

int g = 0; 

int main() { 
    int x = 0; 
    printf("%p %p\n", &x, &g); 
} 

Địa chỉ của biến cục bộ (x) tiếp tục thay đổi, nhưng địa chỉ của biến toàn cục (g) vẫn giữ nguyên.

+0

Bạn có thể giải thích tại sao địa chỉ của biến toàn cục không thay đổi? Khi chúng ta thay đổi ngẫu nhiên địa chỉ của các vùng dữ liệu chính. Điều này cũng sẽ thay đổi phạm vi địa chỉ của phần "dữ liệu" trong bộ nhớ ảo của quá trình - có chứa biến toàn cục này. – user3834119

1

Có, bạn sẽ luôn nhận được giá trị thay đổi trong biến Địa chỉ. điều này là bởi vì, khi bạn lập trình đến trong chế độ đang chạy, khi bạn thực hiện các câu lệnh khai báo biến, mỗi bộ điều khiển thời gian tạo các biến dựa trên các vị trí bộ nhớ có sẵn. Đây là lý do duy nhất, rằng mỗi khi nó trả về giá trị khác nhau cho địa chỉ.

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