Ответ 1
Я ничего не знаю о PIE, скажите, пожалуйста, как создать независимый от позиции исполняемый файл.
Позиция Independent Executable или PIE позволяет переместить программу, как и общий объект. При каждом запуске программы программа может быть загружена по разным адресам, чтобы затруднить атакующему угадать определенное состояние программы.
Вы можете скомпилировать и связать исполняемый файл PIE одним из двух способов. Сначала скомпилируйте все с помощью -fPIE
и свяжите с -pie
. Во-вторых, скомпилировать все с помощью -fPIC
и связать с -pie
.
Если вы создаете как общий объект, так и программу, скомпилируйте все с помощью -fPIC
. Свяжите общий объект с -shared
и соедините программу с -pie
.
Вы не можете сделать это по-другому. То есть вы не можете скомпилировать все с помощью -fPIE
и создать как общий объект, так и программу. Подробнее см. Параметры генерации кода" в руководстве GCC.
Одна вещь, на которую нужно обратить внимание на Android: создание с PIE до 4.1 приведет к ошибке сегментации в /system/bin/linker
. PIE был добавлен на Android 4.1, и он сбрасывает меньшие версии.
Кто-то сказал мне, чтобы я поставил пользовательскую ссылку/загрузчик, чтобы избежать проблемы, но я не могу найти ссылку на данный момент.
Также см. Улучшения безопасности в Android от 1.5 до 4.1.
Ошибка: поддерживаются только отдельные независимые исполняемые файлы (PIE)
Да, это функция Lollipop. См. Улучшения безопасности в Android 5.0.
Вы можете проверить, построена ли программа с помощью PIE, используя readelf
:
$ readelf -l my-prog | grep -i "file type"
Elf filetype is DYN (shared object file)
Важная часть readelf
сообщает DYN
и не сообщает EXE
. EXE
означает, что ему не хватает PIE, и это должно вызвать дефект, связанный с безопасностью.
Связанный, см. Является ли PIE (независимый от позиции исполняемый файл) для основных исполняемых файлов, поддерживаемых в Android 4.0 (ICS)?