Что такое reverse engineering

Реверс-инжиниринг для начинающих: основные концепции программирования

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

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

Примечание Программный код для этой статьи компилируется с помощью Microsoft Visual Studio 2015, так что некоторые функции в новых версиях могут использоваться по-другому. В качестве дизассемблера используется IDA Pro.

Инициализация переменных

Переменные — одна из основных составляющих программирования. Они делятся на несколько видов, вот некоторые из них:

Примечание в С++ строка — не примитивная переменная, но важно понять, как она будет выглядеть в машинном коде.

Давайте посмотрим на ассемблерный код:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Здесь можно увидеть как IDA показывает распределение пространства для переменных. Сначала под каждую переменную выделяется пространство, а потом уже она инициализируется.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

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

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Инициализация строковой переменной в C++

Для инициализации строки требуется вызов встроенной функции.

Стандартная функция вывода

Примечание Здесь речь пойдёт о том, что переменные помещаются в стек и затем используются в качестве параметров для функции вывода. Концепт функции с параметрами будет рассмотрен позднее.

27–29 декабря, Онлайн, Беcплатно

Теперь посмотрим на машинный код. Сначала строковый литерал:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Вывод строкового литерала

Теперь посмотрим на вывод одной из переменных:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Математические операции

Сейчас мы поговорим о следующих математических операциях:

Переведём каждую операцию в ассемблерный код:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Для сложения мы используем инструкцию add :

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

При вычитании используется инструкция sub :

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

При умножении — imul :

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

При поразрядной конъюнкции используется инструкция and :

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

При поразрядной дизъюнкции — or :

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

При поразрядном исключающем ИЛИ — xor :

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Поразрядное исключающее ИЛИ

При поразрядном отрицании — not :

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

При битовом сдвиге вправо — sar :

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Битовый сдвиг вправо

При битовом сдвиге влево — shl :

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Битовый сдвиг влево

Вызов функций

Мы рассмотрим три вида функций:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Вызов функций без параметров

Функция newfunc() просто выводит сообщение «Hello! I’m a new function!»:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Вызов такой функции выглядит следующим образом:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Вызов функции с параметрами

Посмотрим на код функции:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Циклы

Теперь, когда мы изучили вызов функции, вывод, переменные и математику, перейдём к контролю порядка выполнения кода (flow control). Сначала мы изучим цикл for:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Графический обзор цикла for

Прежде чем разбить ассемблерный код на более мелкие части, посмотрим на общий вариант. Как вы можете видеть, когда цикл for запускается, у него есть 2 варианта:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Теперь давайте взглянем на цикл while :

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

В этом цикле генерируется случайное число от 0 до 20. Если число больше 10, то произойдёт выход из цикла со словами «I’m out!», в противном случае продолжится работа в цикле.

Условный оператор

Теперь поговорим об условных операторах. Для начала посмотрим код:

Посмотрим на ассемблерный граф:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Ассемблерный граф для условного оператора

Оператор выбора

Оператор выбора очень похож на оператор условия, только в операторе выбора одна переменная или выражение сравнивается с несколькими «случаями» (возможными эквивалентностями). Посмотрим код:

Оператор выбора не следует правилу «Если X, то Y, иначе Z» в отличии от условного оператора. Вместо этого программа сравнивает входное значение с существующими случаями и выполняет только тот случай, который соответствует входному значению. Рассмотрим два первых блока подробней.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Два первых блока оператора выбора

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Если var_D0 (A) равно 5, то код перейдёт в секцию, которая показана выше, выведет «5» и затем перейдёт в секцию возврата.

Пользовательский ввод

В этом разделе мы рассмотрим ввод пользователя с помощью потока сin из C++. Во-первых, посмотрим на код:

Разберём это в машинном коде. Во-первых, функция cin :

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Функция C++ cin детальнее

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Мы рассмотрели лишь основные принципы работы программного обеспечения на низком уровне. Без этих основ невозможно понимать работу ПО и, соответственно, заниматься его исследованием.

Источник

Реверс-инжиниринг. История. Моя

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

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

Начало

