Ах, чудеса Интернета! Огромная цифровая игровая площадка, где мы все невинно искали эти «абсолютно легальные» (Эм) взломанные версии программного обеспечения по крайней мере один раз, верно? Я имею в виду, кто бы не хотел сэкономить несколько долларов, используя эти запрещенные цифровые вкусности? Но знаете ли вы, что за нашими любопытными поисками скрывается увлекательное технологическое волшебство, известное как реверсирование.

Да, мои товарищи искатели приключений, реверсирование — это мистическое искусство понимания того, как работает конкретная программа, используя механизмы, которые могут заставить даже Мерлина в замешательстве почесать свою волшебную бороду. Это похоже на решение загадки, окутанной загадкой, спрятанной внутри цифрового лабиринта, с частью загадочных головоломок просто для удовольствия. Эм-м-м! Я должен прекратить это и уже перейти к теме 🤓.
Вы когда-нибудь интересовались тем, как работают определенные программы, или задавались вопросом, как людям удается находить взломанные версии программ? Ну, друг мой, вот где в игру вступает реверс. Это позволяет нам углубиться в механику конкретной программы, исследуя ее структуру, логику и поведение. Это путешествие, в котором мы приоткрываем завесу над цифровыми конструкциями и раскрываем секреты, которые они хранят.

О, радость реверса! Это как быть 🕵️, который может волшебным образом расшифровать секреты программы, даже не заглядывая в ее исходный код. Поистине, сверхспособность дарована лишь избранным!

Итак, ваш озорной друг Фу решил, что сможет перехитрить вас, передав вам таинственный двоичный файл C. Но мало ли он знает, что вы собираетесь отправиться в эпическое путешествие обратного проектирования. Приготовьтесь надеть свою виртуальную шляпу Шерлока Холмса и дать волю своему внутреннему детективу! 🔍

Теперь представьте, что этот двоичный файл невинно сидит на вашем компьютере и дразнит вас своим загадочным присутствием. Вы загружаете его, чувствуя, как трепет неизвестного течет по вашим венам. И вуаля! Программа запустится и запросит у вас секретный код.

Но не бойтесь, вы обладаете мистической силой реверсирования! 😌 Вы внимательно изучаете вывод, анализируя его, как криптограф, изучающий древний свиток. Каждая строка содержит подсказку, часть головоломки, которая раскроет скрытые секреты программы.

Вы можете столкнуться со странными вызовами функций и адресами памяти, которые неопытному глазу кажутся тарабарщиной. Но не бойся, бесстрашный исследователь, ибо ты раскроешь их истинный смысл! Щелчком своего метафорического увеличительного стекла вы прослеживаете процесс исполнения шаг за шагом, пока туман тайны не начнет рассеиваться.

Через минуту мы увидим, как это сделать, но сначала нам нужно понять жизненный цикл программы на C:

Ах, увлекательное путешествие программы на C! Он проходит через несколько фаз, подобно метаморфозе, пока, наконец, не появляется в виде файла a.out, который ваш компьютер (или, как я люблю его называть, ваша послушная операционная система) может понять. Этот файл a.out представляет собой специальную программу, содержащую то, что называется машинным кодом. А теперь позвольте мне открыть вам небольшой секрет: машинный код не предназначен для человеческого восприятия. Это как чужой язык, который понимает только ваш компьютер. Но не бойтесь, мой дорогой Ватсон, обладайте экстраординарной способностью взломать этот код!

Теперь приготовьтесь к настоящему веселью. Наше приключение в реверсировании начинается с мистического царства машинного кода. Но подождите, мы не останавливаемся на достигнутом! Нет, нет, мы смелые детективы, всегда готовые пройти лишнюю милю. Итак, делаем шаг назад и погружаемся в чарующий мир ассемблера. Кто-то может сказать, что понимания ассемблера достаточно, чтобы расшифровать намерения кода, но это всего лишь язык не-людей (хотя, должен признаться, я где-то посередине, понимаю ассемблирование, но не быстрее, чем C 🤫).

Как только мы протанцуем замысловатый танец сборки, нас ждет волшебное откровение. Вот святой Грааль реверсирования: этап декомпиляции! Мы преобразуем сборку обратно в код C, подобно волшебнику, вызывающему исходное заклинание. И не бойся, мой друг, мы не одиноки в этом волшебстве. Существует множество инструментов, великолепных инструментов, которые могут совершать это колдовство от нашего имени.

Ах, вот сокровища в нашем инвентаре реверс-инжиниринга! Позвольте представить вам Ghidra, инструмент, выбранный для сегодняшней демонстрации (хотя IDA или любого другого декомпилятора может быть достаточно, если вам это нравится). Эта волшебная хитроумная штука без особых усилий перевернула любимый бинарный файл Foo a.out, и вуаля! У нас есть исходный код обратно. Круто, да?

