Позиционно-независимые исполняемые файлы и ptrace

Я хотел бы проследить PIE на Linux и, например, разбить по указанному адресу инструкции. Из разборки у меня есть относительный адрес инструкции - как я могу узнать местоположение, в которое был загружен исполняемый файл, чтобы я мог получить абсолютный адрес?

GDB может отследить пироги - как с этим справиться?

1 ответ

Решение

как это с этим справится?

В Linux динамический загрузчик ld-linux... имеет специальную функцию: _dl_debug_state(), который вызывает загрузчик непосредственно перед загрузкой разделяемых библиотек и сразу после нее, и сразу после установки глобальной переменной: _r_debug.r_state в RT_ADD или же RT_CONSISTENT,

Отладчик может установить точку останова для этой функции, проверить .r_state а также _r_debug.r_mapи при этом выясните, какие двоичные файлы ELF загружены по какому адресу.

Этот механизм был использован, чтобы обнаружить, где, например, libc.so.6 был загружен задолго до PIE двоичные файлы были поддержаны. PIE Двоичный файл - это особый случай разделяемой библиотеки, поэтому точно такой же механизм работает и для него.

Возникает вопрос: как GDB обнаруживает, где ld-linux сам был загружен (поэтому точка останова на _dl_debug_state() можно установить). Ядро сообщает это через вспомогательный вектор, AT_BASE запись. Больше информации о aux vector здесь.

Другие вопросы по тегам