А начиналось всё ещё в далёком детстве. Думаю, как и многим парням (а может и девушкам), мне всегда было интересно знать, как же всё устроено, почему работает, почему не работает, и т.д.
Сначала я начал разбирать все машинки на батарейках, которые у меня были (даже те, что были у брата). Конечно, не всегда удавалось собрать, но, интерес был превыше. Потом нашёл какой-то старый радиоприёмник-магнитофон у отца в кладовке, и разобрал его тоже. Ещё были тамагочи. Но там я вообще ничего не мог понять: микросхема, «капля» и экран. Хотя да, экран я разбирал на слои.
Конечно же, за всё несобранное я получал по шапке.

Sega Mega Drive

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Отец купил мне её на день рождения: обычная пиратка, ибо лицензионных тогда не было, плюс картридж » Contra: Hard Corps «. Уверен, момент покупки приставки для многих детей 90-х не забыт до сих пор (ромхакеры и ретрогеймеры — привет!), а именно для меня он стал ещё и ключевым в будущем. Но обо всём по-порядку.

11-й класс

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

(прим. автора: тот самый компьютер, только куда позднее)

Осенью 2005-го года мне купили компьютер. С первых дней я начал играть в игры. Учёба в школе просела, но держалась на нормальном для гимназии уровне. А спустя полгода играть надоело. Тогда и свершился переломный момент!

Негеймер

Именно тогда, в 2006 году, как мне кажется, начался варезный бум. Куча сайтов с кряками, кейгенами, патчами. Каждый старался перепаковать инсталлятор так (привет сборкам Винды), чтобы скачавшему ничего лишнего делать не нужно было: установилось и работает, правда иногда добавляя что-то от себя.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Переводчик

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

cracklab.ru

Скачал для экспериментов себе парочку «крэкмисов» (программы, специально написанные для того, чтобы их реверсили, обучаясь при этом взлому и защите ). Попробовал — очень понравилось! Всё получилось с первого раза, чему я был несказанно рад.

В итоге, простые защиты снимались на раз-два с помощью патчинга (от слова patch — заплатка), а вот с теми, что посложнее (я решил попробовать эротические шашки и поддавки) как-то уже стало тяжело, и я остановился, решив вернуться к переводам.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Ромхакинг

Иногда играя в Сегу, мне попадались картриджи на русском языке, на титульных экранах игр которых были такие надписи как «Группа перевода SHEDEVR «, «Перевод NEW-GAME.RU «. Разработчики ли это, или же какие-то сторонние организации я не знал, но у них явно был доступ к каким-то манускриптам, древним текстам шумеров, в которых рассказывалось, как переводить игры на русский язык. И мне захотелось овладеть этими знаниями.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineeringЧто такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Так я открыл для себя форум «Шедевра«.

У них были статьи, были программы — всё необходимое для того, чтобы сделать твою любимую игру ещё и «твоей любимой игрой на русском языке«. Правда, статьи были только для NES (Nintendo Entertainment System, или по-народному: Денди, Сюбор). Но всё равно круто! И я погрузился в новые и увлекательные для себя темы: Ромхакинг и эмуляция ретро-консолей на ПК.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Если вкратце, то ромхакинг — это любое изменение образа или файла игры, с какой либо целью: перевод, исправление кода, графики.

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

Я учитель

Сделав какие-то переводы «в стол», а какие-то и в народ, я вернулся к исполняемым файлам Windows. Ещё немного поднаторев в ассемблере, я понял, что «секретных» знаний во мне теперь чересчур много, и мне есть что рассказать из своего опыта, есть чем поделиться, и что ещё не было описано в имеющихся статьях. Хотелось передавать знания таким же новичкам, каким я был сам (видимо, сказывается то, что мама — учитель).

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

Получив положительные отзывы, я писал ещё и ещё, понимая, что спрос есть.

Инструменты

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

А в универах учат реверсу?

Если в двух словах, то в Беларуси с этим туго, и, насколько я знаю, в России и Украине тоже. Почему? Да потому что специалисты этой профессии обычно нужны в одной с половиной организации, и, обычно, полтора человека. Собственно, и преподавателей не так много.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

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

Например, в Беларуси я знаю только два-три места, куда требуются реверс-инженеры. В России, конечно, ситуация получше, но, специалистов также немного.

Первая работа

