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

NewsBot
Оффлайн

NewsBot

.
.
Регистрация
21.07.20
Сообщения
40.408
Реакции
1
Репутация
0
m1pbccvddfkceg8p7pjztg2-uds.jpeg


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

Часть 1:
Часть 2:

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

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

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

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

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


Fake Instructions


bryus56z26_bxirnpsov7t8msqa.png


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

lhdwxfnkhslg3vuts2l7ri0w3ic.png


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

hl6yptbl116oaug621jf6vavowe.png


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

vofw46aw2vjqkth1grewblrd9pe.png


В самом начале происходит инициализация канарейки и проверка количества аргументов. После чего выделяется 0x1f байт, куда копируется указанная константная строка, адрес сохраняется в переменную 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] ^ 0x72

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

y8iyop-u47rncrhqwesdj3jb9xy.png


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

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