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

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

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

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

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

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

C, GCC32


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



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



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



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



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



ELF x86 — Basic


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



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



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



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



PE x86 — 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. Там можете предлагать свои темы и участвовать в голосовании на выбор темы для следующих статей.