В одну из этих фирм я и решил пойти работать вирусным аналитиком, понимая, что, собственно, больше и некуда.
Реверсишь малварь, клепаешь сигнатуры, изучаешь принципы работы вредоносного ПО, пишешь расшифровщики для ransomware (если получается), попутно улучшаешь ядро.

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

Другой ассемблер

Однажды я узнал, что кроме ассемблерного кода Intel (16-, 32-, 64-битного) бывает и другой, по-началу кажущийся совершенно непохожим на тот, что ты знаешь. Это произошло в тот момент, когда я добрался до перевода своей любимой игры — » Thunder Force III «, в которую брат играл лучше меня.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

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

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

P.S. Thunder Force III я так и не перевёл, но написал редактор уровней к ней.

Sony Playstation

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Обратное мышление и первый кейген

Знаете, что тогда стало для меня настоящим испытанием? Имея на руках лишь ассемблерный листинг кода, который распаковывает что-либо, написать к нему упаковщик. Здесь потребовалось выработать обратное мышление, которое практически не требовалось во время патчинга «крэкмисов«, и излечивания программ от жадности.

Я пытался идти от обратного, понимая, что должно быть на выходе, на входе, и какие байты сжатых данных за что отвечают, чтобы сделать такие же.

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

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

Статья о кейгене

А вот писать статью о кейгене было тяжело. Тяжелее написания кейгена. Т.к. в статье передать принцип обратного мышления довольно таки сложно. Как и всё, что приходит с опытом.

Крякерские команды

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

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

Собравшись с духом, пишешь письмо, с просьбой присоединиться. Высылают задание в виде кейгенми. Решаешь его, после чего тебе дают доступ в чатик команды.

На самом деле, не все из них реверсеры. Кто-то художник, кто-то умеет доставать платный софт, у кого-то вычислительные мощности (возможность факторизовать любой публичный ключ RSA-512 за два дня, на 2013-й год, если это требовалось для снятия лицензионной защиты). В общем, преимущества налицо. Но софт для релиза всё равно выбираешь сам, чаще всего. И денег за релизы не получаешь. Правда.

Проблемы с законом?

Да, за распространение кряков и кейгенов всё таки есть вероятность загреметь (особенно если программа популярная и стоит много денег). В любой момент может произойти контрольная закупка: тебе напишет дядя, который хочет «взломать Adobe / 1C Бухгалтерия сколька будит стоеть» (реальная история). Но ребята хотят выживать, особенно если работы нет, а «навык«-то применять хочется, не важно пока куда. И начинают идти на крайности.

… барыжат ломаным софтом, взламывают программы за деньги.

И, в тот момент, когда появляется желание жить честно, крякер идёт устраиваться на работу, там откапывают его прошлое, и — «Извините, но Ваше прошлое сыграло не в Вашу пользу!«. Хотя, с моей позиции, человека с таким опытом стоит брать с руками и ногами, ведь, во первых, вы даёте человеку возможность исправиться, и, во вторых, направляете его знания в правильное русло. Среди моих знакомых действительно есть примеры успешного трудоустройства в антивирусную область, где товарищ на собесе сказал, что взламывал программы на заказ.

Честно заработанный лицензионный ключ

Да, и такое бывает. Даже у крякера. Были где-то статейки о том, как выпросить у разработчика ключ. И я так пробовал делать. Не помогало.

Тогда я перевёл программу на белорусский язык, и отправил автору языковой файл. За что получил в ответ лицензионный ключ на своё имя! Мой первый лицензионный ключ.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Что дальше?

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

Ещё бывают реверс-инженеры хардварщики (те, что железо реверсят), но о них я знаю мало. Хотя, тема очень даже интересная. Я же больше по программной части.

Нирвана

Источник

Reverse engineering: обратная разработка приложений для самых маленьких

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Выделяют 4 методики проведения обратной разработки:

анализ обмена данными приложения, с помощью различных анализаторов трафика;

использование режима отладки для поиска нужных участков кода и просмотра данных с которыми работает приложение;

дизассемблирование машинного кода программы (изучение требует довольно много времени);

декомпиляция кода программы для создания исходного кода программы на языке программирования высокого уровня.

Установка

Рекомендуемым разработчиками способом установки и обновления Radare2 является установка из официального git-репозитория. Предварительно в системе должны присутствовать установленные пакеты git, build-essential и make.

