Работаем с Cutter — основы реверса. Решение задач на реверсинг с r0от-мi. Часть 3

image


В данной статье разберемся с декомпиляцией ELF файлов в Cutter на примере легеньких задач. Прошлые части введения в реверс:

Часть 1: C, C++ и DotNet decompile — основы реверса
Часть 2: Реверсим MIPS и Golang — основы реверса

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

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

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


Fake Instructions


bryus56z26_bxirnpsov7t8msqa.png

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

lhdwxfnkhslg3vuts2l7ri0w3ic.png

Я открываю программу в Cutter — GUI для radare2 со встроенным декомпилятором ghidra, имеющим возможность эмуляции, а с недавних пор и отладки. И сразу получаем интересный список функций.

hl6yptbl116oaug621jf6vavowe.png

Перейдем к функции main и декомпилируем ее.

vofw46aw2vjqkth1grewblrd9pe.png

В самом начале происходит инициализация канарейки и проверка количества аргументов. После чего выделяется 0×1f байт, куда копируется указанная константная строка, адрес сохраняется в переменную iVar3, впоследствии отдельный байты этой строки подвергаются изменению. Далее происходят преобразования со строкой s1, которая для нас не представляет интереса. Также происходит инициализация функции WPA, а веденный нами пароль записывается по адресу auStack50 и передается вместе с преобразованной строкой iVar3 в функцию WPA, после выполнения которой происходит проверка значения канарейки и завершение программы.

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

crj94ifssdtzy3tyaqdhhdzzx98.png

Заложенная заранее в программе строка снова подвергается изменению, после чего происходит сравнение двух строк. Если они равны, будет вызвана функция blowfish (), которая выведет нас верный пароль для сдачи, иначе будет вызвана функция RS4().

nsuvupigmzfjwe0xwgrgomhxq_4.png

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

2becczi-fufpb29x4drpclzh6ke.png

Теперь запустим отладку — F9, и введем аргументы программы.

3lg5c4ptz0zsya5aobobarbn5ou.png

Нажимаем на кнопку далее на навигационной панели, пока не дойдем то своей точки останова. Результат сравнения строк с помощью функции strcmp () будет записан в регистр EAX, который потом и будет проверяться. Так как строки не равны, данный регистр содержит значение 1.

zsvsfodvl9bt4vgxlaw-t3vwte0.png

Давайте изменим его на 0, чтобы изменить ветку поведения программы и продолжим ее выполнение. После завершения в консоли Cutter мы увидим верный ответ, который следует сдавать на сайте.

zkaiydy-fwu1fm4oxnav7lilszi.png

Ptrace


e1xko5uhjvzq_fq7w5o-6fnkcyy.png

Скачиваем программу и проверяем ее.

sulx15w8tqjj0vzx_jzc0ysntnu.png

Ничего необычного, нужно найти пароль. Но вот есть маленкая защита от отладки (ptrace) и переходы, которые нужно править вручную. Так показывает граф в IDA Pro.

2_ipqjvbkkroufigslvp61c_fg0.png

Делать это задание будем также в Cutter, он автоматически поправит все переходы.

xetabrzyt_3dra182hmykji4ip0.png

Перейдем к декомпиляции функции main.

cjbyzhvi8eibkxreeepn800wzjg.png

И верный пароль — это соответствующие 4 буквы из строки, заданной в самом начале.

korf5zx3yytnj7vhkf8otyzar6e.png

ARM ELF


y3g7ia80wgf_ez-bce0vgwbd2by.png

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

ke9qp5tich8fwmbryq_tidz2jts.png

Открываем декомпилятор и анализируем программу.

bgrkueh0csxatmvrxh6awifvqbo.png

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

fm1n2rczdq5z2qoasowzeio7cww.png

Так переменная var_14h выступает как индекс и принимает значение 0. А далее происходят ряд сравнений, которые мы расценим как условия:

str[0] == str[5]
str[0] + 1 == str[1]
str[3] + 1 == str[0]
str[2] + 4 == str [5]
str[4] + 2 == str[2]
0 == str[3] ^ 0×72

Давайте реализуем алгоритм и получим пароль.

y8iyop-u47rncrhqwesdj3jb9xy.png

И получаем нужный пароль. На этом пока все.

Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.

© Habrahabr.ru