Академический Документы
Профессиональный Документы
Культура Документы
1
Промежуточные итоги
2
Reverse Engineering
3
Почему появилась потребность в Reverse Engineering
4
Где можно найти RE в безопасности
● SOC L2/L3
● Malware analyst (встречается в антивирусных компаниях)
● Digital forensics
---
● Bug Bounty*
5
Где можно найти RE в ИТ вакансиях
6
Какие навыки можно получить, занимаясь реверсом
● Чтение кода. Вам придется научиться читать код, причем много кода
● Опыт работы с ассемблером. В некоторых случаях (~20%) вам придется
читать ассемблер
● Опыт дебага. Через вас пройдет огромное количество кода, который
иногда стоит отлаживать в рантайме
● Написание кода. Для решения некоторых задач вам придется писать
свои скрипты
7
Общая идея реверса
8
Понять, что написал автор
9
Чтобы украсть. Пример: Silicon Valley (2014-2019)
● ГГ разработал
революционный алгоритм
● Компания Hooley хочет его
отобрать
● Команда RnD занимается
обратной разработкой
приложения, которое
использует этот алгоритм
10
Чтобы помочь. Пример: WannaCry (2017)
● WannaCry – компьютерный
вирус, бум которого пришелся на
2017 год
● Замедлить атаку получилось
благодаря ресерчеру, который
нашел захардкоженный домен
11
Как реверсить
12
Случаи реверса
13
Лекционная задача 1 до 29 октября 8:30
14
Есть исходный код
15
TODO: картинка с примером какого-нибудь кода
16
Подход «сверху вниз»
17
Подход «снизу вверх»
1. Ищем потенциально уязвимый код (где могут быть SQL- или Shell-
инъекции)
2. Строим граф по принципу «кто вызывает этот код»
3. Находим точку входа пользователя и проверяем этот путь (т.е.
Получится ли доставить полезную нагрузку до этой функции)
18
TODO: пример с AST деревом
19
Про эффективность подходов. Личный опыт
20
Нет исходного кода. Можно декомпилировать
21
Почему есть возможность декомпиляции
22
Как понять что декомпилировать
23
Что можно декомпилировать
● Java
● C#
● Cpython
И так далее, всего лишь Google “<language> decompile github”
24
Java
● jd-gui
● Fernflower
● Procyon
● krakatau
● Bytecode viewer
25
26
C#
● dnSpy
● dotPeek
● ILSpy
27
28
CPython
● Python-decompile3
● uncompyle3
● Pycdc
Стоит гуглить по конкретной версии Python
29
Обфускация
Идея:
● Усложнить жизнь читающему код
● Избежать обнаружения полезной
нагрузки антивирусом
● Полезная нагрузка должна
выполняться так же, как и в не
обфусцированном виде
30
31
Что делать, если есть обфускация
1. Рыдать
2. Цепляться к константам (и их частичному деобфусцированию)
3. Искать готовые деобфускаторы
4. Разбирать инструкции шаг за шагом
32
Лекционная задача 2 до 29 октября 8:30
33
Не можем декомпилировать. Будем дизассемблировать
34
Дизассемблирование
Идея:
● Любая программа – машинный код
● Машинный двоичный код можно представить как код на языке
ассемблера
● Вместо 0 и 1 анализируем команды ассемблера
● Есть инструменты для преобразования ассемблерного кода
в псевдо-С язык
35
Инструменты для дизассемблирования
36
37
А нужно ли пытаться декомпилировать код
38
Поиск статичных данных
Идея:
● В коде используются статичные данные (строки, байты)
● Скорее всего, они как-то преобразовываются (например, используются
для кодирования / декодирования, проверки пароля)
● Давайте их найдем при помощи утилиты strings
● Либо, получим полезные сигнатуры для дальнейшего анализа
39
Дебаггеры
● gdb
● lldb
● Ida debugger
Идея:
● Давайте выполнять программу пошагово, наблюдая, что делает каждая
инструкция
40
Перехват системных вызовов
Идея:
● Программы часто используют системные вызовы (например, открытие
файлов для чтения / записи)
● Давайте попробуем использовать концепцию Man-in-the-Middle и
смотреть, что программа вызывает, при помощи strace
41
Пример strace
42
Перехват вызовов библиотек
Идея:
● Если программа использует библиотеки из хост системы – мы можем
попробовать перехватить вызовы из этих библиотек (например,
сравнение двух строк)
● Перехватить эти вызовы мы можем при помощи ltrace
43
LD_PRELOAD
Идея:
● Все библиотеки для динамически собранных приложений откуда-то
берутся
● Давайте мы подменим эти библиотеки на свои (например, для того,
чтобы вывести отладочные сообщения при каждом вызове
интересующей нас функции)
● Это можно сделать при помощи переменной LD_PRELOAD
44
Ответы на вопросы
45
Что дополнительно изучить для реверса
46
Практика
47