Objdump linux как пользоваться

Обновлено: 06.07.2024

Список программ для работы с двоичными файлами в операционной системе Linux .

GNU Debugger ( GDB ) - отладчик GDB хорош не только для отладки приложений с ошибками . Он также может использоваться для того, чтобы узнать о самом нижнем уровне управления программой, изменить этот нижний уровень управления программой, изменить код, регистры и структуры данных. Эти функции являются крайне полезными в процессе поиска уязвимостей программного обеспечения, изучения структуры и принципов работы вредоносного кода. Отладчик GDB работает с двоичными файлами ELF и процессами Linux .

Objdump

Objdump из GNU binutils . Дамп объекта ( objdump ) - простое и понятное решение для быстрого дизассемблирования программного кода. Objdump отлично подходит для дизассемблирования простых и неповреждённых двоичных файлов, но все его ограничения сразу выплывут на поверхность при попытке использовать objdump для любого, действительно сложного реверса, особенно в ситуациях, использования данной программы против вредоносного ПО. Основная слабость objdump заключается в том, что он, в своей работе, полностью полагается на заголовки раздела ELF и не выполняет необходимый анализ нижнего уровня управления . Оба эти ограничения значительно снижают надёжность программы , что приводит к невозможности правильно дизассемблировать код внутри двоичного файла, а возможно, что даже к возникновению ошибок при простой попытке открыть двоичный файл, не имеющий в своей структуре заголовков разделов. Однако, для многих простых и обычных задач, он идеально подходит . Например, при дизассемблировании обычных двоичных файлов , которые не расширяются , не удаляются , не используют обфускацию . Он может читать все распространенные типы двоичных ELF файлов. Вот несколько примеров использования программы objdump :

• Просмотрите все данные / код в каждом разделе файла ELF:

objdump -D <elf_object>

• Просмотр только программного кода в файле ELF:

objdump -d <elf_object>

• Просмотреть все символы:

objdump -tT <elf_object>

Objcopy

Objcopy из GNU binutils. Копирование объекта ( Objcopy ) - невероятно мощный и миниатюрный инструмент, но при этом весь его функционал крайне тяжело уместить всего в нескольких предложениях. Я настоятельно рекомендую вам прочитать страницы руководства для изучения полного описания данной программы. Objcopy можно использовать для анализа и изменения объектов ELF любого типа , хотя некоторые из его функций специфичны для определенных типов объектов ELF. Objcopy часто используется для изменения или копирования раздела ELF в двоичный файл ELF или обратно, раздела ELF из файла.

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

Для копирования секции .data из объекта ELF в файл , используйте следующую команду:

objcopy –only-section=.data <infile> <outfile>

Strace

Трассировка системного вызова ( strace ) - это инструмент, основанный на системном вызове ptrace (2) , он

использует запрос PTRACE_SYSCALL в цикле для отображения информации о системном вызове в запущенной программе, а также сигналов, которые

были перехвачены во время исполнения программы. Эта программа может быть очень полезна для отладки или просто для сбора информации о том, какие именно системные вызовы вызываются во время исполнения программного кода.

Команда strace , используемая для трассировки базовой программы :

strace / bin / ls -o ls.out

Команда strace , используемая для подключения к существующему процессу , выглядит следующим образом:

strace -p <pid> -o daemon.out

Первоначальный вывод команды ( по умолчанию ) покажет вам номер дескриптора файла каждого системного вызова , который принимает в качестве своего аргумента дескриптор файла, например:

SYS_read (2, buf, sizeof (buf));

Если вы хотите увидеть все данные, которые считывались в дескриптор файла 2 , вы можете выполнить следующую команду:

strace -e read = 2 / bin / ls

Вы также можете использовать параметр -e write = fd для просмотра записанных данных . Программа strace - отличный инструмент, и у вас, несомненно, будет целый ряд причин, чтобы его использовать.

ltrace

Библиотека трассировки ( ltrace ) - еще один мощный инструмент, который очень похож на strace . ltrace работает аналогично , но фактически анализирует информацию о связывании разделяемых библиотек программы и печатает используемые библиотечные функции .

Вы можете увидеть системные вызовы в дополнение к вызовам библиотечных функций при помощи параметра -s .

Команда ltrace предназначена для предоставления более детальной информации, поскольку она анализирует динамический сегмент исполняемого файла и печатает фактические символы / функции из общих и статические библиотеки .

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

