C, C++ и DotNet decompile — основы реверса. Решение задач на реверсинг с r0от-мi. Часть 1


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

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

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

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

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

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

C, GCC32
Рассмотрим самый простой случай. Это первое задание на реверс.

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

Отлично. У нас есть приглашение и сообщение о неверном пароле. Просмотрим строки в файле программы, при этом найдем среди них приглашение и сообщение о неверном пароле. Рядом должен быть пароль.

Таким образом, из расположенных рядом строк, есть одна, похожая на пароль. Попробуем ее.

Задание выполнено. Сдаем пароль, получаем 5 очков.

ELFx86, Basic
Нас просят найти пароль.

Загрузим программу в отладчик IDA Pro (я пользуюсь версией 7.0) и нажмем F5, чтобы декомпилировать программу.

Таким образом введенное имя сравнивается со строкой john, а пароль — с the ripper.

Таким образом мы верно решили задание и получаем свой пароль. Сдаем его и зарабатываем еще 5 очков.

PEx86, 0 protection
На сей раз нам дают exe-шник.

Загружаем его в IDA Pro.

В программе не сохранена отладочная информация, поэтому мы не видим привычных нам названий функций типа main. Давайте просмотрим строки в программе, для этого нажмем +F12.

Видим сообщения о вводе правильного и неправильного паролей. Теперь мы можем найти блок с этой строкой в коде и посмотреть какое условие ему предшествует. Кликнем на строку два раза.

Мы находимся в секции rdata. Давайте найдем все ссылки в коде на этот адрес. Для этого нажмем X.

Таким образом в коде программы есть всего одно обращение к нашей строке. Кликаем два раза и переходим в код.

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

Здесь происходит проверка какого-то числа a2 и строки a1. Давайте переведем числовое в символьное.

Для этого необходимо на числе нажать R. И наш код преобразился.

Строку мы теперь знаем, осталось выяснить что за число a2. Посмотрим все ссылки на данную функцию.

Она вызывается всего один раз.

Как можно увидеть в качестве второго параметра передается длина строки. Проверим найденный пароль.

Сдаем и получаем 5 очков.

ELF-C++, 0 protection
Нам предлагают решить программу на C++.

Открываем в IDA Pro и переходим к месту вызова сообщения о правильном пароле. Давайте окрасим его в зеленый цвет.

Сделаем граф поменьше.

Таким образом нам нужно пройти два условия. Разберем их. В первом условии количество аргументов сравнивается с 1. То есть в программу должно быть больше одного аргумента (первый — это название программы).

Разберем второе условие.

Введенная нами строка сравнивается со строкой, которая передается в качестве параметра в функцию plouf. Декомпилируем ее.

Разбираем код. На самом деле a2 — является строкой. Таким образом, цикл выполняется от i=0, до момента пока i-й элемент строки а2 не будет равен 0 (то есть пока не достигнет конца строки).

V3 = a2[i]
V5 = length(a3)
V6 = a3[i%v5]

То есть строка по адресу a1 будет равна двум проксоренным строкам a2 и a3. Вернемся в главную функцию и найдем эти строки.

Так нам нужно определить параметры var_C и var_10. Их найдем чуть выше. Это строки unk_8048ВС4 и unk_8048DCC соответственно.

Найдем значение строк.

Что же, напишем код, чтобы их проксорить.

Получаем пароль.

PE-DotNet, 0 protection
В этом задании нам предлагают реверсить .NET приложение.

Определить его можно с помощью утилиты file.

C# является декомпилируемым языком, таким образом мы можем получить исходный проект. Сделать это можно с помощью dnSpy.

Давайте откроем проект CrackMe и найдем функции и методы.

Метод Button1_Click проверяет пароль по нажатие кнопки.

В исходном коде найдем пароль. Проверем его.

Сдаем его.

На этом пока все. Продолжение следует… Вы можете присоединиться к нам в Telegram. Там можете предлагать свои темы и участвовать в голосовании на выбор темы для следующих статей.

Оставить комментарий