file
5.36 ясно говорит
file
5.36 фактически печатает это ясно, если исполняемый файл - ПИРОГ или нет. Например, исполняемый файл PIE выглядит так:
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
и не пирог, как:
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
Эта функция была представлена в 5.33, но она просто chmod +x
проверила. До этого он просто печатался shared object
для пирога.
В 5.34 предполагалось начать проверку более специализированных DF_1_PIE
метаданных ELF, но из-за ошибки в реализации это фактически сломало вещи и показало исполняемые файлы GCC PIE как shared objects
.
Я интерпретировал file
исходный код, включая ошибку, и какие именно байты формата ELF он проверяет в мельчайших подробностях по адресу: https://stackoverflow.com/questions/34519521/why-does-gcc-create-a-shared-object -instead-оф-ан-исполняемым-двоично-по-с / 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
:
- Распечатать
pie executable
- еще
- Распечатать
shared object
- еще
- если файл исполняемый пользователем, группой или другими
- Распечатать
pie executable
- еще
- Распечатать
shared object
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 изменяет местоположение исполняемого файла или не.