Инструмент для редактирования символов .dynsym в файлах ELF

Вопрос или проблема

  • objcopy(1) может редактировать .symtab (среди прочих вещей), но не .dynsym.
  • elfedit(1) может модифицировать небольшие значения заголовков
  • patchelf(1) может изменять другую динамическую информацию (интерпретатор, библиотеки, soname), но не динамические символы.

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

LIEF — это инструмент для модификации elf, который может редактировать таблицу динамических символов:

# версия 0.13.2-1
from lief import *

elf = ELF.parse("/bin/ls")

# сделать существующий символ динамическим
for symbol in elf.symbols:
    if symbol.name.startswith("snake"):
        elf.add_dynamic_symbol(symbol)

# сделать один символ динамическим
if sym := elf.get_symbol("python"):
    elf.add_dynamic_symbol(sym)

# добавить совершенно новый символ
sym = ELF.Symbol()
sym.name = "rattlesnake"
# не забудьте использовать новую ссылку, которую
# возвращают функции `add_*`
sym = elf.add_dynamic_symbol(sym)
sym.type = ELF.SYMBOL_TYPES.FUNC
sym.binding = ELF.SYMBOL_BINDINGS.GLOBAL
for i, section in enumerate(elf.sections):
    if section.name == ".text":
        sym.shndx = i
        sym.value = section.virtual_address + 0x1337
        break

# сохранить измененный файл
elf.write("patched")

Мы можем подтвердить, что модификация действительно произошла:

$ readelf --dyn-syms -W patched | grep rattle
   120: 0000000000006357     0 FUNC    GLOBAL DEFAULT   12 rattlesnake

LIEF также имеет привязки для c и c++, больше документации о них можно найти на их сайте.

(Я также недавно использовал его для патча билда gdb, который не экспортировал правильные символы для libthread_db.so.1)

elfspirit, этот инструмент командной строки может решить вашу проблему.

Ответ или решение

Если вы ищете инструмент для редактирования динамической таблицы символов (.dynsym) в ELF-файлах, то ваше внимание следует обратить на пакет LIEF. Этот инструмент предоставляет обширные возможности для модификации ELF-файлов, включая добавление новых символов в таблицу динамических символов.

Зачем нужен редактирование .dynsym

Динамическая таблица символов (.dynsym) отвечает за хранение информации о символах, которые могут быть использованы для динамического связывания, например, функции, используемые библиотеками во время выполнения. Стандартные инструменты, такие как objcopy или patchelf, не предлагают возможность работы с .dynsym, оставляя вас в поисках инструмента, способного выполнить такие задачи.

Решение с помощью LIEF

LIEF — это библиотека, которая позволяет модифицировать и анализировать ELF-файлы, предоставляя расширенные возможности для управления динамическими символами.

Пример использования LIEF:

from lief import ELF

# Парсинг ELF-файла
elf = ELF.parse("/bin/ls")

# Сделать существующий символ динамическим
for symbol in elf.symbols:
    if symbol.name.startswith("snake"):
        elf.add_dynamic_symbol(symbol)

# Преобразовать одиночный символ в динамический
if sym := elf.get_symbol("python"):
    elf.add_dynamic_symbol(sym)

# Добавить совершенно новый символ
sym = ELF.Symbol()
sym.name = "rattlesnake"
sym = elf.add_dynamic_symbol(sym)
sym.type = ELF.SYMBOL_TYPES.FUNC
sym.binding = ELF.SYMBOL_BINDINGS.GLOBAL

# Найти нужный секционный индекс для символа
for i, section in enumerate(elf.sections):
    if section.name == ".text":
        sym.shndx = i
        sym.value = section.virtual_address + 0x1337
        break

# Записать изменения в новый файл
elf.write("patched")

После выполнения изменений, сохранённый файл можно проверить командой readelf для подтверждения успешной модификации:

$ readelf --dyn-syms -W patched | grep rattle

Дополнительные инструменты

Также вы можете рассмотреть elfspirit, инструмент командной строки, который может пригодиться для вашей задачи по редактированию символов.

Заключение

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

Учитывая всё вышесказанное, LIEF может стать вашим основным инструментом для работы с динамическими символами в ELF-файлах, особенно если требуется детальная и прецизионная модификация.

Оцените материал
Добавить комментарий

Капча загружается...