Дэннис Эндриесс - Практический анализ двоичных файлов
Название: | Практический анализ двоичных файлов | |
Автор: | Дэннис Эндриесс | |
Жанр: | Linux, Крэкинг и реверсинжиниринг | |
Изадано в серии: | неизвестно | |
Издательство: | ДМК Пресс | |
Год издания: | 2021 | |
ISBN: | 978-5-97060-978-1 | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "Практический анализ двоичных файлов"
В книге представлено подробное описание методов и инструментов, необходимых для анализа двоичного кода, который позволяет убедиться, что откомпилированная программа работает так же, как исходная, написанная на языке высокого уровня. Наряду с базовыми понятиями рассматриваются такие темы, как оснащение двоичной программы, динамический анализ заражения и символическое выполнение. В каждой главе приводится несколько примеров кода; к книге прилагается сконфигурированная виртуальная машина, включающая все примеры. Руководство адресовано специалистам по безопасности и тестированию на проникновение, хакерам, аналитикам вредоносных программ и всем, кто интересуется вопросами защиты ПО.
Читаем онлайн "Практический анализ двоичных файлов". [Страница - 121]
памяти 4 байта (двойное слово, или DWORD). Аналогично один из
способов обратиться к полю структуры struct – поместить начальный адрес структуры в регистр базы и прибавить смещение нужного
поля.
В x86-64 разрешено использовать в качестве базы операнда в памяти регистр rip (указатель команды), хотя в таком случае запрещается использовать индексный регистр. Компиляторы нередко
пользуются этой возможностью, в частности для создания позиционно-независимого кода и доступа к данным, так что в двоичных
файлах на платформе x86-64 нередко можно встретить адресацию
относительно rip.
Краткий курс ассемблера x86
409
A.2.5 Непосредственные операнды
Непосредственные операнды – это целые числа, являющиеся частью
самой команды. Например, в команде add rax, 42 значение 42 – непосредственный операнд.
В x86 непосредственные операнды кодируются в прямом формате – младший байт многобайтового целого числа располагается в памяти первым. Иначе говоря, если ассемблерная команда имеет вид
mov ecx, 0x10203040, то в соответствующей машинной команде байты
непосредственного операнда будут следовать в порядке 0x40302010.
Для кодирования целых чисел со знаком в x86 применяется дополнительный код, когда отрицательное значение получается из положительного инвертированием всех битов и прибавлением 1, переполнения при этом игнорируются. Например, для кодирования 4-байтового
целого, равного –1, мы берем целое 0x00000001 (шестнадцатеричное
представление 1), инвертируем все биты, получая 0xfffffffe, и прибавляем к результату 1 – в итоге получается представление в дополнительном коде, 0xffffffff. Когда в процессе дизассемблирования
кода вы видите непосредственное значение или значение в памяти,
начинающееся несколькими байтами 0xff, то, скорее всего, это отрицательное число.
Познакомившись с форматом и общими принципами работы команд x86, рассмотрим семантику некоторых часто употребляемых команд, которые встретятся вам в этой книге и собственных проектах
двоичного анализа.
A.3
Употребительные команды x86
В табл. A.3 описано несколько команд x86. Для получения информации
о командах, не упомянутых в таблице, обратитесь к онлайновому справочному руководству, например http://ref.x86asm.net/, или к официальному руководству Intel по адресу https://software.intel.com/en-us/articles/
intel-sdm/. Большая часть перечисленных команд не нуждается в объяснении, но некоторые заслуживают более подробного обсуждения.
Таблица A.3. Употребительные команды x86
Команда
Описание
Пересылка данных
mov dst, src
dst = src
xchg dst1, dst2 Обменять местами dst1 и dst2
Поместить src в стек и уменьшить rsp
push src
add
sub
inc
neg
cmp
410
dst, src
dst, src
dst
dst
src1, src2
Арифметические
dst += src
dst –= src
dst –= 1
dst = –dst
Установить флаги состояния на основе результата вычисления src1 – src2
Приложение A
Таблица А.3 (окончание)
Команда
Описание
Логические/поразрядные
dst &= src
dst |= src
dst ^= src
dst = ~dst
Установить флаги состояния на основе результата вычисления src1 & src2
Безусловные переходы
jmp addr
Переход по адресу
call addr
Поместить адрес возврата в стек, затем вызвать функцию по адресу
ret
Извлечь адрес возврата из стека и вернуть управление по этому адресу
Войти в ядро и выполнить системный вызов
syscall
Условные переходы (в зависимости от флагов состояния)
jcc addr переходит по адресу, только если выполнено условие cc,
иначе проваливается на следующую команду
jncc addr переходит по адресу, только если условие cc не выполнено
je addr/jz addr Перейти, если поднят флаг нуля (например, в результате последней команды
cmp операнды оказались равны)
ja addr
Перейти, если в результате последнего сравнения без знака оказалось dst > src
(above)
jb addr
Перейти, если в результате последнего сравнения без знака оказалось dst < src
(below)
jg addr
Перейти, если в результате последнего сравнения со знаком оказалось dst > src
(greater than)
jl addr
Перейти, если в результате последнего сравнения со знаком оказалось dst < src
(less than)
jge addr
Перейти, если в результате последнего сравнения со знаком оказалось dst >= src
jl addr
Перейти, если в результате последнего сравнения со знаком оказалось dst 5, если argc
больше 5, или сообщение argc 5) {
printf("argc > 5\n");
} else {
printf("argc --">
Книги схожие с «Практический анализ двоичных файлов» по жанру, серии, автору или названию:
Пол Тронкон, Карл Олбинг - Bash и кибербезопасность: атака, защита и анализ из командной строки Linux Жанр: Linux Год издания: 2020 Серия: Для профессионалов |
Брайан Уорд - Внутреннее устройство Linux Жанр: Современные российские издания Год издания: 2015 |