- Главная
- Блог
- Информационная безопасность
- Бинарная эксплуатация: сложный путь
Бинарная эксплуатация: сложный путь
Введение
Я – новичок в области информационной безопасности, который хочет освоить ремесло поиска и эксплуатации уязвимостей в бинарных приложениях. Решил написать пару слов о том, как я планирую выстроить свой подход к обучению. Все написанное является лишь моим мнением и далеко не истинной в последней инстанции. Ввиду отсутствия опыта я не могу претендовать на какую-либо “экспертность”, если вас это не пугает и вам интересен свежий взгляд, то приятного чтения!
Срыв одеяла абстракций
Если у вас есть желание создать свой небольшой сайт или приложение – вам повезло жить в это время. Ведь сейчас существует множество различных курсов по программированию. По заверению их авторов, даже без какого-либо технического бэкграунда можно за несколько месяцев освоить популярный язык программирования (например Javascript) и начать воплощать на нем ваши задумки. И это действительно так. Дело в том, что современные языки программирования скрывают от программистов всю сложность реального устройства компьютерных систем. И вам, что бы разрабатывать какие-либо приложения, уже не обязательно понимать, как реально компьютер будет исполнять код на вашем языке, достаточно знать лишь сам язык.
Программируя на языке высокого уровня вы оперируете такими абстракциями, как переменная, объект, условный оператор, текстовая строка и т.д. Потом компилятор или интерпретатор переводит эти абстракции в понятный для машины набор команд. Поистине, гениальная задумка, избавляющая современных программистов от нужды держать в голове кучу концептов, касающихся деталей устройства компьютера позволяя им сконцентрироваться непосредственно на логике разрабатываемого приложения.
Но для хакера же (под “хакером” в данной статье понимается человек, который исследует программный код с целью поиска в нем уязвимостей), если он хочет выявить уязвимость в программе и вообще понимать их природу (в данной статье, как я уже упоминал, мы говорим об уязвимостях в бинарных приложениях то есть тех, которые скомпилированы в двоичный код), важно иметь знание о том, что у компьютера “под капотом”. Потому что при анализе бинарного кода хакеры мыслят категориями, близкими к архитектуре компьютера: стек, регистры, флаги, командный цикл и т.д. Ведь мы уже имеем дело не с кодом высокоуровневого языка, а с тем самым набором команд, которые должен исполнять компьютер. Поэтому я скептически отношусь к инструментальному подходу, когда мы без предварительных знаний об организации компьютера сразу смотрим туториалы , например, по Иде (IDA – популярная программа использующаяся при анализе машинного кода) и пытаемся сходу вникнуть в суть дела. Нужно потратить некоторое время чтобы загрузить в свой разум фундаментальное представление об устройстве компьютерных систем, и уже опираясь на него переходить непосредственно к исследованиям и взломам.
Ознакомившись с существующими статьями, курсами и книгами по низкоуровневым аспектам устройства компьютера а также по бинарной эксплуатации я условно выделил для себя набор тем, которые необходимо изучить, разбил их на этапы, а также подобрал подходящий учебный материал для каждой темы. Я в некоторой степени владею английским языком, поэтому материал, который я выбрал, будет в том числе и на английском. Но если вы предпочитаете потреблять информацию на русском, к каждому выбранному мною англоязычному курсу или книге я приведу аналог на русском языке.
Немного о выборе учебного материала
С одной стороны, сама область бинарной эксплуатации довольно широка. Ведь как я писал выше, эта сфера ИБ сильно повязана на детали устройства платформы, которая вам интересна с точки зрения взлома. Вы хотите взламывать прикладные приложения работающие под операционной системой Windows? Это одно. Если вам интересна, например, эксплуатация не прикладных приложений, а самой операционной системы – тут нужен уже немного другой подход. Или, например, вам интересен взлом прошивки какого-нибудь “умного устройства”? Это уже третье.
Так как же подойти к обучению?
Несмотря на то, что подход к разработке эксплойтов варьируется от платформы к платформе, тем не менее существует некое общее ядро знаний. Статья как раз таки описывает, как можно усвоить это ядро. Материал, подобранный тут, учит эксплуатации на операционной системе Linux под архитектурой x86. Да, может показаться, что если мне интересна другая платформа, почему бы сразу не перейти к ней? Дело в том, что Linux представляет собой открытую операционную систему и ее проще использовать на начальных этапах обучения. Также много качественного материала по низкоуровневым вещам ориентированы на Linux. Процессор с архитектурой x86 скорее всего уже имеется установлен в вашем компьютере. И под эту архитектуру также представлено много хорошего материала по бинарному хакингу. Поэтому мне представляется разумным использовать Linux под x86 в качестве полигона на котором можно обкатать базовые навыки и получить то самое ядро знаний, после чего уже не составит проблем выбрать интересующую с точки зрения взлома платформу и освоить эксплуатацию уже под нее.
Итак, теперь переходим непосредственно к темам для обучения и учебному материалу, который я подобрал.
0. Базовые сведения об электричестве и электрических цепях
Современный компьютер это грубо говоря очень большая электрическая цепь, однако при исследовании машинного кода мы обычно абстрагируемся от физического строения компьютера и рассматриваем его на информационном уровне. Так что детальные знания об электротехнике нужны скорее проектировщикам процессоров чем хакерам. Тем не менее в материалах по архитектуре компьютера иногда приводятся какие-то базовые факты об электронном уровне устройства компьютера, так что иметь представление хотя бы о самых основных понятиях в сфере электроники было бы не лишне. К основным понятиям я бы отнес такие как заряд, проводимость, электрический ток, электрическая цепь, напряжение, сопротивление, закон Ома, последовательное и параллельное соединение цепей. Я просмотрел множество книг по этой теме и лучшей мне показалась книга Рудольфа Свореня “Электроника шаг за шагом”. Достаточно прочитать первые четыре главы, в них все очень понятно объяснено.
1. Введение в устройство компьютерных систем
Курс The Computing Technology Inside Your Smartphone
Это бесплатный курс, который я сейчас прохожу. Несмотря на название курс посвящен не только устройству современных смартфонов, он дает общее представление об организации современных вычислительных систем: из каких основных компонентов они состоят и как эти элементы взаимодействуют друг с другом (на примере учебной архитектуры LC-3 ). Также там рассматриваются связь между софтом и железом. Мне как начинающему курс очень заходит.
Книга Цифровая схемотехника и архитектура компьютера
В качестве альтернативы на русском языке можно привести эту книгу. Книга является переводом с американского издания и ее можно официально скачать абсолютно бесплатно (habr.com/ru/post/306982/). Я встречал много похвалы в адрес этой книги, например, вот один содержательный отзыв: “книга сводит вместе миры программного обеспечения и аппаратуры, являясь одновременно введением и в разработку микросхем, и в низкоуровневое программирование для студентов младших курсов.”
2. Язык C
С этим языком я уже знаком, и когда-то учил его по книге “Язык программирования C. Лекции и упражнения”. Книга мне понравилась: она системна, структурирована и написана доступным для начинающих языком.
3. Основы работы в Linux
Поскольку, как я писал выше, я использую Linux, то для эффективного обучения необходимо иметь некоторые навыки работы в данной операционной системе. По Linux’у существует много курсов книг, лучшей мне показалась Внутреннее устройство Linux.
4. Системное программирование под x86
Introduction to Computer Systems
После освоения предыдущих тем, я планирую пройти этот курс.
Курс представляет собой самое основательное введением в низкоуровневое программирование под x86, которое мне только удалось найти. В нем сначала рассматривается устройство этой архитектуры, затем язык ассемблера, затем системное программирование на Си а также работа компилятора. В курсе также упомянуты базовые бинарные уязвимости.
Введение в архитектуру ЭВМ. Элементы операционных систем.
Русскоязычный аналог. В этом курсе рассмотрены аналогичные темы, отзывы в целом хорошие, но пишут что некоторые вопросы не до конца раскрыты и при прохождении курса приходится самому искать недостающую информацию в Гугле.
5. Основы бинарного хакинга
Computer Security: A Hands-on Approach
Этот курс уже напрямую посвящен бинарной эксплуатации. Я выбрал его на основе отзывов, и еще потому что курс очень свежий и в нем разбираются многие недавно нашумевшие уязвимости. Так же автор указывает, что курс содержит в себе много практики и все взломы можно будет провести в специально подготовленной виртуальной среде.
Binary Exploitation Course
В качестве русскоязычной альтернативы мне удалось найти данный курс. К сожалению отзывов о нем мало, а моя на данный момент низкая квалификация не позволяет судить о качестве курса. Но интуитивно мне он кажется хорошим.