ltrace <program> -o program.out

ftrace

Функция трассировки ( ftrace ) - это инструмент, очень похожий на ltrace , он

показывает вызовы функций внутри самого двоичного файла .

Readelf

Программа readelf - это пожалуй, один из самых полезных инструментов для анализа двоичных файлов формата ELF. Readelf анализирует каждый бит данных, используемый в формате ELF и позволяет получить большое количество информации об объекте ещё до его реверс инжиниринга . Readelf используется для сбора информации о символах , сегментах , разделах , записях релокации , динамическом связывании данных и ещё много другой полезной информации. Команда readelf - это

Швейцарский армейский нож для файлов формата ELF .

Примеры некоторых из наиболее часто используемых функций readelf:

readelf -S <object>

readelf -l <object>

readelf -s <object>

  • Получение данных заголовка файла формата ELF:

readelf -e <object>

readelf -r <object>

readelf -d <object>

Послесловие

А какие программы для анализа бинарных файлов в операционной системе Linux знаете и используете Вы? Поделитесь своим личным опытом и расскажите об этом в комментариях !

image

На русском языке довольно мало информации про то, как работать с ELF-файлами (Executable and Linkable Format — основной формат исполняемых файлов Linux и многих Unix-систем). Не претендуем на полное покрытие всех возможных сценариев работы с эльфами, но надеемся, что информация будет полезна в виде справочника и сборника рецептов для программистов и реверс-инженеров.

Подразумевается, что читатель на базовом уровне знаком с форматом ELF (в противном случае рекомендуем цикл статей Executable and Linkable Format 101).

Под катом будут перечислены инструменты для работы, описаны приемы для чтения метаинформации, модификации, проверки и размножения создания эльфов, а также приведены ссылки на полезные материалы.

— Я тоже эльф… Синий в красный… Эльфы очень терпеливы… Синий в красный… А мы эльфы. Синий в красный… От магии одни беды…
(с) Маленькое королевство Бена и Холли

В большинстве случаев примеры можно выполнить как на Linux, так и на Windows.

В рецептах мы будем использовать следующие инструменты:

  • утилиты из набора binutils (objcopy, objdump, readelf, strip);
  • фреймворк radare2;
  • hex-редактор с поддержкой шаблонов файлов (в примерах показан 010Editor, но можно использовать, например, свободный Veles);
  • Python и библиотеку LIEF;
  • другие утилиты (ссылки указаны в рецепте).

В качестве «подопытного» будем использовать ELF-файл simple из таска nutcake's PieIsMyFav на crackmes.one, но подойдёт любой представитель «эльфийского» семейства. Если готовый файл с требуемыми характеристиками не был найден в свободном доступе, то будет приведён способ создания такого эльфа.

«Свободных» эльфов можно также найти по ссылкам:

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

Тип файла, заголовок, секции

В зависимости от задачи интерес могут представлять:

  • тип файла (DYN — библиотека, EXEC — исполняемый, RELOC — линкуемый);
  • целевая архитектура (E_MACHINE — x86_64, x86, ARM и т.д.);
  • точка входа в приложение (Entry Point);
  • информация о секциях.

010Editor

HEX-редактор 010Editor предоставляет систему шаблонов. Для ELF-файлов шаблон называется, как ни странно, ELF.bt и находится в категории Executable (меню Templates — Executable).
Интерес может представлять, например, точка входа в исполняемый файл (entry point) (записана в заголовке файла).

image

readelf

Утилиту readelf можно считать стандартом де-факто для получения сведений об ELF-файле.

Для удобства чтения адреса приведены к 32-битному формату:

Для удобства чтения адреса приведены к 32-битному формату:

Вывод сокращён для удобства чтения:

Опция -W нужна для увеличения ширины консольного вывода (по умолчанию, 80 символов).

Прочитать заголовок и информацию о секциях можно с использованием кода на Python и библиотеки LIEF (предоставляет API не только для Python):

Информация о компиляторе

objdump

readelf

Я вычислю тебя по… RPATH

Эльфы могут сохранять пути для поиска динамически подключаемых библиотек. Чтобы не задавать системную переменную LD_LIBRARY_PATH перед запуском приложения, можно просто «вшить» этот путь в ELF-файл.

