Положение независимых исполняемых файлов и Android Lollipop
Я написал исходный код.c (в ecllipse), который использует библиотеку libcap для получения информации, связанной с сетевым трафиком. Теперь я создал исполняемый двоичный файл с помощью ndk-build в ecllipse. Я поместил созданный бинарный файл в папку libs/armeabi в папку /data/local/ моего андроида (root nexus 5, Lollypop) и попытался запустить бинарный файл. но андроид выкидывает эту ошибку
Ошибка: поддерживаются только независимые от позиции исполняемые файлы (PIE)
Я ничего не знаю о PIE. Пожалуйста, скажите мне, как создать независимый от позиции исполняемый файл.
2 ответа
Я ничего не знаю о PIE. Пожалуйста, скажите мне, как создать независимый от позиции исполняемый файл.
Независимый от позиции исполняемый файл или 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, и это должно вызвать дефект, связанный с безопасностью.
Я знаю, что это старая тема, но этот хакерский способ может сэкономить время некоторых людей
с помощью Hex-редактора найдите 17-й байт, измените значение с 02 на 03, и все!