Но придержите свое волнение, мой дорогой друг, ибо это всего лишь крошечный камешек на нашем пути. Базовая программа с одной функцией? Детская игра! Представьте себе ужас реверсирования настольного приложения с тысячей функций. Это уродливая сторона реверса, мой друг. Но не бойтесь, мы не из тех, кто так легко сдается!

Теперь давайте переключим передачу и рассмотрим другую перспективу. Декомпиляторы не всегда являются героями, которых мы ожидаем. Иногда нам нужно обратиться к gdb, благородному отладчику, чтобы шаг за шагом проанализировать код. Но будьте осторожны, потому что мы попали в ловушку машинных инструкций. Это все равно, что пытаться понять танцевальную программу, анализируя только движения танцоров. Довольно сложная задача, должен сказать, но мы к ней готовы!!!! 🤺

Наша верная первая косая черта, «информационные функции», раскрывает загадочные функции, скрытые в нашем двоичном файле. Теперь давайте наденем наши мыслительные колпаки и задумаемся над этим глубоким вопросом: какую функцию мы сочтем достойной наших усилий по обращению вспять? Ах да, ответ ясен! Давайте нацелимся на это великолепное существо по имени «главный» и рассмотрим его. Приготовьтесь, дорогой друг, разгадка его секретов начнется!

Дамы и господа, займите свои места, пристегните ремни безопасности и приготовьтесь к умопомрачительной феерии разборки! Мы собираемся нырнуть с головой в бездну «главной» функции, где таятся настоящие тайны. Держитесь крепче, пока мы «разбираемся с главным» и отправляемся в эпическое путешествие по раскрытию секретов, которые до сих пор ускользали от нас.

взгляните на великолепные машинные инструкции, которые оживляют наш скромный проект! Признайтесь, вы совершенно озадачены этим загадочным языком инопланетян, известным как ассемблер. Выглядит пугающе, не так ли? Но не бойтесь, секреты, которые он хранит, стоят того, чтобы их раскрыть. Сейчас я не буду слишком углубляться в тонкости сборки, но позвольте уверить вас, мой друг, что это действительно того стоит.

Теперь давайте закроем эту главу и откроем другую. Декомпиляция программы не всегда является делом Ghidra и gdb. Все зависит от используемого языка. Например, среди прочих инструментов можно использовать Dnspy для программ .NET или pycdc для байт-кода Python. Искусство реверсирования заключается в том, чтобы найти способ преобразовать этот двоичный код или байт-код во что-то понятное.

Но прислушайся к моему предупреждению, дорогой друг. Это путешествие не должно быть прогулкой в ​​парке. По пути вы столкнетесь с множеством запутанных вещей, требующих интенсивной концентрации, чтобы разобраться во всем этом. Мы можем выйти из глубины бинарных файлов на вершины веб-сайтов. Да, даже код JavaScript можно обратить. Большинство приложений JavaScript, как правило, запутывают свою логику, пытаясь скрыть ее от посторонних глаз. Но не бойтесь, ведь мы реинкарнации самого Шерлока Холмса, помните? (Эм)

Итак, давайте заглянем в это пленительное царство и посмотрим, какие тайны ждут нас.

(Одна из задач, которую мы решили в PWNME 2023)

Ах, царство запутанного JavaScript. Для этого мы должны сначала приступить к поиску простых функций, дав им осмысленные имена и разгадав их назначение. Мы тестируем функции со статическим возвратом (используя веб-отладчик), настраиваем и модифицируем их, пока они не обретут смысл. Шаг за шагом мы распутываем паутину обфускации, пока код JavaScript не начнет раскрывать свои истинные намерения.

Но позвольте мне пояснить, дорогой искатель приключений, что это введение лишь поверхностно затрагивает эту захватывающую тему. Он служит кратким обзором области запутанного JavaScript и проблем, которые он представляет. Путь вперед теперь в ваших руках. Погрузитесь в ничто, небо вам не предел, откройте для себя больше знаний и погрузитесь глубже в хитросплетения этой увлекательной темы. Приключения ждут, мой друг. Приятного изучения!

Ресурсы:
.
Нет ничего лучше, чем самому писать программы и самостоятельно их реверсировать.
. Реверсирование требует большого количества сценариев, я бы посоветовал изучить эти библиотеки после того, как вы ознакомитесь с концепциями:
- Pwntools
- Злоба
 – Z3

Реверс - это навык, в отличие от бинарных эксплойтов и веб-эксплойтов, где вы изучаете конкретные векторы атаки, здесь просто опыт - это ключ, а попытки, попытки и еще попытки - ваш единственный друг !!

Вы действительно можете заняться реверс-инжинирингом, если не можете заниматься форвард-инжинирингом (то есть программированием).
Представьте, что реверсирование похоже на билдинг, вы должны сначала понять, как добраться до него напрямую, если вы понимаете, как возврат назад принесет пользу. больше не будет проблемой.

Имея любопытство, чтобы понять, что происходит внутри, это то, что вам нужно в этой области!

Спасибо за внимание ❤️
Следующая тема: The Heap (между Advanced и Blackmagic)