Запуск установки рекомендуется производить не из под пользователя root, иначе скрипт сам произведёт понижение привилегий.

Далее устанавливаем графическую оболочку для Radare2. Мы будет устанавливать официальный GUI под названием Iaito. Установим пакеты, необходимые для установки Iaito:

Для дистрибутивов Linux на базе Debian, есть готовые пакеты, ссылки на которые можно взять тут. Скачаем и установим нужную версию пакета:

Теперь установим плагин r2ghidra, который является интеграцией декомпилятора Ghidra для Radare2. Плагин не требует отдельной установки Ghidra, так как содержит в себе всё необходимое. Для установки плагин доступен в качестве r2pm пакета:

Установленный плагин автоматически интегрируется в GUI Iaito. После установки запускаем графическую оболочку и если все сделали правильно, то видим стартовый экран:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Теперь мы можем заняться нашим примером. Суть программы-примера заключается в следующем: при запуске на экране выводится некий токен, необходимый для того, чтобы зафиксировать выполнение задания и приватный SSH ключ. Но что-то пошло не так и в результате ключ выводится в некорректном виде, а токен не принимается в качестве правильного.

Первый запуск программы-примера

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Открываем файл в Iaito, оставляем настройки анализа по умолчанию:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

После того, как Radare2 проанализирует файл, смотрим результат, открывшийся во вкладке Dashboard:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Программа скомпилирована под 64-битную версию Linux, написана на языке C. Слева мы видим список функций, которые Radare2 смог обнаружить. Среди них импортируемые из библиотеки libc функции printf, puts и putchar, выводящие на экран строку по формату и символ.

Функция main – это главная функция программы. Выполнение начинается с неё. Кликнув два раза по её названию, открывается вкладка Disassembly с результатом её дизассемблирования:

Немного про Ассемблер

Команды ассемблера

Каждая команда Ассемблера — это команда для процессора. Синтаксис команды состоит из нескольких частей:

Или рассмотрим другой пример как выглядит возведение числа в степень в Ассемблере:

Это же действие будет выглядеть на языке высокого уровня, например, Си как:

Вернемся к нашему заданию

Для большего понимания логики выполнения программы можно переключиться на вкладку Graph внизу окна. Там мы увидим блоки команд функции, в которой мы находимся, и переходы между ними, построенные Radare2 на основе команд условных и безусловных переходов.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Масштабирование на этой вкладке выполняется сочетаниями клавиш Ctrl+»-» и Ctrl+»+». Можно было бы начать разбираться в работе программы уже с этого места, но есть возможность посмотреть на программу в ещё более “читаемом” виде. Переключаемся на вкладку Decompiler, внизу окна и видим псевдокод, полученный в результате декомпиляции (восстановление до кода на языке, на котором программа была написана, в нашем случае – язык C) средствами встроенного декомпилятора Radare2.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

В полученном тексте всё ещё много упоминаний регистров и безусловных переходов. Переключимся на декомпилятор Ghidra, который мы ранее установили. Для этого в правом нижнем углу окна в выпадающем списке выберем “pdg” вместо “pdc”.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Теперь код программы стал практически полностью читаем, за исключением имён переменных.

В коде мы видим, что сначала выводится строка “Token:”, после чего происходит вызов некой функции с двумя параметрами, после которого идёт цикл с переменной var_8h, которая проходит значения от 0 до 14 включительно и выводит что-то посимвольно, основываясь на адресе памяти 0x5020 и счётчике с множителем 8. Из этого можно сделать вывод, что в памяти, начиная с адреса 0x5020, расположен массив структур из 15 значений размером 8 байт. Также стоит обратить внимание, что адрес 0x5020 передавался в качестве первого параметра в функцию, вызываемую перед этим циклом. Будем для простоты далее называть его “токен”. Далее по коду выводятся строки начала закрытого ключа и в цикле выводится посимвольно закрытый ключ. Внутри цикла вывода ключа идёт повторяющийся цикл по обнаруженному нами ранее массиву структур, используя переменную var_ch. Перед выводом на экран над каждым символом закрытого ключа производится операция исключающего ИЛИ (XOR) с текущим символом токена. После цикла выводится строка, завершающая закрытый SSH ключ. Исходя из того, что выводимый программой токен не является правильным, можно сделать вывод, что что-то происходит не так в ранее обнаруженной нами функции с двумя параметрами fcn.00001189, вызываемой перед выводом токена на экран. Перейдём на неё, дважды кликнув по названию функции в списке слева.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

