Pull to refresh

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

Reading time3 min
Views23K
image

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

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

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

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

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

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

C, GCC32


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

image

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

image

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

image

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

image

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

image

ELFx86, Basic


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

image

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

image

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

image

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

image

PEx86, 0 protection


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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

ELF-C++, 0 protection


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

image

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

image

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

image

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

image

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

image

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

image

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

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

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

image

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

image

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

image

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

image

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

image

PE-DotNet, 0 protection


В этом задании нам предлагают реверсить .NET приложение.

image

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

image

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

image

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

image

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

image

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

image

Сдаем его.

image

На этом пока все. Продолжение следует… Вы можете присоединиться к нам в Telegram. Там можете предлагать свои темы и участвовать в голосовании на выбор темы для следующих статей.
Tags:
Hubs:
Total votes 11: ↑10 and ↓1+9
Comments6

Articles