Библиотека knigago >> Компьютеры: Операционные системы >> Linux >> Практический анализ двоичных файлов


"Дело о загадочном убийстве" Валерия Карышева — захватывающий и интригующий детективный роман, который держит читателя в напряжении от первой до последней страницы. История разворачивается вокруг серии загадочных убийств в небольшом провинциальном городке. Жертвы — молодые женщины с похожими чертами лица и образом жизни. Детектив Андрей Верховинский берется за расследование, обещая раскрыть правду за любыми угрозами. Верховинский — блестящий детектив с острым умом и неутомимой...

Дэннис Эндриесс - Практический анализ двоичных файлов

Практический анализ двоичных файлов
Книга - Практический анализ двоичных файлов.  Дэннис Эндриесс  - прочитать полностью в библиотеке КнигаГо
Название:
Практический анализ двоичных файлов
Дэннис Эндриесс

Жанр:

Linux, Крэкинг и реверсинжиниринг

Изадано в серии:

неизвестно

Издательство:

ДМК Пресс

Год издания:

ISBN:

978-5-97060-978-1

Отзывы:

Комментировать

Рейтинг:

Поделись книгой с друзьями!

Помощь сайту: донат на оплату сервера

Краткое содержание книги "Практический анализ двоичных файлов"

В книге представлено подробное описание методов и инструментов, необходимых для анализа двоичного кода, который позволяет убедиться, что откомпилированная программа работает так же, как исходная, написанная на языке высокого уровня. Наряду с базовыми понятиями рассматриваются такие темы, как оснащение двоичной программы, динамический анализ заражения и символическое выполнение. В каждой главе приводится несколько примеров кода; к книге прилагается сконфигурированная виртуальная машина, включающая все примеры. Руководство адресовано специалистам по безопасности и тестированию на проникновение, хакерам, аналитикам вредоносных программ и всем, кто интересуется вопросами защиты ПО.

Читаем онлайн "Практический анализ двоичных файлов". [Страница - 121]

предполагается, что длина каждого элемента равна 4 байтам. Здесь DWORD PTR говорит ассемблеру, что мы хотим выбрать из
памяти 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 --">

Оставить комментарий:


Ваш e-mail является приватным и не будет опубликован в комментарии.