Струнный стол в ELF
Я получаю какой-то символ и получаю шестнадцатеричный код файла эльфа. Как я могу узнать, в каком разделе появляется этот символ?
Чем отличается
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
или
DYNSYM
section), который ссылается на эту строку по смещению в содержащем разделе. Запись в таблице символов может сказать вам индекс раздела, в котором находится этот символ, но не то, где он используется. Для этого вам необходимо проверить таблицу перемещений, содержащуюся в разделах типа
REL
; общие имена включают
.rel.dyn
,
.rel.plt
. В таблице перемещения перечислены все ссылки на символ в одном другом разделе кода, т. Е. Разделы кода и перемещения объединены в пары. Каждая запись в таблице представляет собой одно «использование» символа и содержит смещение в соответствующем разделе, где указано использование, и индекс символа в таблице символов.
Если вы можете использовать
readelf
утилита, вы можете легко использовать
readelf -r <binary> | grep <symbol name>
чтобы получить все ссылки на символ.
Если вы настроены на использование hexedit / не можете использовать readelf, вам необходимо
Найдите смещение строки имени символа в двоичном файле, в каком разделе он находится, а затем получите смещение этой строки в этом разделе;
Просмотрите все записи в таблице символов и найдите, какие из них соответствуют этому имени (
st_name
== смещение строки в строковой секции);Просмотрите все записи в каждой таблице перемещения, чтобы найти использование этого символа в соответствующем разделе кода для этой таблицы. Поле каждой записи содержит индекс записи таблицы символов, на которую он ссылается (этот индекс отображается на части
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