Đọ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?
getenv
nhã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.)