C, C++ и DotNet decompile — основы реверса. Решение задач на реверсинг с Root-Me. Часть 1
В данной статье 5 первых заданий с сайта Root-Me, узнаем основы дизассемблирования, решим задачи начального уровня реверса, а также декомпилируем dotNet приложение.
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- 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. Там можете предлагать свои темы и участвовать в голосовании на выбор темы для следующих статей.