- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 0. Анализ вредоносных программ для начинающих
- •Цель анализа вредоносных программ
- •Методики анализа вредоносного ПО
- •Общие правила анализа вредоносного ПО
- •Глава 1. Основные статические методики
- •Сканирование антивирусом: первый шаг
- •Хеширование: отпечатки пальцев злоумышленника
- •Поиск строк
- •Упакованное и обфусцированное вредоносное ПО
- •Формат переносимых исполняемых файлов
- •Компонуемые библиотеки и функции
- •Статический анализ на практике
- •Заголовки и разделы PE-файла
- •Итоги главы
- •Глава 2. Анализ вредоносных программ в виртуальных машинах
- •Структура виртуальной машины
- •Запуск виртуальной машины для анализа вредоносного ПО
- •Использование виртуальной машины для анализа безопасности
- •Риски при использовании VMware для анализа безопасности
- •Запись/воспроизведение работы компьютера
- •Итоги главы
- •Глава 3. Основы динамического анализа
- •Песочницы: решение на скорую руку
- •Запуск вредоносных программ
- •Мониторинг с помощью Process Monitor
- •Сравнение снимков реестра с помощью Regshot
- •Симуляция сети
- •Перехват пакетов с помощью Wireshark
- •Использование INetSim
- •Применение основных инструментов для динамического анализа
- •Итоги главы
- •Уровни абстракции
- •Архитектура x86
- •Итоги главы
- •Глава 5. IDA Pro
- •Загрузка исполняемого файла
- •Интерфейс IDA Pro
- •Использование перекрестных ссылок
- •Анализ функций
- •Схематическое представление
- •Повышение эффективности дизассемблирования
- •Плагины к IDA Pro
- •Итоги главы
- •Глава 6. Распознавание конструкций языка C в ассемблере
- •Переменные: локальные и глобальные
- •Дизассемблирование арифметических операций
- •Распознавание выражений if
- •Распознавание циклов
- •Соглашения, касающиеся вызова функций
- •Анализ выражений switch
- •Дизассемблирование массивов
- •Распознавание структур
- •Анализ обхода связного списка
- •Итоги главы
- •Глава 7. Анализ вредоносных программ для Windows
- •Windows API
- •Реестр Windows
- •API для работы с сетью
- •Отслеживание запущенной вредоносной программы
- •Сравнение режимов ядра и пользователя
- •Native API
- •Итоги главы
- •Глава 8. Отладка
- •Сравнение отладки на уровне исходного и дизассемблированного кода
- •Отладка на уровне ядра и пользователя
- •Использование отладчика
- •Исключения
- •Управление выполнением с помощью отладчика
- •Изменение хода выполнения программы на практике
- •Итоги главы
- •Глава 9. OllyDbg
- •Загрузка вредоносного ПО
- •Пользовательский интерфейс OllyDbg
- •Карта памяти
- •Просмотр потоков и стеков
- •Выполнение кода
- •Точки останова
- •Трассировка
- •Обработка исключений
- •Редактирование кода
- •Анализ кода командной оболочки
- •Вспомогательные возможности
- •Подключаемые модули
- •Отладка с использованием скриптов
- •Итоги главы
- •Драйверы и код ядра
- •Подготовка к отладке ядра
- •Использование WinDbg
- •Отладочные символы Microsoft
- •Отладка ядра на практике
- •Руткиты
- •Загрузка драйверов
- •Итоги главы
- •Глава 11. Поведение вредоносных программ
- •Программы для загрузки и запуска ПО
- •Бэкдоры
- •Похищение учетных данных
- •Механизм постоянного присутствия
- •Повышение привилегий
- •Заметая следы: руткиты, работающие в пользовательском режиме
- •Итоги главы
- •Глава 12. Скрытый запуск вредоносного ПО
- •Загрузчики
- •Внедрение в процесс
- •Подмена процесса
- •Внедрение перехватчиков
- •Detours
- •Внедрение асинхронных процедур
- •Итоги главы
- •Глава 13. Кодирование данных
- •Простые шифры
- •Распространенные криптографические алгоритмы
- •Нестандартное кодирование
- •Декодирование
- •Итоги главы
- •Глава 14. Сетевые сигнатуры, нацеленные на вредоносное ПО
- •Сетевые контрмеры
- •Безопасное расследование вредоносной деятельности в Интернете
- •Контрмеры, основанные на сетевом трафике
- •Углубленный анализ
- •Сочетание динамических и статических методик анализа
- •Понимание психологии злоумышленника
- •Итоги главы
- •Искажение алгоритмов дизассемблирования
- •Срыв анализа слоя стека
- •Итоги главы
- •Глава 16. Антиотладка
- •Обнаружение отладчика в Windows
- •Распознавание поведения отладчика
- •Искажение работы отладчика
- •Уязвимости отладчиков
- •Итоги главы
- •Глава 17. Методы противодействия виртуальным машинам
- •Признаки присутствия VMware
- •Уязвимые инструкции
- •Изменение настроек
- •Побег из виртуальной машины
- •Итоги главы
- •Глава 18. Упаковщики и распаковка
- •Анатомия упаковщика
- •Распознавание упакованных программ
- •Способы распаковки
- •Автоматизированная распаковка
- •Ручная распаковка
- •Советы и приемы для работы с распространенными упаковщиками
- •Анализ без полной распаковки
- •Итоги главы
- •Глава 19. Анализ кода командной оболочки
- •Загрузка кода командной оболочки для анализа
- •Позиционно-независимый код
- •Определение адреса выполнения
- •Поиск символов вручную
- •Окончательная версия программы Hello World
- •Кодировки кода командной оболочки
- •NOP-цепочки
- •Поиск кода командной оболочки
- •Итоги главы
- •Глава 20. Анализ кода на C++
- •Объектно-ориентированное программирование
- •Обычные и виртуальные функции
- •Создание и уничтожение объектов
- •Итоги главы
- •Какой смысл в 64-битном вредоносном ПО?
- •Особенности архитектуры x64
- •Признаки вредоносного кода на платформе x64
- •Итоги главы
- •Приложения
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
454 Часть VI • Специальные темы |
||||
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 |
|
|
|
|
Использовать алфавитное преобразование с разделением каждого байта на два четырехбитных полубайта и добавлением их к печатному символу в формате ASCII (такому как A или a).
Шифрование кода командной оболочки создает дополнительные преимущества для злоумышленника, пряча заметные для человеческого глаза строки, такие как URL- и IP-адреса, и тем самым усложняя анализ. Кроме того, это помогает обойти механизмы обнаружения вторжений.
NOP-цепочки
Иногда перед shell-кодом вставляют длинную цепочку инструкций NOP (которую еще называют дорожкой или трамплином из NOP-ов, от англ. no operation), как это показано на рис. 19.3. Такие цепочки не являются обязательными, но они часто входят в состав эксплойта, чтобы увеличить вероятность его успешного срабатывания. Здесь делается ставка на то, что управление попадет к одной из множества инструкций NOP, в результате чего рано или поздно будет выполнен сам shell-код.
Рис. 19.3. Размещение цепочки из инструкций NOP и кода командной оболочки
Обычно такие цепочки состоят из инструкций NOP (0x90), но, чтобы избежать обнаружения, авторы эксплойтов могут пойти на различные уловки. Вместо NOP могут использоваться опкоды в диапазоне от 0x40 до 0x4f, которые соответствуют однобайтным инструкциям для инкрементирования и декрементирования регистров общего назначения. Кроме того, этот диапазон состоит из печатных символов в формате ASCII. Это может пригодиться, поскольку NOP-цепочки выполняются до запуска декодера и, как следствие, должны отвечать тем же требованиям со стороны фильтра, что и остальной shell-код.
Поиск кода командной оболочки
Код командной оболочки можно обнаружить в различных источниках, включая сетевой трафик, веб-страницы, медиафайлы и вредоносное ПО. Создание среды с подходящей версией уязвимой программы, на которую нацелен эксплойт, не всегда представляется возможным, поэтому сначала аналитик безопасности должен попытаться разобрать shell-код с помощью статических методов.
Зараженные веб-страницы чаще всего используют JavaScript, чтобы собрать информацию о системе пользователя и проверить, установлены ли в ней уязвимые
|
|
|
|
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 |
|
|
|||
Глава 19. Анализ кода командной оболочки 455 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
версии браузера или плагинов. Для преобразования закодированных текстовых данных в двоичный пакет, готовый для выполнения, обычно используется функция unescape. Shell-код часто хранится в виде закодированной строки, которая встроена в скрипт, запускающий эксплойт.
Функция unescape интерпретирует текст %uXXYY как символ в кодировке Unicode, в котором байты следуют от старшего к младшему. При этом XX и YY воспринимаются как шестнадцатеричные значения. В компьютерах, в которых используется противоположный порядок следования байтов (как в x86), результатом декодирования будет последовательность YY XX. Рассмотрим, к примеру, следующую текстовую строку:
%u1122%u3344%u5566%u7788%u99aa%ubbcc%uddee
После декодирования она превратится в такую двоичную последовательность байтов:
22 11 44 33 66 55 88 77 aa 99 cc bb ee dd
Если символ % не идет сразу после буквы u, он воспринимается как отдельный байт, закодированный в шестнадцатеричном формате. Например, строка %41%42%43%44 будет декодирована в двоичную последовательность байтов 41 42 43 44.
ПРИМЕЧАНИЕ
В рамках одной текстовой строки можно использовать символы воднобайтной и двухбайтной кодировке. Эта методика часто встречается при использовании JavaScript, в том числе и в документах PDF.
Код командной оболочки внутри вредоносного исполняемого файла обычно легко обнаружить, поскольку в этом случае вся программа будет написана с использованием таких методик, как обфускация или встраивание shell-кода в другой процесс.
Основную часть кода командной оболочки обычно можно распознать по использованию типичных API-вызовов для внедрения в процесс, которые мы обсудили в главе 12, а именно VirtualAllocEx, WriteProcessMemory и CreateRemoteThread. Если вредонос запускает удаленный поток без поправки на сдвиг или поиска внешних зависимостей, то буфер, который он записывает в другой процесс, скорее всего, будет содержать shell-код. Авторам вредоносного ПО это на руку, ведь таким образом код командной оболочки может собрать и выполнить себя сам, без помощи вредоноса, который его доставил.
Иногда код командной оболочки хранится в незакодированном виде внутри медиафайла. Дизассемблеры, такие как IDA Pro, способны загружать любые двоичные файлы, включая те, в которых потенциально содержится shell-код. Но при этом IDA Pro может не знать, какие байты являются исполняемыми, а это сделает анализ невозможным.
Обнаружение кода командной оболочки обычно связано с поиском исходного декодера, который часто находится в начале shell-кода. В табл. 19.2 приводятся опкоды, на которые стоит обращать внимание.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
456 Часть VI • Специальные темы |
||||
w Click |
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
||||
|
w |
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Таблица 19.2. Байты опкодов, которые стоит искать
|
|
|
|
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 |
|
|
|
|
Тип инструкции |
Распространенные опкоды |
Вызов |
0xe8 |
|
|
Безусловные переходы |
0xeb, 0xe9 |
|
|
Циклы |
0xe0, 0xe1, 0xe2 |
|
|
Короткие условные переходы |
С 0x70 по 0x7f |
|
|
Попытайтесь дизассемблировать в загруженном файле каждый экземпляр опкодов, приведенных в табл. 19.2. Если код корректный, это сразу должно быть видно. Но помните, что основная часть кода, скорее всего, закодирована, поэтому сначала вы увидите лишь декодер.
Даже если поиск не дал никаких результатов, это не значит, что shell-кода в файле нет, поскольку некоторые форматы файлов допускают встраивание закодированных данных. Например, эксплойты, нацеленные на критическую уязвимость CVE-2010-0188 в Adobe Reader, используют неправильно сформированные TIFFизображения, которые хранятся внутри PDF-документов как закодированная в Base64 строка и могут быть сжаты с помощью библиотеки zlib. Вы должны быть знакомы с форматом файла, с которым работаете, и знать, какие данные он может нести, — это поможет вам в поиске вредоносного содержимого.
Итоги главы
Авторам кода командной оболочки приходится использовать различные приемы для обхода ограничений, свойственных нестандартным средам выполнения, в которых этот код работает. Это касается определения собственного местоположения в памяти и ручного поиска всех своих зависимостей, что в дальнейшем позволит взаимодействовать с системой. Для экономии места эти зависимости обычно обфусцируются путем замены имен функций в кодировке ASCII на их хешированные значения. Очень часто почти весь shell-код оказывается закодированным, что позволяет ему обойти любые проверки данных в атакуемом процессе. Все эти методики могут легко обескуражить начинающего аналитика безопасности. Но материал, представленный в этой главе, должен помочь вам распознать их, чтобы вы могли сосредоточиться на основной функциональности кода командной оболочки.
Лабораторные работы
Сейчас вы сможете применить полученные в этой главе знания, чтобы изучить примеры, созданные на основе реального shell-кода. Поскольку отладчик не может загружать и запускать код командной оболочки напрямую, для динамического анализа двоичных файлов мы будем использовать утилиту shellcode_launcher.exe. Инструкции по ее применению можно найти в главе 19 и в приложении В, где приводится подробный анализ работ.
|
|
|
|
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 |
|
|
|||
Глава 19. Анализ кода командной оболочки 457 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Лабораторная работа 19.1
Проанализируйте файл Lab19-01.bin, используя утилиту shellcode_laun cher.exe.
Вопросы
1.Каким образом закодирован shell-код?
2.Какие функции он импортирует вручную?
3.С каким сетевым узлом он взаимодействует?
4.Что он оставляет после себя в файловой системе?
5.Каково его назначение?
Лабораторная работа 19.2
Файл Lab19-02.exe содержит фрагмент shell-кода, который внедрится в другой процесс и будет в нем выполнен. Проанализируйте этот файл.
Вопросы
1.В какой процесс внедряется shell-код?
2.Где расположен shell-код?
3.Каким образом он закодирован?
4.Какие функции он импортирует вручную?
5.С каким сетевым узлом он взаимодействует?
6.Каково его назначение?
Лабораторная работа 19.3
Проанализируйте файл Lab19-03.pdf. Если вам не удается найти код командной оболочки, просто пропустите эту часть лабораторной и переходите к анализу файла Lab19-03_sc.bin с помощью утилиты shellcode_launcher.exe.
Вопросы
1.Какой эксплойт использован в этом PDF-документе?
2.Каким образом закодирован shell-код?
3.Какие функции он импортирует вручную?
4.Что он оставляет после себя в файловой системе?
5.Каково его назначение?