Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Майкл_Сикорски,_Эндрю_Хониг_Вскрытие_покажет!_Практический_анализ.pdf
Скачиваний:
15
Добавлен:
19.04.2024
Размер:
17.17 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

.

 

 

 

 

9

 

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

OllyDbg

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Эта глава посвящена OllyDbg — отладчику для платформы x86, разработанному Олегом Ющуком. OllyDbg предоставляет возможность анализировать вредоносные программы во время их выполнения. Этот бесплатный и простой в использовании инструмент имеет множество плагинов, которые расширяют его возможности, поэтому он часто применяется для аналитики безопасности и обратного проектирования.

OllyDbg имеет давнюю и интересную историю. Сначала он использовался для взлома ПО, а обретя популярность, стал основным инструментом для анализа вредоносов и исследования уязвимостей. Но затем компания Immunity, занимающаяся безопасностью, купила кодовую базу OllyDbg 1.1 и переименовала этот продукт

вImmunity Debugger (ImmDbg). Целью компании было сделать его более подходящим для поиска уязвимостей и исправить в нем программные ошибки. Итоговые изменения оказались косметическими и коснулись лишь графического интерфейса ImmDbg. Тем не менее при этом была добавлена поддержка полноценного интерпретатора Python вместе с API, благодаря чему некоторые пользователи все же перешли с OllyDbg на ImmDbg.

Но ничего страшного, если вы предпочитаете ImmDbg, так как это, в сущности, тот же OllyDbg 1.1, и все, чему вы научитесь в этой главе, относится к обоим отладчикам. Стоит лишь обратить внимание на то, что многие подключаемые модули OllyDbg не подходят к ImmDbg, и, пока их не перенесут на новую платформу, вы не сможете ими пользоваться. ImmDbg имеет некоторые преимущества, например возможность расширения функций за счет использования Python API (подробнее об этом — в разделе «Отладка с использованием скриптов» в конце этой главы).

Возвращаясь к непростой истории OllyDbg, нужно упомянуть версию 2.0, выпущенную в июне 2010 года. Она разрабатывалась фактически с нуля, но на момент написания этой книги так и не получила широкого распространения. Многие считают ее бета-версией. В этой и последующих главах мы будем отмечать ситуации,

вкоторых она предоставляет полезные возможности, отсутствующие в версии 1.1.

Загрузка вредоносного ПО

Начать отладку в OllyDbg можно несколькими способами. Вы можете загружать исполняемые файлы и даже DLL напрямую. Если вредонос уже запущен в системе, вы можете подключиться к его процессу и таким образом приступить к отладке.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

206  Часть III  •  Продвинутый динамический анализ

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

OllyDbg позволяет удобно запускать вредоносный код с поддержкой режима командной строки или выполнять отдельные участки внутри DLL.

Открытие исполняемого файла

Чтобы начать отладку вредоносной программы, проще всего выбрать пункт меню File Open (Файл Открыть) и перейти к исполняемому файлу, который вы хотите загрузить (рис. 9.1). Если отлаживаемая вами программа требует задания аргументов, вы можете указать их в поле Arguments (Аргументы) диалогового окна открытия файлов (в OllyDbg это единственный этап, на котором можно передать аргументы командной строки).

Рис. 9.1. Открытие исполняемого файла с указанием аргументов командной строки

После этого OllyDbg загрузит двоичный файл с помощью собственного загрузчика. Это похоже на загрузку файлов в Windows.

По умолчанию OllyDbg останавливается на точке входа, известной как WinMain. Если ее местоположение не удается определить, OllyDbg берет адрес точки входа из PE-заголовка. Параметры запуска можно изменить с помощью меню Options Debugging Options (Параметры Параметры отладки). Например, чтобы отладчик останавливался немедленно, до выполнения какого-либо кода, выберите пункт System Breakpoint (Системная точка останова).

ПРИМЕЧАНИЕ

OllyDbg 2.0 имеет больше параметров остановки, чем версия 1.1. Например, выполнение можно остановить в начале функции обратного вызова TLS. Такие функции позволяют вредоносным программам выполнить код до того, как их работа будет остановлена. В главе 16 мы покажем, как функции обратного вызова TLS применяются для противодействия отладке и как от них защититься.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Подключение к запущенному процессу

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Глава 9. OllyDbg  207

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

Чтобы подключить OllyDbg к процессу, выберите пункт меню File Attach (Файл Подключить)­ . На экране появится список, из которого вы сможете выбрать нужный вам процесс (если в системе есть несколько процессов с тем же именем, вам нужно будет знать его идентификатор). После этого щелкните на пункте меню Attach (Подключить). Отладчик запустится и остановит программу вместе со всеми ее потоками.

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

Пользовательский интерфейс OllyDbg

Загрузив программу в OllyDbg, вы увидите окно с множеством информации, которая может пригодиться при анализе вредоносного кода (рис. 9.2).

Рис. 9.2. Интерфейс OllyDbg

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

208  Часть III  •  Продвинутый динамический анализ

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Окно состоит из следующих панелей.

