Найти адрес заглушки PLT

Я работаю на Linux X86_64.

У меня есть необходимость определить адрес конкретной записи PLT в файле ELF, учитывая имя динамической функции, которую представляет эта запись. Я могу определить смещение файла от адреса, но мне нужно уметь определить адрес.

Если я разоберу файл ELF, используя objdump -D -z elffile Я вижу, что objdump использует символические имена для каждой записи в PLT. (Где objdump получает связь между этими адресами и именами символов?)

пример:

0000000000000041a2b0 fileno@plt:

Если я использую objdump -T elffile | grep fileno Я получаю что-то вроде этого:

0000000000000   DF *UND*  00000000000000000   GLIBC_2.2.5 fileno

Что я должен уметь делать из "C", так это найти запись PLT в файле ELF для конкретной динамической функции и получить адрес.

Фон в том, что я исправляю существующий файл ELF и мне нужно перенаправить вызов функции в другую динамическую функцию. Я вручную пропатчил файл ELF, используя адреса, собранные в результате разборки objdump, и доказал, что это будет работать для моего конкретного приложения, мне просто нужно иметь возможность сделать это из программы. Я надеюсь, что мне не придется сканировать код дизассемблера objdump, чтобы выяснить, как он получает символы и адреса записи PLT.

1 ответ

Я понял это: вы должны проанализировать таблицу перемещений в разделе rela.plt. Эти записи содержат индекс таблицы строк, который можно использовать для поиска имени функции путем индексации в секции динамических символов. Каждая запись в разделе динамических символов содержит смещение таблицы динамических строк, которое можно использовать для извлечения имени функции. Когда вы найдете соответствующую функцию, индекс в таблице перемещений (+1) соответствует индексу в разделе.plt для записи функций PLT. Таким образом, чтобы вычислить адрес для определенной записи, это просто: .plt.sec address + ((relocation_index + 1) * .plt size entry)

Этот метод работает для x86. Он не работает для PPC, который имеет совершенно другой формат для раздела.plt. Если у кого-то есть информация о том, как это сделать для КПП, пожалуйста, пишите

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