Trong khi đọc nó , tôi tìm thấy khai thác sau:
% cp /usr/bin/id ~
% chmod -x ~/id
% ls -al ~/id
-rw-r--r-- 1 edd edd 22020 2012-08-01 15:06 /home/edd/id
% ~/id
zsh: permission denied: /home/edd/id
% /lib/ld-linux.so.2 ~/id
uid=1001(edd) gid=1001(edd) groups=1001(edd),1002(wheel)
Đoạn mã này cho thấy rằng chúng ta có thể bỏ qua các quyền thực thi của hệ thống tệp một cách tầm thường như một người dùng không có đặc quyền bình thường. Tôi đã chạy nó trên Ubuntu 12.04.
Trong khi trình tải Linux là một đối tượng được chia sẻ theo tệp (1), nó cũng có một điểm vào cho phép nó được thực thi trực tiếp. Khi được thực thi theo cách này, trình tải Linux hoạt động như một trình thông dịch cho các nhị phân ELF.
Tuy nhiên, trên máy OpenBSD của tôi, việc khai thác này không hiệu quả, vì bạn không thể thực thi trình tải như một chương trình. Trang hướng dẫn OpenBSD cho biết: "ld.so chính nó là một đối tượng được chia sẻ ban đầu được tải bởi kernel.".
Hãy thử điều này trên Solaris 9, và bạn sẽ nhận được một segfault. Tôi không chắc chắn những gì xảy ra ở nơi khác.
Do đó, câu hỏi của tôi là:
- Tại sao trình tải Linux (khi được thực thi trực tiếp) không kiểm tra các thuộc tính hệ thống tệp trước khi diễn giải nhị phân ELF?
- Tại sao thực hiện một cơ chế được thiết kế không cho phép thực thi các tệp, nếu nó bị bỏ qua một cách tầm thường? Tôi đã bỏ lỡ một cái gì đó?
libc
(tôi đã làm một lần, nâng cấp hộp Arch), bạn sẽ rất biết ơn vì điều này.