Панель дизассемблирования . Здесь выводится код отлаживаемой программы — указатель на текущую инструкцию, а также несколько инструкций до и после. Обычно на этой панели выделяется инструкция, которая должна выполниться на следующем шаге. Чтобы отредактировать код или данные (или добавить новые ассемблерные инструкции), нажмите, находясь на этой панели, клавишу Пробел.

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

Modify (Изменить). На экране появится диалоговое Рис. 9.3. Изменение регистра окно, показанное на рис. 9.3. В нем вы можете по-

менять соответствующее значение.

Панель стека . Эта панель выводит текущее состояние стека в памяти для отлаживаемого потока. Здесь всегда отображается вершина стека. Чтобы его отредактировать, щелкните правой кнопкой мыши на одном из его адресов и выберите пункт Modify (Изменить). OllyDbg выводит полезные комментарии для некоторых адресов, которые хранят аргументы API-вызовов. Это помогает в анализе, так как вам не нужно самостоятельно определять направление стека и узнавать, в каком порядке размещены аргументы в том или ином вызове.

Панель дампа памяти . Эта панель содержит текущий дамп памяти отлаживаемого процесса. Находясь в ней, нажмите Ctrl+G и введите адрес, дамп которого вы хотите просмотреть; то же самое можно сделать, щелкнув на соответствующем адресе и выбрав пункт Follow in Dump (Проследить в дампе). Чтобы отредактировать память, щелкните на этой панели правой кнопкой мыши и выберите пункт меню Binary Edit (Двоичный код Редактировать). Так вы можете поменять глобальные переменные и другие данные, которые вредоносная программа хранит в оперативной памяти.

Карта памяти

С помощью пункта меню View Memory (Вид Память) можно открыть окно Memory Map (Карта памяти), которое отображает все блоки памяти, выделенные для отлаживаемой программы. На рис. 9.4 показана карта памяти утилиты Netcat.

Карта памяти — это отличный способ ознакомиться со структурой приложения в памяти. Как можно видеть на рис. 9.4, исполняемый файл разбит на разделы с кодом и данными. Вы также можете просмотреть все подключаемые DLL (а также их код и данные). Чтобы вывести дамп памяти любой строки на карте, достаточно

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Глава 9. OllyDbg  209

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

выполнить на ней двойной щелчок. Вы также можете отправить данные из дампа памяти на панель дизассемблирования, щелкнув на них правой кнопкой мыши и выбрав пункт меню View in Disassembler (Просмотреть в дизассемблере).

Рис. 9.4. Карта памяти для Netcat (nc.exe)

Перебазирование

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

Базовый адрес

У всех PE-файлов в Windows есть предпочтительный базовый адрес, известный также как ImageBase. Он определяется в PE-заголовке.

ImageBase не всегда, но обычно совпадает с адресом, по которому вредоносная программа будет загружена. Большинство исполняемых файлов рассчитано на загрузку по адресу 0x00400000, который используется по умолчанию во многих компиляторах на платформе Windows. Разработчики могут располагать свои файлы в других местах. Программы, которые поддерживают рандомизацию размещения

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

210  Часть III  •  Продвинутый динамический анализ

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

адресного пространства (address space layout randomization, ASLR — технология повышения безопасности), часто меняют свое местоположение. Хотя в основном это свойственно динамическим библиотекам.

Изменение местоположения необходимо, поскольку одно и то же приложение может импортировать множество DLL-файлов, каждый из которых имеет предпочтительный базовый адрес загрузки. Если у двух библиотек ImageBase равен 0x10000000, они не смогут загрузиться по этому адресу одновременно. Поэтому Windows загрузит одну из них по этому адресу, а другую куда-то переместит.

Большинство DLL, поставляемых вместе с Windows, имеют разные предпочтительные значения ImageBase и не конфликтуют между собой. Однако у сторонних приложений базовый адрес часто совпадает.

Абсолютные и относительные адреса

Процесс перебазирования не ограничивается лишь загрузкой кода в другом месте. Многие инструкции ссылаются на относительные адреса, но некоторые используют абсолютные. Например, в листинге 9.1 показана типичная последовательность инструкций.

Листинг 9.1. Ассемблерный код, требующий перебазирования

00401203 mov eax, [ebp+var_8]

00401206 cmp [ebp+var_4], 0

0040120a jnz loc_0040120

0040120c mov eax, dword_40CF60

Большинство этих инструкций используют относительные адреса — они будут нормально работать без всякого вмешательства вне зависимости от того, где они загружаются. Однако инструкция для доступа к данным не сможет быть выполнена в таком виде, поскольку она обращается к абсолютному адресу. Если загрузить файл на участок памяти, который отличается от предпочтительного, этот адрес станет некорректным. Данную инструкцию следует перенаправить по другому адресу во время загрузки файла. Большинство библиотек упаковывается вместе со списком таких фиксированных адресов. Вы можете найти их в разделе

.reloc PE-заголовка.

Динамические библиотеки загружаются в произвольном порядке, но после исполняемого файла. Это означает, что вы не можете предсказать заранее, на какой участок памяти будут перебазированы DLL-файлы. Если библиотека требует перебазирования, но при этом у нее нет раздела .reloc, ее невозможно загрузить.

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