Для этого используется запись в секции .dynamic с типом DT_RPATH или DT_RUNPATH (см. главу Directories Searched by the Runtime Linker в документации).

И будь осторожен, юный разработчик, не «спали» свою директорию проекта!

Как появляется RPATH?

Основная причина появления RPATH-записи в эльфе — опция -rpath линковщика для поиска динамической библиотеки. Примерно так:

Такая команда создаст в секции .dynamic RPATH-запись со значением /run/media/pablo/disk1/projects/cheat_sheets/ELF/lib/ .

readelf

Посмотреть элементы из секции .dynamic (среди которых есть и RPATH) можно так:

Для удобства чтения результат команды сокращён:

С помощью библиотеки LIEF также можно прочитать RPATH-запись в эльфе:

Проверка эльфа на безопасность

Скрипт проверки безопасности checksec.sh от исследователя Tobias Klein (автора книги A Bug Hunter's Diary) не обновлялся с 2011 года. Данный скрипт для ELF-файлов выполняет проверку наличия опций RelRO (Read Only Relocations), NX (Non-Executable Stack), Stack Canaries, PIE (Position Independent Executables) и для своей работы использует утилиту readelf.

Можно сделать свой аналог на коленке Python и LIEF (чуть короче прародителя и с дополнительной проверкой опции separate-code):

Radare2

Спасибо dukebarman за дополнение по использованию Radare2 для вывода информации аналогично checksec:

«Сырой код» из эльфа (binary from ELF)

Бывают ситуации, когда «эльфийские одёжи» в виде ELF-структуры не нужны, а нужен только «голый» исполняемый код приложения.

objcopy

Использование objcopy вероятно знакомо тем, кто пишет прошивки:

  • -S — для удаления символьной информации;
  • -g — для удаления отладочной информации.

Никакой магии. Просто взять содержимое загружаемых секций и слепить из них бинарь:

Mangled — demangled имена функций

В ELF-ах, созданных из С++ кода, имена функций декорированы (манглированы) для упрощения поиска соответствующей функции класса. Однако читать такие имена при анализе не очень удобно.

Для представления имён в удобочитаемом виде можно использовать утилиту nm из набора binutils:

Вывод имён символов в деманглированном виде с использованием библиотеки LIEF:

Эльф без метаинформации

После того как приложение отлажено и выпускается в дикий мир, имеет смысл удалить метаинформацию:

  • отладочные секции — бесполезны в большинстве случаев;
  • имена переменных и функций — совершенно ни на что не влияют для конечного пользователя (чуть усложняет реверс);
  • таблица секций — совершенно не нужна для запуска приложения (её отсутсвие чуть усложнит реверс).

Удаление символьной информации

Символьная информация — это имена объектов и функций. Без неё реверс приложения немного усложняется.

strip

В самом простом случае можно воспользоваться утилитой strip из набора binutils. Для удаления всей символьной информации достаточно выполнить команду:

  • для исполняемого файла:
  • для динамической библиотеки:

sstrip

Для тщательного удаления символьной информации (в том числе ненужных нулевых байтов в конце файла) можно воспользоваться утилитой sstrip из набора ELFkickers. Для удаления всей символьной информации достаточно выполнить команду:

C использованием библиотеки LIEF также можно сделать быстрый strip (удаляется таблица символов — секция .symtab ):

Удаление таблицы секций

Как упоминалось выше, наличие/отсутствие таблицы секций не оказывает влияния на работу приложения. Но при этом без таблицы секций реверс приложения становится чуть сложнее.
Воспользуемся библиотекой LIEF под Python и примером удаления таблицы секций:

Изменение и удаление RPATH

chrpath, PatchELF

Для изменения RPATH под Linux можно воспользоваться утилитами chrpath (доступна в большинстве дистрибутивов) или PatchELF.


Данная статья является продолжением этой статьи. Предлагаю без лишних слов перейти к обзору оставшихся утилит.

objcopy

На самом деле, эта утилита не является «вспомогательной». В toolchain’ах она используется для формирования файла прошивки (в виде *.hex или *.bin).

Дело в том, что линкер (ld) формирует выходной (исполняемый) файл в формате ELF. Этот формат является стандартом исполняемых файлов в большинстве UNIX-подобных систем. Кроме, собственно, кода и данных (секций .text и .data и т. д) ELF-файл содержит кучу дополнительной информации (заголовок, сведения о динамических зависимостях, отладочную информацию и т. д.). В случае МК – нам нужна «голая» прошивка, без заголовков и отладочной информации.

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

В самом простом случае, это делается следующей командой:

arm-none-eabi-objcopy.exe -O ihex LcdTest.elf LcdTest.hex

ключ "–O" определяет формат выходного файла. Нам, прежде всего, интересны форматы «ihex» и «binary».

На самом деле, objcopy очень мощная утилита, которая позволяет производить множество манипуляций с объектными и ELF файлами. Можно удалять, добавлять, переименовывать секции, менять точку входа и т. д.

Например, можно «вытянуть» из ELF только секцию .data в бинарный файл.

arm-none-eabi-objcopy.exe -O binary -j .data LcdTest.elf LcdTest.bin

Но все эти возможности (IMHO) необходимы уж в очень специфических случаях, поэтому не вижу смысла разбирать все возможности утилиты.

objdump

Очень полезная утилита. Позволяет получить дательную информацию по внутренностям объектного файла, в т. ч дизассемблировать код.
Запустив утилиту с ключом «-x» (x – показать содержимое всех заголовков), мы получим огромною «простыню» текста, в котором содержится информация о секциях, символах, таблицах вызовов, и т. д

arm-none-eabi-objdump.exe -x LCD.o

Еще более полезной функцией данной утилиты является возможность дизассемблировать файл (ключ «–D»). Более того, если объектный файл содержит отладочную информацию – можно дополнительно указать ключ «-S», и утилита выдаст «смещанный код»: итроки исходного кода + соответствующее дизассемблированные команды.

arm-none-eabi-objdump.exe -DS LCD.o

ranlib

Утилита предназначена для индексирования содержимого статических библиотек (архивов, созданных утилитой ar). Утилита индексирует все символы всех объектных файлов внутри архива и помешает сам индекс в архив. Наличие такого индекса существенно уменьшает время линковки больших статических библиотек.

readelf

Утилита предназначена для получения информации по внутренностям ELF файла. Позволяет просмотреть информацию по секрециям, символам, динамическим зависимостям. В принципе, практически всю эту информацию можно получить с помощью «objdump -x».

Например, получение информации по секциям, содержащимся в ELF ( ключ «-S»):

arm-none-eabi-readelf.exe -S LcdTest.elf

Это симулятор, который теоретически позволяет нам запускать прошивку на ПК. Но он умеет только интерпретировать определенный набор инструкций (например, Thumb). Периферию он не эмулирует, а без периферии наш МК будет глух и нем.

Использовать симулятор, теоретически, можно в связке с отладчиком gdb. Для этого в отладчике перед загрузкой программы нужно выполнить команду «target sim». Вот только без симуляции периферии он, IMHO, бесполезен (ну, разве что какие-то математические алгоритмы отлаживать).

Работа с симулятором выглядит как-то так:

(gdb) target sim
Connected to the simulator.
(gdb) load
Loading section startup, size 0x44 vma 0x100000
Loading section prog, size 0x23a1c vma 0x100044
Loading section .data, size 0xb10 vma 0x200000
Start address 0x117a34
Transfer rate: 1190784 bits in <1 sec.
(gdb) run
Starting program: C:\Projects\Eclipse\MultiLock\locker.elf

Простенькая, но очень полезная утилита, которая показывает размер секций .text, .data и .bss в объектном или ELF файле. Это позволяет узнать: сколько ПЗУ и ОЗУ занимает собранная прошивка.

47004 – размер кода (ПЗУ)
0 – размер инициализированных данных (ПЗУ и ОЗУ)
3228 – размер неинициализированных данных (ОЗУ)

strings

Утилита предназначена для поиска строковых констант в объектном, ELF или бинарном файле. Строковой константой утилита считает последовательность (4 и более) печатных (printable) символов, которая заканчивается непечатным символом (unprintable). На практике, наряду с действительно строковыми константами, утилита находит в файле кучу мусора, которые по логике утилиты «похожи» на стоковые константы.

strip

Утилита позволяет удалить из объектного или ELF файла символы определенного типа. Например, можно удалить из собранного файла всю отладочную информацию:

arm-none-eabi-strip.exe –g LcdTest.elf

В нашем случае, толку от данного инструмента мало. Утилита objcopy, которая используется для поручения файла прошивки, автоматически обрезает всю отладочную и прочую «ненужную» информацию.

Просмотр информации об объектных файлах.

  • Вывести дизассемблированное содержимое исполняемого сегмента:
  • Вывести всё содержимое всех секций в шестнадцатеричном представлении:

ntfsfix

pacman

Система управления пакетами в Arch Linux. Синхронизовать локальную базу данных…

Как получить дерево директорий на Bash одним однострочником

Фото Как установить PostgreSQL на Linux и создать базу и пользователя

Как установить PostgreSQL на Linux и создать базу и пользователя

PostgreSQL - система управления базой данных общего назначения. Одна из самых распространённых баз данных, используемая на многих коммерческих и некоммерческих проектах.

Фото Как скопировать вывод команды из терминала в буфер обмена Linux и MacOS

Как скопировать вывод команды из терминала в буфер обмена Linux и MacOS

Скорее приятный, чем необходимы "трюк", но возможность использовать возможность скопировать вывод в буфер обмена – действительно круто иной раз выручает.

Фото Как создать неизменяемый файл в Linux / MacOS / FreeBSD

Как создать неизменяемый файл в Linux / MacOS / FreeBSD

Само собой, root может всё (если введёт пару команд), однако, это вполне легальный способ запретить изменение файла.

Фото Как удалить все Docker образы и контейнеры

Как удалить все Docker образы и контейнеры

Не всегда нужно удалять всё, но объяснение данного "рецепта" объяснит как в целом удалять образы и контейнеры.

Фото Bash < потоки ввода > вывода && управляющие конструкции || коротко о главном

Bash < потоки ввода > вывода && управляющие конструкции || коротко о главном

Небольшая заметка о конструкциях Bash, в которых путается большинство новичков. А именно: >, <, &, &&, |, ||

Фото Лучше плохо, но сейчас. Взгляд на пути развития ПО

Лучше плохо, но сейчас. Взгляд на пути развития ПО

Сейчас такие языки как Perl и Ruby чувствуют себя не лучшим образом. Но ещё 10 – 15 лет назад они были на "гребне волны".

Фото Как запустить программу в терминале в фоне, без вывода какого либо текста

Как запустить программу в терминале в фоне, без вывода какого либо текста

Запускаем программу в терминале в фоновом режиме и разбираемся, как и почему это работает в Linux / Unix терминале.

Фото Малоизвестные, но полезные возможности утилиты less

Малоизвестные, но полезные возможности утилиты less

Команда less является одной из самых известных на ряду с cd, cp, mv и т.д. Но используется less зачастую далеко не на всю мощь.

Фото Как синхронизировать локальную Git версию репозитория с серверной

Как синхронизировать локальную Git версию репозитория с серверной

Прибираемся в локальной версии Git – чтобы локальная версия соответствовала удалённой (серверной) версии Git проекта.

Фото Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable

Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable

Исследователи сумели пройти code-review с реквестами в ядро Linux, заведомо содержащими добавление уязвимостей.

Фото Microsoft открывает исходники, а её IDE супер-популярна

Microsoft открывает исходники, а её IDE супер-популярна

Решил сложить пару фактов и немного над этим поразмыслить. Реально ли Microsoft "переобулись"?

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Как на Bash посчитать число строк в проекте (директории)

Как на Bash посчитать число строк в проекте (директории)

Ниже будет представлен однострочник, решающий данную задачу на Bash + пошаговое описание его работы.

Фото Как на Bash получить файлы, изменённые за сегодняшний день

Как на Bash получить файлы, изменённые за сегодняшний день

Bash имеет огромные возможности по программированию/скриптованию и администрированию операционной системы. Не важно: Linux это, FreeBSD, или MacOS – на Bash можно сделать многое.

Фото Как установить часовой пояс в Linux

Как установить часовой пояс в Linux

В рамках первичной настройки Операционной Системы важно установить и по какому времени вы живёте, ведь при следующем обновлении времени через Интернет ваше время слетит.

Фото Как найти самые большие папки и файлы в Linux

Как найти самые большие папки и файлы в Linux

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

Фото Команда grep – полезные ключи и примеры использования

Команда grep – полезные ключи и примеры использования

У команды "grep" довольно много различных особенностей. особенно, если учесть, что с английского это "решето" – а что может войти в решето , не факт что выйдет!

Читайте также: