Презентация первого подкаста образовательного цикла "Обратная разработка приложений без исходного кода и поиск в них уязвимостей". Аудио-запись находится здесь https://vimeo.com/224742672.
3. Определение термина обратной разработки
Обратная разработка (реверс-инжиниринг, RE) – процесс, целью которого
стоит изучение аспектов внутреннего устройства программного или
аппаратного обеспечения в условиях отсутствия документации, их
описывающей.
4. Что понимается под документацией?
Любой достоверный источник информации, предоставленный авторами системы. Форма
представления не важна и может быть, например, такой:
книги
вики
переписка
видео-материалы
конференции
…
5. Объекты обратной разработки
Программы без исходных кодов (машинный код реальных
микропроцессорных архитектур)
Недокументированное или плохо документированное ПО с исходными
кодами (обфусцированный исходный код, .NET/Java-приложения)
Аппаратное обеспечение
6. Виды деятельности, требующие навыков RE
Борьба с преступностью (анализ вредоносного ПО)
Исследование проблем безопасности (поиск и эксплуатация уязвимостей)
Обход защитных механизмов (борьба с протекторами и обфускаторами)
Клонирование компонентов программ (изучение форматов данных)
Восстановление поврежденной информации (анализ дампов ФС)
Автоматизация получения исходного кода (анализ компиляторов и ВМ)
7. Исследование проблем безопасности: формы
Capture The Flag (CTF)
Red Team
Тест на проникновение
Поиск уязвимостей на заказ
Bug Bounty
No Such Agency
8. Примерные цены на уязвимости «нулевого дня»
Название уязвимого ПО Тип уязвимости Рыночная цена (тысяч $)
Apple iOS Удаленный Jailbreak 1500
Android Удаленный Jailbreak 200
Adobe Flash Player Удаленное выполнение кода +
обход песочницы
100
Microsoft Windows Повышение привилегий 90
Adobe Reader, Google Chrome,
Microsoft IE
Удаленное выполнение кода +
обход песочницы
80
Microsoft Office (Word, Excel) Удаленное выполнение кода 40
9. Исследование проблем безопасности: типовые задачи
Написать эксплойт по публичному описанию уязвимости
Разобраться в коде неработающего эксплойта и починить его
Просканировать TCP-порты активных узлов локальной сети
Написать фаззер для проприетарного протокола или формата файла
Найти уязвимость нулевого дня
Написать отчет по результатам ресерча
10. Клонирование ПО и восстановление кода: типовые задачи
Изучить закрытый сетевой протокол и написать под него клиента
Выяснить предназначение полей проприетарного формата файла и добавить его
поддержку в свою программу
Изучить драйвер устройства и переписать его под другую ОС
Разобрать код виртуальной машины и написать дизассемблер её байт-кода
Изучить устройство компилятора и написать декомпилятор для генерируемых им
программ
11. Почему не перспективен взлом программ?
Никто не будет платить больше, чем стоит одна лицензия
Зачастую обход защит – разовая, не постоянная работа
Мало перспектив технического роста – нечего созидать
Нет перспектив вертикального роста – нет коллектива
Уголовный (как минимум, теневой) характер деятельности
Постепенный захват рынка веб-приложениями
Смещение фокуса с программы на контент
12. Чем плохи соревнования CTF?
Зачастую они оторваны от жизни и дают лишь базовые навыки проведения исследований
У участников команды нет полноценной ответственности за отсутствие результата
Участие в соревнованиях не является подтверждением квалификации или пропуском на
серьезные проекты
Победы в соревнованиях котируются только среди других «спортсменов»
13. Промежуточные итоги
1. Обход лицензионных механизмов в ПО как направление деятельности – это дно отрасли
2. Поиск уязвимостей с целью их продажи – прибыльная тема, но для небольших команд,
из-за нестабильности дохода
3. Обратная разработка с целью создания ПО – круто и полезно, но только для обеспечения
совместимости
4. Разработка средств трансляции кода – Олимп, к которому нужно идти
5. Начинать карьеру в реверсе лучше с позиции интерна, а не CTF-игрока
15. Миф №1
Y: Любой специалист в RE должен уметь пользоваться программой IDA Pro.
I: Это не так:
знание инструмента – не основной штрих портрета реверс-инженера
интерактивная обратная разработка – это хорошо, но сейчас актуальней
автоматизация этого процесса
16. Миф №2
Y: Любой специалист в RE должен знать устройство ядер популярных ОС.
I: Это не так:
Количество прикладного ПО существенно больше количества драйверов –
задач и проектов там больше
Навыки RE в данном направлении вторичны – на первом месте разработка
компонентов ядра
17. Миф №3
Y: Любой специалист в RE должен хорошо разбираться в электронике.
I: Это не так:
В корне жизнеспособности современных информационных систем лежит
абстракция – можно всю жизнь искать баги в User Mode и сытно жить
Даже проекты по исследованию встраиваемого ПО не всегда требуют
навыков проектирования/чтения цифровых схем
18. Миф №4
Y: Специалист в RE не обязан уметь разрабатывать ПО.
I: Это не так:
Экономия на кадрах вынуждает искать или растить человека-оркестра –
исследователя и разработчика в одном лице
Понимание различных аспектов разработки и логики программистов
упрощает RE и поиск багов
19. Миф №5
Y: Специалист в RE не обязан хорошо знать C++.
I: Это не так:
Крупные и требовательные к ресурсам коммерческие программы пишутся
на C++ (включая встраиваемое ПО)
Популярные в области автоматизации анализа программ проекты LLVM и
Clang написаны на C++
20. Миф №6
Y: Специалист в RE не обязан разбираться в естественно-научных дисциплинах.
I: Это не так:
27. Языки программирования
Отличное владение C, C++, Python. Остальное – по необходимости.
Может пригодиться умение читать C#, Java, JavaScript.
Может пригодиться навык разработки на Perl, Ruby, Lua.
Не забывать про функциональные языки!
29. Алгоритмы и структуры данных
Robert Sedgewick: Algorithms in C++
Thomas Cormen: Introduction to Algorithms
Alfred Aho: Data Structures and Algorithms
Donald Knuth: The Art of Computer Programming
http://www.compression.ru/
http://e-maxx.ru
30. Теория компиляции
Aho, Sethi, Ullman, Compilers: Principles, Techniques, and Tools
Grune, Reeuwijk, Bal, Jacobs, Langendoen: Modern Compilers Design
Lopes, Auler: Getting Started with LLVM Core Libraries
http://citforum.ru/programming/theory/serebryakov/
http://www.ispras.ru/groups/ctt/publications.php
http://www.iecc.com/linker/
http://llvm.org/pubs
31. Архитектура операционных систем
Andrew Tanenbaum: Modern Operating Systems
Jeffrey Richter: Programming Applications for Microsoft Windows
Russinovich, Solomon, Ionescu: Windows Internals
Tanenbaum, Steen: Distributed Systems. Principles and Paradigms.
32. Сетевые протоколы
Andrew Tanenbaum: Computer Networks
Ilya Grigorik: High Performance Browser Networking
Medhi, Ramasamy: Network Routing: Algorithms, Protocols, and Architectures
https://tools.ietf.org/area/int
33. Криптография
Bruce Schneier, Tadayoshi Kohno: Cryptography Engineering. Design Principles
and Practical Applications
Bruce Schneier: Applied Cryptography. Protocols, Algorithms, and Source Code in
C
Menezes, Oorschot, Vanstone: Handbook of Applied Cryptography
34. Обратная разработка
Dennis Yurichev: Reverse Engineering for Beginners
Chris Eagle: The IDA Pro book (2011)
Dang, Gazet, Bachaalany: Practical Reverse Engineering
https://reverseengineering.stackexchange.com
http://www.devttys0.com
35. Поиск уязвимостей
Justin Seitz: Gray Hat Python
Jon Erickson: Hacking. The Art of Exploitation
Anley, Heasman, Linder, Richarte: The Shellcoder's Handbook
http://www.phrack.org
https://www.corelan.be/index.php/articles
https://firmwaresecurity.com