Вы находитесь на странице: 1из 47

Пролог

Компьютерная Безопасность: Введение в CTF

1
Промежуточные итоги

● Есть полные решения веба


● Ждем именную задачу по вебу
● Веб заходит значительно сложнее
крипты
● Нет новых решивших крипту

2
Reverse Engineering

Компьютерная Безопасность: Введение в CTF

3
Почему появилась потребность в Reverse Engineering

1. Любопытство: всегда интересно, что автор программы прячет внутри


2. Желание не платить: зачем платить, если можно взять бесплатно (здесь
мы говорим про лицензионный софт)
3. Противодействие хакерам: много шифровальщиков и другого
вредоносного ПО
4. Конкуренция: проще украсть идею, чем ее придумать

4
Где можно найти RE в безопасности

● SOC L2/L3
● Malware analyst (встречается в антивирусных компаниях)
● Digital forensics

---
● Bug Bounty*

5
Где можно найти RE в ИТ вакансиях

1. RnD (Research and Development)


1. Анализ ПО вендоров
2. Анализ прошивок оборудования

6
Какие навыки можно получить, занимаясь реверсом

● Чтение кода. Вам придется научиться читать код, причем много кода
● Опыт работы с ассемблером. В некоторых случаях (~20%) вам придется
читать ассемблер
● Опыт дебага. Через вас пройдет огромное количество кода, который
иногда стоит отлаживать в рантайме
● Написание кода. Для решения некоторых задач вам придется писать
свои скрипты

7
Общая идея реверса

8
Понять, что написал автор

9
Чтобы украсть. Пример: Silicon Valley (2014-2019)

● ГГ разработал
революционный алгоритм
● Компания Hooley хочет его
отобрать
● Команда RnD занимается
обратной разработкой
приложения, которое
использует этот алгоритм

10
Чтобы помочь. Пример: WannaCry (2017)

● WannaCry – компьютерный
вирус, бум которого пришелся на
2017 год
● Замедлить атаку получилось
благодаря ресерчеру, который
нашел захардкоженный домен

11
Как реверсить

12
Случаи реверса

1. Есть исходный код

2. Нет исходного кода, но можно декомпилировать приложение

3. Нет исходного кода, работаем с машинным кодом (ассемблером)

13
Лекционная задача 1 до 29 октября 8:30

Вы разработчик, который хочет защитить свой софт от статического реверс


инжиниринга:
- Как бы вы это делали?
- Что бы использовали?
Решения принимаются любые, вплоть до чего-то физического, но все же в
первую очередь интересны софтварные способы.

14
Есть исходный код

15
TODO: картинка с примером какого-нибудь кода

16
Подход «сверху вниз»

1. Определяем точки, с которыми взаимодействует пользователь


(например, команды или endpoints веб приложения)
2. Для каждой точки строим граф вызовов (например, точка /api/v1/login
обращается к функции find_user_by_login_and_pass(login, password))
3. Анализируем конечные точки (их код) и ищем ошибки, которые мог
допустить автор кода

17
Подход «снизу вверх»

1. Ищем потенциально уязвимый код (где могут быть SQL- или Shell-
инъекции)
2. Строим граф по принципу «кто вызывает этот код»
3. Находим точку входа пользователя и проверяем этот путь (т.е.
Получится ли доставить полезную нагрузку до этой функции)

18
TODO: пример с AST деревом

19
Про эффективность подходов. Личный опыт

● Каждый определяет свой стиль, в котором ему удобно работать


● Я предпочитаю сочетать подходы 50/50: сначала определяю входные
точки, потом ищу подозрительный код (держа в голове входные точки)
● Первый подход более надежный, но медленный
● Второй более быстрый, но менее надежный (не покрывает всю кодовую
базу, так как внимание переключается на единственный кейс)

20
Нет исходного кода. Можно декомпилировать

21
Почему есть возможность декомпиляции

● Особенности языка программирования (например, Java с ее bytecode и


отладочной информацией)
● Потому что ресерчеры проделали великолепную работу по созданию
инструментов декомпиляции

22
Как понять что декомпилировать

● Посмотреть на бинарник при помощи утилиты file


● Посмотреть захардкоженные строки при помощи утилиты strings
● Обращать внимание на магические байты
● Положиться на свой опыт

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
Инструменты для дизассемблирования

● IDA Pro + Hex-rays


● Ghidra
● Cutter

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
Что дополнительно изучить для реверса

● Курс SPbCTF по реверсу


● Hackerdom введение в Reverse Engineering
● Задачи с HackTheBox (разделы reverse и forensics)
● Практика CTF соревнований (и чтений райтапов)

46
Практика

● ELF x86 – 0 protection


● ELF x86 – Basic
● PE DotNet – 0 protection
● ELF C++ - 0 protection

47

Вам также может понравиться