Наблюдения
Когда исполняемый файл Linux скомпилирован как PIE (Position Independent Executable, по умолчанию в Ubuntu 18.04), символы из общих библиотек (например, libc) будут разрешены, когда программа начнет выполняться, установка переменной среды LD_BIND_NOW в значение null не будет откладывать это процесс.
Однако, если исполняемый файл скомпилирован с флагом -no-pie
, разрешение символа может контролироваться LD_BIND_NOW.
Вопрос
Можно ли управлять разрешением символов из общих библиотек в исполняемом файле ELF PIE?
Ниже приведен код и системная информация в моем тесте,
ubuntu: 18.04
kernel: Linux 4.15.0-50-generic #54-Ubuntu SMP Mon May 6 18:46:08 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
gcc: gcc (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0
#include <stdio.h>
int main() {
printf("Hello world!\n");
}
Подробности экспериментов (что приводит к приведенным выше выводам).
Эксперименты проводятся в gdb-peda
. Поиск gdb-peda
в выходных данных покажет команды, используемые для каждого шага.
Адрес, сохраненный в GOT-записи для puts
, будет отображаться (disp
) всякий раз, когда выполнение продолжается в GDB. Таким образом, этап, когда он залатан с реальным адресом, может быть легко обнаружен.
Выходы для -no-pie
двоичного теста.
Выходы для pie
двоичного теста.
Кстати, тот же вопрос был первоначально размещен в Reck Engineering Stack Exchange , и ответ там подтвердил приведенные выше наблюдения.