Струнный стол в ELF

  1. Я получаю какой-то символ и получаю шестнадцатеричный код файла эльфа. Как я могу узнать, в каком разделе появляется этот символ?

  2. Чем отличается strtab а также shstrtab? есть также массив строк символов?

Когда я получаю индекс в таблице имен, это индекс в strtab или же shstrtab?

2 ответа

Для первого вопроса нам понадобится hexedit файла elf, чтобы правильно понять.

Для второго вопроса - strtab обозначает Строковую Таблицу, shstrtab обозначает Строковую Таблицу Заголовка Раздела.

Когда мы читаем заголовок ELF, мы видим, что каждая структура ElfHeader содержит член с именем e_shstrndx. Это указатель на шстртаб. Если вы используете этот индекс, а затем читаете из shstrtab, вы можете найти название этого раздела.

strtab, таблица строк для всех других ссылок. Когда вы читаете символы из объекта ELF, каждая структура SYmbol (Elf32_Sym) имеет член с именем st_name. Это индекс в strtab для получения имени строки этого символа.

Не могли бы вы подробнее рассказать о массиве символьных строк? Кроме того, что вы подразумеваете под таблицей имен?

Вы можете обратиться к следующей ссылке - Чтение таблицы строк ELF в Linux из C

Надеюсь, что это ответ на ваш вопрос.

Я могу нанести удар по первому вопросу, поскольку Самир так хорошо ответил на второй.

Название символа будет в одном из STRTAB разделов, и тогда будет запись в таблице символов (одна из SYMTAB или DYNSYMsection), который ссылается на эту строку по смещению в содержащем разделе. Запись в таблице символов может сказать вам индекс раздела, в котором находится этот символ, но не то, где он используется. Для этого вам необходимо проверить таблицу перемещений, содержащуюся в разделах типа REL; общие имена включают .rel.dyn, .rel.plt. В таблице перемещения перечислены все ссылки на символ в одном другом разделе кода, т. Е. Разделы кода и перемещения объединены в пары. Каждая запись в таблице представляет собой одно «использование» символа и содержит смещение в соответствующем разделе, где указано использование, и индекс символа в таблице символов.

Если вы можете использовать readelf утилита, вы можете легко использовать readelf -r <binary> | grep <symbol name> чтобы получить все ссылки на символ.

Если вы настроены на использование hexedit / не можете использовать readelf, вам необходимо

  1. Найдите смещение строки имени символа в двоичном файле, в каком разделе он находится, а затем получите смещение этой строки в этом разделе;

  2. Просмотрите все записи в таблице символов и найдите, какие из них соответствуют этому имени ( st_name == смещение строки в строковой секции);

  3. Просмотрите все записи в каждой таблице перемещения, чтобы найти использование этого символа в соответствующем разделе кода для этой таблицы. Поле каждой записи содержит индекс записи таблицы символов, на которую он ссылается (этот индекс отображается на части r_info, и в разных местах для 32- и 64-битных).

Все записи о перемещении, соответствующие этому индексу таблицы символов, являются использованием вашей строки где-то.

Больше информации:

Таблица символов: https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-79797.html

Таблица перемещения: https://docs.oracle.com/cd/E19683-01/816-1386/6m7qcoblj/index.html#chapter6-54839

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