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

 

 

Глава 15. Антидизассемблирование  377

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

00401070

; ---------------------------------------------------------------

00401071

align 10h

00401080

dd 824648Bh, 0A164h, 8B0000h, 0A364008Bh, 0

00401094

dd 6808C483h

00401098

dd offset aMysteryCode ; "Mystery Code"

0040109C

dd 2DE8h, 4C48300h, 3 dup(0CCCCCCCCh)

В этом примере IDA Pro не только упускает из виду тот факт, что ответвление по адресу 401080 не было вызвано, но даже не может дизассемблировать саму функцию. Этот код скрытно устанавливает обработчик исключения, сначала присваивая регистру EAX значение 40106C , а затем добавляя к нему 14h, чтобы получить указатель на функцию 401080. Исключение, связанное с делением на ноль, срабатывает из-за обнуления ECX с помощью команды xor ecx, ecx и последующего вызова инструкции div ecx , которая делит регистр EAX на ECX.

Нажмем клавишу C в IDA Pro, чтобы превратить адрес данных 401080 в код, и посмотрим, что скрывалось за этим приемом.

00401080

mov

esp, [esp+8]

00401084

mov

eax, large fs:0

0040108A

mov

eax, [eax]

0040108C

mov

eax, [eax]

0040108E

mov

large fs:0, eax

00401094

add

esp, 8

00401097

push

offset aMysteryCode ; "Mystery Code"

0040109C

call

printf

Срыв анализа слоя стека

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

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

Обход анализа слоев стека делает бесполезными некоторые другие методики дизассемблирования. Самым ярким примером является плагин Hex-Rays Decompiler для IDA Pro, которое генерирует псевдокод функции на языке, близком к C.

Для начала исследуем функцию, задача которой — сорвать анализ слоя стека (листинг 15.1).

Листинг 15.1. Функция, предотвращающая анализ слоя стека

00401543

sub_401543 proc near

; CODE XREF: sub_4012D0+3Cp

00401543

 

; sub_401328+9Bp

00401543

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

w

 

 

to

 

 

378   

Часть V  •  Противодействие обратному проектированию

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00401543

arg_F4

= dword

ptr 0F8h

 

 

 

 

 

 

 

 

00401543

arg_F8

= dword

ptr 0FCh

 

 

 

 

 

 

 

 

00401543

 

 

 

 

 

 

 

 

 

 

 

00401543

000

sub

esp, 8

 

 

 

 

 

 

 

 

00401546

008

sub

esp, 4

 

 

 

 

 

 

 

 

00401549

00C

cmp

esp, 1000h

 

 

 

 

 

 

 

 

0040154F

00C

jl

short loc_401556

 

 

 

 

 

 

 

 

00401551

00C

add

esp, 4

 

 

 

 

 

 

 

 

00401554

008

jmp

short loc_40155C

 

 

 

 

 

 

 

 

00401556

; ------------------------------------------------------------

 

 

 

 

 

 

 

 

00401556

 

 

 

 

 

 

 

 

 

 

 

00401556

loc_401556:

 

; CODE XREF: sub_401543+Cj

 

 

 

 

 

 

 

 

00401556

00C

add

esp, 104h

 

 

 

 

 

 

 

 

0040155C

 

 

 

 

 

 

 

 

 

 

 

0040155C

loc_40155C:

 

; CODE XREF: sub_401543+11j

 

 

 

 

 

 

 

 

0040155C

-F8

mov

[esp-0F8h+arg_F8], 1E61h

 

 

 

 

 

 

 

 

00401564

-F8

lea

eax, [esp-0F8h+arg_F8]

 

 

 

 

 

 

 

 

00401568

-F8

mov

[esp-0F8h+arg_F4], eax

 

 

 

 

 

 

 

 

0040156B

-F8

mov

edx, [esp-0F8h+arg_F4]

 

 

 

 

 

 

 

 

0040156E

-F8

mov

eax, [esp-0F8h+arg_F8]

 

 

 

 

 

 

 

 

00401572

-F8

inc

eax

 

 

 

 

 

 

 

 

00401573

-F8

mov

[edx], eax

 

 

 

 

 

 

 

 

00401575

-F8

mov

eax, [esp-0F8h+arg_F4]

 

 

 

 

 

 

 

 

00401578

-F8

mov

eax, [eax]

 

 

 

 

 

 

 

 

0040157A

-F8

add

esp, 8

 

 

 

 

 

 

 

 

0040157D

-100

retn

 

 

 

 

 

 

 

 

 

0040157D

sub_401543

endp ; sp-analysis failed

 

 

 

 

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

 

 

 

 

Методики предотвращения анализа слоев стека сильно зависят от использу­ емого компилятора. Конечно, если вредоносная программа полностью написана на ассемблере, ее автор может прибегать к более оригинальным решениям. Но при использовании высокоуровневых языков, таких как C или C++, особое внимание приходится уделять итоговому коду, которым можно манипулировать.

