file
5.36 це чітко сказано
file
5.36 насправді чітко друкується, чи виконується файл PIE чи ні. Наприклад, виконуваний файл PIE показує:
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
а не PIE як:
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
Ця функція була введена в 5.33, але вона зробила лише просту chmod +x
перевірку. До цього його просто надрукували shared object
для PIE.
У 5.34, передбачалося почати перевірку більш спеціалізованих DF_1_PIE
метаданих ELF, але через помилку у впровадженні вони фактично зламали речі та показали виконувані файли GCC PIE як shared objects
.
Я інтерпретував file
вихідний код, включаючи помилку, а також саме, які байти формату ELF він перевіряє з неприємними деталями за посиланням: https://stackoverflow.com/questions/34519521/why-does-gcc-create-a-shared-object -intead-of-an-исполняемого-бінарного-згідно / 55704865 # 55704865
Короткий підсумок поведінки файлу 5.36:
- якщо
Elf32_Ehdr.e_type == ET_EXEC
- інше якщо
Elf32_Ehdr.e_type == ET_DYN
- якщо
DT_FLAGS_1
присутній запис динамічного розділу
- якщо
DF_1_PIE
встановлено DT_FLAGS_1
:
- ще
- ще
- якщо файл виконується користувачем, групою чи іншими
- ще
GDB запустіть виконуваний файл двічі і перегляньте ASLR
Одне дуже пряме, що ви можете зробити, це запустити виконуваний файл двічі через GDB і побачити, чи змінюється адреса через прогони через ASLR.
Я детально пояснив, як це зробити на веб- сайті: https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031 # 51308031
Хоча це не обов'язково є найбільш практичним рішенням і неможливо, якщо ви не довіряєте виконуваному файлу, це цікаво, і це остаточно перевіряє, що нас дійсно цікавить, а це якщо ядро Linux / динамічний завантажувач змінить місце виконання файлів або ні.