Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Майкл_Сикорски,_Эндрю_Хониг_Вскрытие_покажет!_Практический_анализ.pdf
Скачиваний:
18
Добавлен:
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

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Глава 9. OllyDbg  219

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Рис. 9.10. Вызов экспортной функции из DLL

Не забудьте создать все нужные вам точки останова или установить флажок Pause after call (Остановить после вызова) перед нажатием кнопки Call (Вызвать). На рис. 9.10 показано значение, возвращенное функцией. Оно хранится в регистре EAX и представляет собой строку 127.0.0.1 (0x0100007F) с локальным порядком следования байтов .

Трассировка

Трассировка — это мощная методика отладки, которая позволяет записывать по­ дробную информацию о выполнении, доступную для дальнейшего анализа. OllyDbg поддерживает стандартную обратную трассировку, трассировку стека вызовов, пошаговую трассировку и т. д.

Стандартная обратная трассировка

При пошаговом выполнении кода (со входом и с обходом) OllyDbg всегда записывает ваши перемещения. Вы можете нажать на своей клавиатуре клавишу - (минус), чтобы переместиться назад во времени и просмотреть ранее выполненные инструкции. Клавиша + (плюс) позволяет перейти вперед. Если выполнение производилось со входом, вы сможете отследить каждую вызванную вами инструкцию.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

220  Часть 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 можно просматривать маршрут выполнения, ведущий к заданной функции. Для этого выберите пункт View Call Stack (Вид Стек вызовов) в главном меню. На экране появится окно, отображающее цепочку вызовов, которая привела вас к текущему местоположению.

Для перемещения по стеку вызовов используйте разделы Address (Адрес) и Called From (Вызов из) в соответствующем окне. Однако вам не будет доступно содержимое регистров и стека на момент нахождения на заданном участке. Для его просмотра понадобится пошаговая трассировка.

Пошаговая трассировка

Пошаговая трассировка позволяет OllyDbg записывать каждую выполненную инструкцию вместе с состоянием регистров и флагов.

Существует несколько способов активизации пошаговой трассировки.

Выделите на панели дизассемблера код, который вы хотите трассировать, щелкните на нем правой кнопкой мыши и выберите пункт меню Run Trace Add Selection (Выполнить трассировку Добавить выделение). После выполнения этого кода выберите пункт меню View Run Trace (Вид Выполнить трассировку), чтобы просмотреть выполненные инструкции. Для перемещения по коду нажимайте клавиши и + (как описывалось в разделе «Стандартная обратная трассировка» чуть выше). Этот метод позволяет увидеть изменения, произошедшие в каждом регистре при переходе к любой инструкции.

Используйте кнопки Trace Into (Трассировка со входом) и Trace Over (Трассировка с обходом). Этот способ может оказаться более простым по сравнению с предыдущим, так как вам не нужно выделять код, который вы хотите трассировать. Трассировка со входом записывает все инструкции, пока не сработает точка останова. Трассировка с обходом ведет запись только тех инструкций, которые находятся в текущей функции.

ПРЕДУПРЕЖДЕНИЕ

Если использовать трассировку со входом или обходом без создания точек останова, OllyDbg попытается трассировать всю программу целиком, что может занять много времени и израсходовать большой объем памяти.

Выберите пункт меню Debug Set Condition (Отладка Задать условие). Трассировка будет продолжаться, пока не выполнится определенное условие, после чего

 

 

 

 

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  221

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

Трассировка Poison Ivy

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

На рис. 9.11 показано условие, которое мы установили для перехвата выполнения содержимого кучи в Poison Ivy. OllyDbg останавливается, когда регистр EIP меньше адреса, в котором обычно находится образ программы (0x400000, снизу от которого в простых приложениях чаще всего размещаются стек, куча и другие динамически выделяемые участки памяти). В нормальных программах EIP не должен там находиться. После этого мы воспользуемся кнопкой Trace Into (Трассировка со входом). Трассировка программы будет продолжаться до тех пор, пока не дойдет до места, в котором должно начаться выполнение кода командной оболочки.

Вданном случае программа останавливается, когда регистр EIP равен 0x142A88.

Спомощью клавиши можно переместиться назад и проследить за выполнением кода командной оболочки.

Рис. 9.11. Условная трассировка

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

222  Часть 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 программе возникает исключение, выполнение по умолчанию приостанавливается, а управление передается отладчику. Отладчик может обработать исключение самостоятельно или делегировать его самой программе. Во втором случае вы можете воспользоваться одним из трех способов.

Shift+F7 для входа в исключение.Shift+F8 для перешагивания через него.Shift+F9 для запуска обработчика.

На рис. 9.12 показаны разные варианты обработки исключений в OllyDbg. Вы можете заставить отладчик игнорировать некоторые виды исключений и передавать их непосредственно программе (во время анализа вредоносного кода часто имеет смысл игнорировать любые исключения, поскольку вы отлаживаете программу не для того, чтобы устранить ее проблемы).

Рис. 9.12. Варианты обработки исключений в OllyDbg

Редактирование кода

OllyDbg позволяет легко изменять практически любые динамические ресурсы, такие как регистры и флаги. Но у вас также есть возможность редактировать код программы на ходу. Вы можете модифицировать инструкции или память — для этого выделите нужный участок, щелкните на нем правой кнопкой мыши и выберите пункт меню Binary Edit (Двоичный код Редактировать). Появится всплы-

 

 

 

 

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  223

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

вающее окно, в котором вы можете добавить любые опкоды или данные (OllyDbg также умеет заполнять участок нулями или инструкциями NOP).

На рис. 9.13 показан участок кода вредоносной программы, защищенной паролем, для конфигурации которой необходимо ввести специальный ключ. В том месте, где происходит проверка ключа, мы видим условный переход JNZ . Если он выполняется, на экран выводится строка Bad key; в противном случае мы увидим сообщение Key Accepted!. Чтобы заставить программу принять ключ, можно просто отредактировать код. Выделите инструкцию условного перехода, щелкните на ней правой кнопкой мыши и выберите пункт меню Binary Fill with NOPs (Двоичный код Заполнить инструкциями NOP) , как это показано на рис. 9.13. В результате вместо JNZ вы получите инструкции NOP и программа будет считать, что ключ был принят.

Рис. 9.13. Варианты редактирования кода в OllyDbg

Нужно понимать, что в данном случае модификация происходит лишь в оперативной памяти процесса. Мы можем пойти дальше и сохранить изменения в исполняемом файле. Как видно на рис. 9.14, это двухэтапная процедура.

Рис. 9.14. Двухэтапное копирование изменений, сделанных в оперативной памяти, в исполняемый файл

Чтобы применить эти изменения, щелкните правой кнопкой мыши на панели диз­ ассемблера, где вы изменили код, и выберите пункт Copy to executable All modifications (Копировать в исполняемый файл Все изменения) . Так все сделанные вами модификации оперативной памяти будут скопированы, после чего вы увидите