Tại sao vị trí của các biến môi trường khác nhau nhiều như vậy?


9

Đọc cuốn sách Hacking: Nghệ thuật khai thác của Jon Erickson, tôi đang cố gắng xấp xỉ địa chỉ của một biến môi trường SHELLCODEđể khai thác một chương trình.

Mỗi lần tôi chạy getenv("SHELLCODE");để lấy vị trí, kết quả lại hoàn toàn khác.

Trích xuất từ ​​vỏ của tôi:

> for i in $(seq 10); do ./a.out SHELLCODE; done
SHELLCODE is at 0xff9ab3a3
SHELLCODE is at 0xffcdb3a3
SHELLCODE is at 0xffb9a3a3
SHELLCODE is at 0xffa743a3
SHELLCODE is at 0xffdb43a3
SHELLCODE is at 0xfff683a3
SHELLCODE is at 0xffef03a3
SHELLCODE is at 0xffc1c3a3
SHELLCODE is at 0xff85a3a3
SHELLCODE is at 0xff8e03a3

Tôi hiểu rằng nếu tên chương trình được sửa đổi hoặc các biến môi trường mới được thêm vào, vị trí sẽ hơi khác nhau, nhưng tại sao vị trí lại thay đổi nhiều như vậy?


Các getenvnhãn hiệu nói nó trả về một con trỏ đến một chuỗi chứa giá trị của biến. Mọi thứ khác là không xác định, vì vậy kernel và / hoặc trình biên dịch của bạn có thể gắn giá trị bất cứ nơi nào họ muốn, miễn là lời hứa con trỏ đó vẫn đúng. Tôi đoán câu trả lời chính xác cho điều này có thể là phù thủy nặng nề và phụ thuộc vào các chi tiết thực hiện ánh xạ bộ nhớ khác nhau và pha của mặt trăng. (Tôi không đủ thuật sĩ để cung cấp cho bạn câu trả lời chính xác.)
Anko

"Tôi hiểu rằng nếu tên chương trình được sửa đổi hoặc các biến môi trường mới được thêm vào, vị trí sẽ hơi khác nhau, nhưng tại sao vị trí lại thay đổi nhiều như vậy?" Điều đó đúng trong đơn giản nhất trong tất cả các triển khai có thể, nhưng chắc chắn là không bắt buộc.
dmckee --- ex-moderator mèo con

Câu trả lời:


13

Những gì bạn mô tả là một tính năng chống khai thác được gọi là Ngẫu nhiên Bố cục Không gian Địa chỉ (ASLR). Về cơ bản, kernel đặt địa chỉ trên cùng của ngăn xếp cuộc gọi chức năng của chương trình tại một địa chỉ hơi "ngẫu nhiên" khác nhau mỗi khi kernel tải tệp ELF của chương trình từ đĩa. Các địa chỉ trong argvvà các biến môi trường, trong đó shellcode của bạn là một, kết thúc tại một địa chỉ khác nhau với mỗi lần gọi chương trình.

ASLR được cho là làm cho việc khai thác tràn bộ đệm và các lỗ hổng liên quan đến ngăn xếp khác trở nên khó khăn hơn. Người khai thác phải viết mã hoặc làm một cái gì đó để tính các địa chỉ khác nhau của các biến và giá trị trên ngăn xếp lệnh gọi hàm.

Có vẻ như bạn có thể vô hiệu hóa ASLR bằng cách thực hiện một số thứ như:

echo 0 > /proc/sys/kernel/randomize_va_space

là người dùng root. Vì bạn trích dẫn rõ ràng Ubuntu, nên lệnh trên là khác nhau:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

Vâng, đó là mẹo. Tôi đã nhận thấy rằng tác giả cuốn sách sử dụng Ubuntu 10.04, chưa có ASLR.
Janman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.