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
Trả lời
Đó 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.
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
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ỉ.
- 1. SessionID tiếp tục thay đổi trong ASP.NET MVC tại sao?
- 2. Tại sao tôi không thể thay đổi biến long_query_time biến tại thời gian chạy
- 3. Tại sao địa chỉ của biến cục bộ thay đổi khi thực thi nhiều lần, nhưng không phải khi gỡ lỗi với GDB?
- 4. Tại sao git tiếp tục xóa thư mục của tôi?
- 5. C địa chỉ của một địa chỉ của một biến
- 6. Tại sao các tệp của tôi tiếp tục biến mất khỏi trình điều hướng dự án của xcode?
- 7. Tại sao trình biên dịch không biết địa chỉ của các biến cục bộ tại thời gian biên dịch?
- 8. tại sao instanceof tiếp tục nói đúng sau khi nguyên mẫu thay đổi?
- 9. Tại sao kênh RabbitMQ của tôi tiếp tục đóng?
- 10. Làm thế nào để pdb nhận ra rằng nguồn đã thay đổi giữa các lần chạy?
- 11. Tại sao bạn không thể lấy địa chỉ của nullptr?
- 12. Visual Studio tiếp tục thay đổi tệp project.sln
- 13. Thay đổi địa chỉ điểm cuối WebService tại thời gian chạy
- 14. Tại sao bản sao MongoDB của tôi tiếp tục bị tụt hậu?
- 15. Thay đổi App.config tại Thời gian chạy
- 16. Giữ các biến cố định trong bộ nhớ giữa các lần chạy tập lệnh Python
- 17. Ứng dụng toàn màn hình tiếp tục chuyển đổi các địa điểm
- 18. Tại sao thông số RSpec của tôi chạy hai lần?
- 19. setTimeout dường như đang thay đổi các biến của tôi! Tại sao?
- 20. Tại sao chạy `git pull` xóa các thay đổi đã cam kết của tôi?
- 21. Tại sao địa chỉ của biến dễ bay hơi này luôn ở mức 1?
- 22. Tại sao lỗi này tiếp tục làm rối tung thanh công cụ IDE2 của XE2?
- 23. Tại sao MS SQL Mgmt Studio Express tiếp tục quên mật khẩu của tôi?
- 24. Tại sao bàn phím mềm bị ẩn khi tiếp tục?
- 25. Tại sao các trang web Azure của tôi tiếp tục đi xuống?
- 26. Tại sao không nên thay đổi kiểu dáng khi chạy?
- 27. Làm thế nào để có được các điểm địa lý hiện tại chỉ một lần trong iphone?
- 28. Tại sao đường dẫn không gian làm việc TFS của tôi tiếp tục tự bản thân?
- 29. Tại sao Microsoft khuyên các trường chỉ đọc với các giá trị có thể thay đổi?
- 30. phiên PHP thay đổi biến giữa các trang
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. –