В левом столбце листинга 15.1 показаны стандартные для IDA Pro префиксы строчек, которые состоят из имени сегмента и адреса в памяти для каждой функции. В столбце справа находится указатель на стек. В каждой строке он равен значению регистра ESP относительно его содержимого на момент начала функции. В этом листинге видно, что слой стека данной функции основан на ESP, а не на EBP, как в большинстве случаев. В IDA Pro этот столбец с указателем на стек можно включить с помощью меню Options (Параметры).

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

ПРИМЕЧАНИЕ

Чтобы подробно исследовать в IDA Pro этот огромный слой стека, нажмите Ctrl+K. Если вы попытаетесь нажать Y, чтобы снабдить эту функцию прототипом, то получите один из самых уродливых результатов, который вам когда-либо приходилось видеть.

 

 

 

 

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

 

 

Глава 15. Антидизассемблирование  379

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Как вы уже могли догадаться, эта функция не принимает 62 аргумента. На самом деле аргументов у нее вообще нет — она содержит лишь две локальные переменные. Код, ответственный за срыв анализа в IDA Pro, находится рядом с началом функции, между адресами 00401546 и 0040155C. Это простое сравнение с двумя ответвлениями.

Регистр ESP сравнивается со значением 0x1000. Если он меньше 0x1000, то выполняется код по адресу 00401556, в противном случае происходит переход

в00401556. Каждое ответвление добавляет в ESP определенное значение: 0x104

вслучае с «меньше» и 4 в случае с «больше или равно». С точки зрения дизассемблера на этом этапе сдвиг указателя на стек может иметь два значения в зависимости от того, какое ответвление было выбрано. И, к счастью для автора вредоноса, выбор оказался неверным.

Ранее мы уже обсуждали условные переходы, которые таковыми не являются, так как их условие всегда дает один и тот же результат — например, инструкция jz, идущая сразу за xor eax, eax. Изобретательные злоумышленники умеют добавлять

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

Влистинге 15.1 инструкция cmp esp, 1000h всегда дает один и тот же результат. Опытный аналитик безопасности может заметить, что самая нижняя страница памяти в Windows-процессе не будет использоваться в качестве стека, поэтому данное сравнение практически гарантирует выбор ответвления «больше или равно». Но диз­ ассемблер не обладает интуицией такого уровня. Его задача состоит в отображении инструкций. Он не предназначен для сравнения всех решений, принимаемых кодом, с набором реальных сценариев.

Суть проблемы в том, что дизассемблер считает инструкцию add esp, 104h верной и уместной, корректируя соответствующим образом свою интерпретацию стека. Инструкция add esp, 4 в ответвлении «больше или равно» служит лишь для коррекции стека после выполнения sub esp, 4, которое происходит перед сравнением. В итоге значение ESP будет таким же, как и до начала последовательности по адресу 00401546.

Чтобы справиться с мелкими изменениями слоя стека (которые случаются из-за того, что анализ слоев стека по самой своей природе ненадежен), можно использовать IDA Pro. Для этого поместите курсор в определенную строку ассемблерного кода и нажмите Alt+K, что позволит вам поправить указатель на стек. Но во многих случаях (таких как в листинге 15.1) более эффективным будет изменить инструкции для манипуляции слоем стека, как показано в примерах выше.

Итоги главы

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

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

380  Часть V  •  Противодействие обратному проектированию

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

 

 

 

 

выбора или предположения, которые могут быть сделаны дизассемблером, существует потенциальная методика антидизассемблирования.

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

С помощью скрытия управления потоком вредоносная программа может сделать так, чтобы аналитик безопасности пропустил определенный фрагмент кода или не понял его истинное назначение (во втором случае маскируется связь кода с другими функциями и системными вызовами). Мы рассмотрели несколько способов, как этого можно достичь, начиная от инструкции retn и заканчивая использованием SEH-обработчиков в качестве универсальных переходов.

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

Лабораторные работы

Лабораторная работа 15.1

Проанализируйте зараженный файл Lab15-01.exe. Это программа командной строки, которая принимает аргумент и, если тот совпадает с секретным кодом, выводит сообщение Good Job!.

Вопросы

1.Какие методики дизассемблирования использованы в этом двоичном файле?

2.Какой ложный опкод был дизассемблирован обманным путем?

3.Сколько раз применяется данная методика?

4.Какой аргумент командной строки заставляет программу вывести сообщение Good Job!?

Лабораторная работа 15.2

Проанализируйте зараженный файл Lab15-02.exe. Чтобы ответить на вопросы, откорректируйте все контрмеры по антидизассемблированию, прежде чем исследовать двоичный файл.

 

 

 

 

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

 

 

Глава 15. Антидизассемблирование  381

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Вопросы

1.Какой URL запрашивает эта программа в самом начале?

2.Какое поле User-Agent она генерирует?

3.Что эта программа ищет на странице, которую она изначально запрашивала?

4.Что эта программа делает с информацией, извлеченной со страницы?

Лабораторная работа 15.3

Проанализируйте зараженный файл Lab15-03.exe. На первый взгляд этот двоичный файл выглядит как обычная утилита, но на самом деле он обладает более широкой функциональностью, чем может показаться.

Вопросы

1.Как изначально вызывается вредоносный код?

2.Что делает этот вредоносный код?

3.К какому URL обращается вредонос?

4.Какое имя файла он использует?