file
5,36 nói rõ ràng
file
5.36 thực sự in nó rõ ràng nếu thực thi là PIE hay không. Ví dụ, một tệp thực thi PIE hiển thị như:
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
và một người không PIE như:
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
Tính năng này được giới thiệu vào 5.33 nhưng nó chỉ là một chmod +x
kiểm tra đơn giản . Trước đó nó chỉ in shared object
cho PIE.
Trong 5.34, nó có nghĩa là bắt đầu kiểm tra DF_1_PIE
siêu dữ liệu ELF chuyên dụng hơn , nhưng do lỗi trong quá trình triển khai, nó thực sự đã phá vỡ mọi thứ và hiển thị các tệp thực thi GCC PIE như shared objects
.
Tôi đã giải thích file
mã nguồn, bao gồm cả lỗi và chính xác các byte của định dạng ELF mà nó kiểm tra chi tiết rõ ràng tại: https://stackoverflow.com/questions/34519521/why-does-gcc-create-a- Shared-object -instead-of-an-execable-binary-theo / 55704865 # 55704865
Tóm tắt nhanh về hành vi của tệp 5.36 là:
- nếu
Elf32_Ehdr.e_type == ET_EXEC
- khác nếu
Elf32_Ehdr.e_type == ET_DYN
- nếu
DT_FLAGS_1
mục động phần là hiện tại
- nếu
DF_1_PIE
được đặt trong DT_FLAGS_1
:
- khác
- khác
- nếu tập tin được thực thi bởi người dùng, nhóm hoặc người khác
- khác
GDB chạy thực thi hai lần và xem ASLR
Một điều rất trực tiếp mà bạn có thể làm là chạy hai lần thực thi thông qua GDB và xem liệu địa chỉ có thay đổi trong các lần chạy do ASLR không.
Tôi đã giải thích cách thực hiện điều đó một cách chi tiết tại: https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-poseition-indeperee-executables-in-gcc-and-ld/51308031 # 51308031
Mặc dù đây không nhất thiết là giải pháp thiết thực nhất và không thể thực hiện được nếu bạn không tin tưởng vào khả năng thực thi, nhưng thật thú vị và đó là kiểm tra cuối cùng mà chúng tôi thực sự quan tâm, đó là nếu hạt nhân / trình tải động của Linux thay đổi vị trí thực thi hay không phải.