Команда Linux objdump
objdump — важный инструмент командной строки в наборе инструментов GNU Binutils, используемый для отображения различной информации об объектных файлах и исполняемых файлах. Это мощный инструмент для бинарного анализа, обратной разработки и отладки в Linux-системах.
Основные функции objdump включают:
- Дизассемблирование бинарных файлов
- Просмотр информации о заголовке файла
- Отображение содержимого секций
- Просмотр таблицы символов
- Отображение информации о перемещениях
- Анализ структуры файла
Базовый синтаксис
Базовый формат команды objdump выглядит следующим образом:
objdump [选项] 文件名
Если параметры не указаны, objdump отображает информацию о заголовках секций файла.
Подробное объяснение общих опций
Параметры, связанные с дизассемблированием
Пример
-D, --disassemble-all # Дизассемблировать все секции
-S, --source # Смешанное отображение исходного кода и ассемблерного кода (требуется параметр -g при компиляции)
--prefix-addresses # Отображать полные адреса при дизассемблировании
--no-addresses # Не отображать информацию об адресах
Параметры информации о секциях
Пример
-j, --section=name# Показывать только содержимое указанной секции
Параметры таблицы символов
Пример
-T, --dynamic-syms # Показывать динамическую таблицу символов
Информация о заголовке файла
-f, --file-headers # 显示文件头部信息
Другие полезные параметры
Пример
-r, --reloc # Показывать записи перемещений
-R, --dynamic-reloc # Показывать записи динамических перемещений
-s, --full-contents # Отобразить полное содержимое всех секций
Практические примеры
Пример 1: Просмотр структуры исполняемого файла
objdump -h /bin/ls
Пример вывода:
/bin/ls: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 0000001c 0000000000400238 0000000000400238 00000238 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 0000000000400254 0000000000400254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
...
Пример 2: Дизассемблирование исполняемого файла
objdump -d /bin/ls
Пример вывода (частично):
0000000000405a50 : 405a50: 31 ed xor %ebp,%ebp 405a52: 49 89 d1 mov %rdx,%r9 405a55: 5e pop %rsi 405a56: 48 89 e2 mov %rsp,%rdx 405a59: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp ...
Пример 3: Просмотр таблицы символов
objdump -t myprogram.o
Пример вывода:
myprogram.o: file format elf64-x86-64 SYMBOL TABLE: 0000000000000000 l df *ABS* 0000000000000000 myprogram.c 0000000000000000 l d .text 0000000000000000 .text 0000000000000000 g F .text 0000000000000015 main 0000000000000000 *UND* 0000000000000000 printf
Пример 4: Смешанное отображение исходного кода и ассемблерного кода
objdump -S myprogram
Пример вывода:
Пример
400526: 55 push %rbp
400527: 48 89 e5 mov %rsp,%rbp
printf("Hello, World!n");
40052a: bf d4 05 40 00 mov $0x4005d4,%edi
40052f: e8 cc fe ff ff callq 400400
return 0;
400534: b8 00 00 00 00 mov $0x0,%eax
}
Практические сценарии применения
Сценарий 1: Отладка сбоев программы
Когда программа аварийно завершается, можно использовать objdump для просмотра кода рядом с адресом сбоя:
objdump -d --start-address=0x400526 --stop-address=0x400536 myprogram
Сценарий 2: Анализ вызовов библиотечных функций
Просмотр того, какие функции динамических библиотек вызывает программа:
objdump -T myprogram | grep UND
Сценарий 3: Изучение языка ассемблера
Изучайте язык ассемблера, дизассемблируя простые программы на C:
Пример
objdump -d simple
Примечания
- Отладочная информация: Чтобы получить информацию на уровне исходного кода, необходимо добавить
-goption - Влияние оптимизации: Оптимизация компилятора влияет на генерируемый код ассемблера; будьте внимательны при анализе
- Различия архитектур: Разные архитектуры процессоров имеют разные инструкции ассемблера; убедитесь, что используете правильные параметры дизассемблирования
- Проблемы с правами доступа: Для анализа системных файлов могут потребоваться права root
- Формат файла: objdump в основном предназначен для файлов формата ELF; другие форматы могут требовать специальной обработки
Дополнительные советы
Использование с другими инструментами
Пример
objdump -d myprogram | grep -A20 "main>:"
# Вычислить размеры функций
objdump -d myprogram | awk '/^[0-9a-f]+ :/ {print $1,$2}'
Создание скрипта дизассемблирования
Пример
# Пример скрипта дизассемблирования
if [ $# -ne 1 ]; then
echo "Использование: $0 "
exit 1
fi
echo "=== Информация о заголовке файла ==="
objdump -f $1
echo -e "n=== Информация о секции ==="
objdump -h $1
echo -e "n=== Дизассемблированный код ==="
objdump -d $1
Итог
objdump — мощный инструмент анализа бинарных файлов в Linux-системах. Его освоение позволяет:
- Глубоко понимать механизмы выполнения программ
- Быстро находить проблемы в программах
- Изучать язык ассемблера и системные знания
- Проводить базовый анализ методом обратной разработки
С базовым использованием и практическими примерами, рассмотренными в этой статье, вы уже сможете начать использовать objdump для базового анализа бинарных файлов. По мере накопления практического опыта вы откроете для себя больше его неочевидных возможностей в системном программировании и отладке.
Другие расширения
Энциклопедия команд Linux