Недавно я узнал, что (по крайней мере, в Fedora и Red Hat Enterprise Linux) исполняемые программы, которые скомпилированы как независимые от позиции исполняемые файлы (PIE), получают более надежную защиту от рандомизации адресного пространства (ASLR).
Итак: Как проверить, был ли определенный исполняемый файл скомпилирован как независимый от позиции исполняемый файл в Linux?
-pie -fpie
специальные флаги компилятора, чтобы скомпилировать программу в виде пирога. Эта ссылка содержала другую интересную информацию - спасибо!Ответы:
Вы можете использовать
perl
скрипт, содержащийся вhardening-check
пакете, доступный в Fedora и Debian (ashardening-includes
). Прочтите эту вики-страницу Debian, чтобы узнать, какие флаги компиляции проверены. Это специфично для Debian, но теория применима и к Red Hat.Пример:
источник
sudo apt-get install hardening-includes
и тогдаhardening-check
исполняемый Perl-скрипт доступен по обычномуPATH
(/usr/bin/hardening-check
); просто гнида: Предложите удалить./
из ответа ;-)devscripts
.Я использовал
readelf --relocs
для проверки статической или динамической библиотеки PIC на x86-64 следующим образом:Мы видим здесь
R_X86_64_32
иR_X86_64_32S
. Это означает, что код не зависит от позиции. Когда я перестраиваю библиотеку с -fPIC, я получаю:Этот метод, вероятно, может работать для исполняемых файлов, но я не использовал его таким образом.
источник
-fPIE -no-pie
, он всегда будет загружаться по одному и тому же адресу, даже если он мог быть связан как исполняемый файл PIE. Используйтеfile a.out
и ищитеELF executable
(не PIE) против общего объекта ELF (PIE): 32-разрядные абсолютные адреса больше не разрешены в x86-64 Linux?Просто используйте
file
на двоичном:Обратите внимание на другой тип, напечатанный после информации LSB.
источник
executable
иshared object
. Я предполагаю, что общие объекты должны быть перемещаемыми, поэтому, на мой взгляд, они были скомпилированы с помощью PIE.gcc -fPIE -pie
теперь это значение по умолчанию во многих дистрибутивах.file
5.36 теперь может фактически распознавать PIE-nessness на основеDT_1_PIE
флагаDT_FLAGS_1
, и четко говоритpie executable
вместоshared object
.file
5.36 ясно говоритfile
5.36 фактически печатает это ясно, если исполняемый файл - ПИРОГ или нет. Например, исполняемый файл PIE выглядит так:и не пирог, как:
Эта функция была представлена в 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
executable
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 изменяет местоположение исполняемого файла или не.
источник
setarch -R
man7.org/linux/man-pages/man8/setarch.8.html «-R, --addr-no-randomize
Отключает рандомизацию виртуального адресного пространства. ВключаетADDR_NO_RANDOMIZE
». man7.org/linux/man-pages/man2/personality.2.html "ADDR_NO_RANDOMIZE
(начиная с Linux 2.6.12). При установленном флаге отключите рандомизацию размещения адресного пространства."На Github есть скрипт bash checksec.sh для проверки свойств смягчения исполняемых файлов (включая RELRO, Stack Canary, NX bit, PIE, RPATH, RUNPATH, Fortify Source).
Запустить
checksec
с-f
(входной файл) аргументами:источник