В полученном после декомпиляции коде функции мы видим, что она представляет из себя двойной цикл с параметром, в котором после сравнения двух значений элементов структуры происходит их обмен местами, если одно значение меньше другого. Больше всего это похоже на алгоритм сортировки. В частности, на одну из реализаций сортировки “пузырьком”. Основываясь на информации об алгоритме сортировки “пузырёк” и полученном нами коде, можно сделать вывод, что условие выхода из вложенного цикла написано с ошибкой. Проход осуществляется не до конца массива структур.

Получается, нужно это исправить. Переключимся на вкладку дизассемблера:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

В полученном коде мы видим только одну команду вычитания 8:

Переключимся в режим графа, чтобы соотнести ассемблерный код с результатом декомпиляции:

Представление в виде графов

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Проанализировав логику переходов и соотнеся её с ассемблерным кодом подтверждаем, что нас интересует именно эта область функции.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Для этого, находясь на вкладке дизассемблера, поставим курсор на эту команду и переключимся на вкладку Hexdump:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

По относительному адресу команды 0x00001211 убеждаемся, что курсор стоит там, где необходимо. Выделяем 4 байта, начиная с адреса 0x00001211 и справа выберем вкладку “Parsing”. Увидим результат дизассемблирования выделенных байт.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Теперь нужно заменить выделенные байты на 4 байта со значением 90 (шестнадцатиричное значение машинного кода команды nop), но тут мы сталкиваемся с тем, что в Iaito нельзя просто так отредактировать шестнадцатиричное значение по адресу. Список доступных действий мы можем увидеть, нажав на выделенных байтах правую кнопку мыши.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Да, можно воспользоваться сторонним hex-редактором, но это было бы “неспортивно”. Так как мы пробуем выполнить все действия только в рамках функционала Radare2, то будем использовать что есть.

Сначала выберем “Write zeros”. Iaito напомнит нам, что файл открыт в режиме “только для чтения” и предложит переоткрыть его либо в режиме для записи, либо включить режим кэширования. В режиме кэширования все изменения к исходному файлу будут применяться только после выбора пункта меню “File → Commit changes”.

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Выберем режим кэширования, после чего снова попытаемся записать нули. И теперь это у нас получается. На каждом из четырёх байт выберем из контекстного меню пункт “Edit → Increment/Decrement” и добавим значение 144 (десятичную запись шестнадцатиричного числа 90).

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Смотрим на получившийся результат:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

После внесения изменений не забываем нажать “File → Commit Changes”. Запускаем ещё раз программу dechip, чтобы посмотреть результат наших действий:

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Что такое reverse engineering. Смотреть фото Что такое reverse engineering. Смотреть картинку Что такое reverse engineering. Картинка про Что такое reverse engineering. Фото Что такое reverse engineering

Стоит отметить, что часть наших действий основывалась на предположениях. И не всегда они подтверждаются так быстро и успешно. Для гарантированного успеха нужно более глубоко изучать язык Ассемблера той архитектуры процессоров, реверсом программ для которой Вы хотите заниматься, а также наиболее распространённые алгоритмы.

Заключение

В целом, бесплатный аналог IDA Pro в лице Radare2 является довольно неплохим решением. Однако, официальный GUI Radare2 хоть и позволяет удобно перемещаться между инструментами Radare2 и в части отображения информации удобнее консольной версии, но в то же время он ещё недостаточно доработан и не предоставляет всех возможностей, которые можно реализовать через консоль. Со всеми возможностями консольной версии можно ознакомиться в официальной книге по Radare2.

Что касается обратной разработки, то он оказался совсем не страшным и даже при начальном уровне знания языка Ассемблер можно разбираться в устройстве какого-нибудь простенького приложения. А в Корпоративных лабораторияx Pentestit можно попробовать свои силы не только в реверс-инжинеринге бинарных файлов, но и в деассемблировании Android/IOS приложений.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *