Практический анализ двоичных файлов
Покупка
Новинка
Издательство:
ДМК Пресс
Автор:
Эндриесс Дэннис
Перевод:
Слинкин Алексей Александрович
Год издания: 2022
Кол-во страниц: 460
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Дополнительное образование
ISBN: 978-5-97060-978-1
Артикул: 833983.01.99
В книге представлено подробное описание методов и инструментов, необходимых для анализа двоичного кода, который позволяет убедиться, что откомпилированная программа работает так же, как исходная, написанная на языке высокого уровня. Наряду с базовыми понятиями рассматриваются такие темы, как оснащение двоичной программы, динамический анализ заражения и символическое выполнение. В каждой главе приводится несколько примеров кода; к книге прилагается сконфигурированная виртуальная машина, включающая все примеры. Руководство адресовано специалистам по безопасности и тестированию на проникновение, хакерам, аналитикам вредоносных программ и всем, кто интересуется вопросами защиты ПО.
- Полная коллекция по информатике и вычислительной технике
- ДМК Пресс. Информационные системы и технологии
- ДМК Пресс. ИТ-технологии для обучающихся
- Интермедиатор. Информационные системы и технологии (сводная)
- Интермедиатор. ИТ-технологии для обучающихся (сводная)
- Локальные компьютерные сети. Программное обеспечение локальных сетей. ОС
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 02.03.02: Фундаментальная информатика и информационные технологии
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Дэннис Эндриесс Практический анализ двоичных файлов
PRACTICAL BINARY ANALYSIS Build Your Own Linux Tools for Binary Instrumentation, Analysis, and Disassembly Dennis Andriesse San Francisco
ПРАКТИЧЕСКИЙ АНАЛИЗ ДВОИЧНЫХ ФАЙЛОВ Как самому создать в Linux инструментарий для оснащения, анализа и дизассемблирования двоичных файлов Дэннис Эндриесс Москва, 2022
УДК 004.451.5 ББК 32.371 Э64 Эндриесс Д. Э64 Практический анализ двоичных файлов / пер. с англ. А. А. Слинкина. – М.: ДМК Пресс, 2022. – 460 с.: ил. ISBN 978-5-97060-978-1 В книге представлено подробное описание методов и инструментов, необходимых для анализа двоичного кода, который позволяет убедиться, что откомпилированная программа работает так же, как исходная, написанная на языке высокого уровня. Наряду с базовыми понятиями рассматриваются такие темы, как оснащение двоичной программы, динамический анализ заражения и символическое выполнение. В каждой главе приводится несколько примеров кода; к книге прилагается сконфигурированная виртуальная машина, включающая все примеры. Руководство адресовано специалистам по безопасности и тестированию на проникновение, хакерам, аналитикам вредоносных программ и всем, кто интересуется вопросами защиты ПО. УДК 004.451.5 ББК 32.371 Title of English-language original: Practical Binary Analysis: Build Your Own Linux Tools for Binary Instrumentation, Analysis, and Disassembly Reversing Modern Malware and Next Generation Threats, ISBN 9781593279127, published by No Starch Press Inc. 245 8th Street, San Francisco, California United States 94103. The Russian-Language 1st edition Copyright © 2021 by DMK Press Publishing under license by No Starch Press Inc. All rights reserved. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. ISBN 978-1-59327-912-7 (англ.) ISBN 978-5-97060-978-1 (рус.) © Dennis Andriesse, 2021 © Перевод, оформление, издание, ДМК Пресс, 2022
Посвящается Ноортье и Сиетсе
Глава ОГЛАВЛЕНИЕ Вступительное слово ...................................................................................................... 17 Предисловие ..................................................................................................................... 20 Благодарности .................................................................................................................. 21 Введение ............................................................................................................................ 22 ЧАСТЬ I. ФОРМАТЫ ДВОИЧНЫХ ФАЙЛОВ Глава 1. Анатомия двоичного файла ........................................................................... 32 Глава 2. Формат ELF ..............................................................................................52 Глава 3. Формат PE: краткое введение ................................................................78 Глава 4. Создание двоичного загрузчика с применением libbfd ......................... 88 ЧАСТЬ II. ОСНОВЫ АНАЛИЗА ДВОИЧНЫХ ФАЙЛОВ Глава 5. Основы анализа двоичных файлов в Linux...............................................109 Глава 6. Основы дизассемблирования и анализа двоичных файлов .................135 Глава 7. Простые методы внедрения кода для формата ELF ................................178 ЧАСТЬ III. ПРОДВИНУТЫЙ АНАЛИЗ ДВОИЧНЫХ ФАЙЛОВ Глава 8. Настройка дизассемблирования..................................................................212 Глава 9. Оснащение двоичных файлов ......................................................................244 Глава 10. Принципы динамического анализа заражения ....................................289 Глава 11. Практический динамический анализ заражения с по мощью libdft ...305 Глава 12. Принципы символического выполнения ................................................335 Глава 13. Практическое символическое выполнение с помощью Triton ..........361 ЧАСТЬ IV. ПРИЛОЖЕНИЯ Приложение A. Краткий курс ассемблера x86 .........................................................402 Приложение B. Реализация перезаписи PT_NOTE с помощью libelf .................422 Приложение C. Перечень инструментов анализа двоичных файлов ................443 Приложение D. Литература для дополнительного чтения ...................................447 Предметный указатель .................................................................................................451
Содержание 7 СОДЕРЖАНИЕ Вступительное слово .............................................................................................. 17 Предисловие ............................................................................................................... 20 Благодарности ............................................................................................................ 21 Введение ....................................................................................................................... 22 ЧАСТЬ I. ФОРМАТЫ ДВОИЧНЫХ ФАЙЛОВ Глава 1. Анатомия двоичного файла ............................................................ 32 1.1 Процесс компиляции программы на C ........................................................... 33 1.1.1 Этап препроцессирования .................................................................. 33 1.1.2 Этап компиляции .................................................................................. 35 1.1.3 Этап ассемблирования ......................................................................... 37 1.1.4 Этап компоновки .................................................................................. 38 1.2 Символы и зачищенные двоичные файлы .................................................... 40 1.2.1 Просмотр информации о символах .................................................. 40 1.2.2 Переход на темную сторону: зачистка двоичного файла ............ 42 1.3 Дизассемблирование двоичного файла ......................................................... 42 1.3.1 Заглянем внутрь объектного файла .................................................. 43 1.3.2 Изучение полного исполняемого двоичного файла ..................... 45 1.4 Загрузка и выполнение двоичного файла ..................................................... 48 1.5 Резюме .................................................................................................................... 50 Глава 2. Формат ELF ................................................................................................ 52 2.1 Заголовок исполняемого файла ....................................................................... 54 2.1.1 Массив e_ident ........................................................................................ 55 2.1.2 Поля e_type, e_machine и e_version .................................................... 56
Содержание 2.1.3 Поле e_entry ............................................................................................ 57 2.1.4 Поля e_phoff и e_shoff ........................................................................... 57 2.1.5 Поле e_flags .............................................................................................. 57 2.1.6 Поле e_ehsize ........................................................................................... 58 2.1.7 Поля e_*entsize и e_*num ..................................................................... 58 2.1.8 Поле e_shstrndx ...................................................................................... 58 2.2 Заголовки секций ................................................................................................. 59 2.2.1 Поле sh_name .......................................................................................... 60 2.2.2 Поле sh_type ............................................................................................ 60 2.2.3 Поле sh_flags............................................................................................ 61 2.2.4 Поля sh_addr, sh_offset и sh_size ......................................................... 61 2.2.5 Поле sh_link ............................................................................................. 62 2.2.6 Поле sh_info ............................................................................................. 62 2.2.7 Поле sh_addralign ................................................................................... 62 2.2.8 Поле sh_entsize ....................................................................................... 62 2.3 Секции .................................................................................................................... 62 2.3.1 Секции .init и .fini .................................................................................. 64 2.3.2 Секция .text ............................................................................................. 64 2.3.3 Секции .bss, .data и .rodata ................................................................... 66 2.3.4 Позднее связывание и секции .plt, .got, .got.plt ............................. 66 2.3.5 Секции .rel.* и .rela.* .............................................................................. 70 2.3.6 Секция .dynamic ..................................................................................... 71 2.3.7 Секции .init_array и .fini_array ............................................................. 72 2.3.8 Секции .shstrtab, .symtab, .strtab, .dynsym и .dynstr ....................... 73 2.4 Заголовки программы ........................................................................................ 74 2.4.1 Поле p_type .............................................................................................. 75 2.4.2 Поле p_flags ............................................................................................. 76 2.4.3 Поля p_offset, p_vaddr, p_paddr, p_filesz и p_memsz ........................ 76 2.4.4 Поле p_align ............................................................................................. 76 2.5 Резюме .................................................................................................................... 77 Глава 3. Формат PE: краткое введение ....................................................... 78 3.1 Заголовок MS-DOS и заглушка MS-DOS .......................................................... 79 3.2 Сигнатура PE, заголовок PE-файла и факультативный заголовок PE ..... 79 3.2.1 Сигнатура PE .......................................................................................... 82 3.2.2 Заголовок PE-файла .............................................................................. 82 3.2.3 Факультативный заголовок PE ........................................................... 83 3.3 Таблица заголовков секций ............................................................................... 83 3.4 Секции .................................................................................................................... 84 3.4.1 Секции .edata и .idata ............................................................................ 85 3.4.2 Заполнение в секциях кода PE ........................................................... 86 3.5 Резюме .................................................................................................................... 86 Глава 4. Создание двоичного загрузчика с применением libbfd ................................................................................................................................. 88 4.1 Что такое libbfd? ................................................................................................... 89 4.2 Простой интерфейс загрузки двоичных файлов .......................................... 89
Содержание 9 4.2.1 Класс Binary ............................................................................................. 92 4.2.2 Класс Section ........................................................................................... 92 4.2.3 Класс Symbol ........................................................................................... 92 4.3 Реализация загрузчика двоичных файлов ..................................................... 93 4.3.1 Инициализация libbfd и открытие двоичного файла ................... 94 4.3.2 Разбор основных свойств двоичного файла ................................... 96 4.3.3 Загрузка символов................................................................................. 99 4.3.4 Загрузка секций ....................................................................................102 4.4 Тестирование загрузчика двоичных файлов ...............................................104 4.5 Резюме ...................................................................................................................106 ЧАСТЬ II. ОСНОВЫ АНАЛИЗА ДВОИЧНЫХ ФАЙЛОВ Глава 5. Основы анализа двоичных файлов в Linux .........................109 5.1 Разрешение кризиса самоопределения с помощью file ............................110 5.2 Использование ldd для изучения зависимостей .........................................113 5.3 Просмотр содержимого файла с помощью xxd ...........................................115 5.4 Разбор выделенного заголовка ELF с помощью readelf .............................117 5.5 Разбор символов с по мощью nm .....................................................................119 5.6 Поиск зацепок с по мощью strings ..................................................................122 5.7 Трассировка системных и библиотечных вызовов с по мощью strace и ltrace ....................................................................................................................125 5.8 Изучение поведения на уровне команд с помощью objdump .................129 5.9 Получение буфера динамической строки с по мощью gdb .......................131 5.10 Резюме ...................................................................................................................134 Глава 6. Основы дизассемблирования и анализа двоичных файлов ...........................................................................................................................135 6.1 Статическое дизассемблирование ..................................................................136 6.1.1 Линейное дизассемблирование ........................................................136 6.1.2 Рекурсивное дизассемблирование ...................................................139 6.2 Динамическое дизассемблирование ..............................................................142 6.2.1 Пример: трассировка выполнения двоичного файла в gdb .......143 6.2.2 Стратегии покрытия кода ..................................................................146 6.3 Структурирование дизассемблированного кода и данных ......................150 6.3.1 Структурирование кода ......................................................................151 6.3.2 Структурирование данных .................................................................158 6.3.3 Декомпиляция.......................................................................................160 6.3.4 Промежуточные представления .......................................................162 6.4 Фундаментальные методы анализа ...............................................................164 6.4.1 Свойства двоичного анализа .............................................................164 6.4.2 Анализ потока управления ................................................................169 6.4.3 Анализ потока данных ........................................................................171 6.5 Влияние настроек компилятора на результат дизассемблирования .....175 6.6 Резюме ...................................................................................................................177
Содержание Глава 7. Простые методы внедрения кода для формата ELF ......178 7.1 Прямая модификация двоичного файла с помощью шестнадцатеричного редактирования ..........................................................178 7.1.1 Ошибка на единицу в действии ........................................................179 7.1.2 Исправление ошибки на единицу ....................................................182 7.2 Модификация поведения разделяемой библиотеки с по мощью LD_PRELOAD .........................................................................................................186 7.2.1 Уязвимость, вызванная переполнением кучи ..............................186 7.2.2 Обнаружение переполнения кучи....................................................189 7.3 Внедрение секции кода .....................................................................................192 7.3.1 Внедрение секции в ELF-файл: общий обзор ................................192 7.3.2 Использование elfinject для внедрения секции в ELF-файл ......195 7.4 Вызов внедренного кода ...................................................................................198 7.4.1 Модификация точки входа .................................................................199 7.4.2 Перехват конструкторов и деструкторов........................................202 7.4.3 Перехват записей GOT ........................................................................205 7.4.4 Перехват записей PLT ..........................................................................208 7.4.5 Перенаправление прямых и косвенных вызовов ........................209 7.5 Резюме ...................................................................................................................210 ЧАСТЬ III. ПРОДВИНУТЫЙ АНАЛИЗ ДВОИЧНЫХ ФАЙЛОВ Глава 8. Настройка дизассемблирования .................................................212 8.1 Зачем писать специальный проход дизассемблера? .................................213 8.1.1 Пример специального дизассемблирования: обфусцированный код ........................................................................213 8.1.2 Другие причины для написания специального дизассемблера .......................................................................................216 8.2 Введение в Capstone ...........................................................................................217 8.2.1 Установка Capstone ..............................................................................218 8.2.2 Линейное дизассемблирование с по мощью Capstone ................219 8.2.3 Изучение Capstone C API ....................................................................224 8.2.4 Рекурсивное дизассемблирование с по мощью Capstone ...........225 8.3 Реализация сканера ROP-гаджетов ................................................................234 8.3.1 Введение в возвратно-ориентированное программирование ..............................................................................234 8.3.2 Поиск ROP-гаджетов ............................................................................236 8.4 Резюме ...................................................................................................................242 Глава 9. Оснащение двоичных файлов .....................................................244 9.1 Что такое оснащение двоичного файла? .......................................................244 9.1.1 API оснащения двоичных файлов ....................................................245 9.1.2 Статическое и динамическое оснащение двоичных файлов ....246 9.2 Статическое оснащение двоичных файлов ..................................................248 9.2.1 Подход на основе int 3 .........................................................................248 9.2.2 Подход на основе трамплинов ..........................................................250