![image](https://habrastorage.org/webt/m1/pb/cc/m1pbccvddfkceg8p7pjztg2-uds.jpeg)
В данной статье разберемся с декомпиляцией ELF файлов в Cutter на примере легеньких задач. Прошлые части введения в реверс:
Часть 1: C, C++ и DotNet decompile — основы реверса
Часть 2: Реверсим MIPS и Golang — основы реверса
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Fake Instructions
![](https://habrastorage.org/webt/br/yu/s5/bryus56z26_bxirnpsov7t8msqa.png)
Это восьмое задание данной категории, и нам сообщают о наличии фейковых инструкций. Начнем с просмотра информации о файле.
![](https://habrastorage.org/webt/lh/dw/xf/lhdwxfnkhslg3vuts2l7ri0w3ic.png)
Я открываю программу в Cutter — GUI для radare2 со встроенным декомпилятором ghidra, имеющим возможность эмуляции, а с недавних пор и отладки. И сразу получаем интересный список функций.
![](https://habrastorage.org/webt/hl/6y/pt/hl6yptbl116oaug621jf6vavowe.png)
Перейдем к функции main и декомпилируем ее.
![](https://habrastorage.org/webt/vo/fw/46/vofw46aw2vjqkth1grewblrd9pe.png)
В самом начале происходит инициализация канарейки и проверка количества аргументов. После чего выделяется 0x1f байт, куда копируется указанная константная строка, адрес сохраняется в переменную iVar3, впоследствии отдельный байты этой строки подвергаются изменению. Далее происходят преобразования со строкой s1, которая для нас не представляет интереса. Также происходит инициализация функции WPA, а веденный нами пароль записывается по адресу auStack50 и передается вместе с преобразованной строкой iVar3 в функцию WPA, после выполнения которой происходит проверка значения канарейки и завершение программы.
Давайте перейдем к функции WPA.
![](https://habrastorage.org/webt/cr/j9/4i/crj94ifssdtzy3tyaqdhhdzzx98.png)
Заложенная заранее в программе строка снова подвергается изменению, после чего происходит сравнение двух строк. Если они равны, будет вызвана функция blowfish(), которая выведет нас верный пароль для сдачи, иначе будет вызвана функция RS4().
![](https://habrastorage.org/webt/ns/uv/up/nsuvupigmzfjwe0xwgrgomhxq_4.png)
Так как происходит расшифрование заранее внесенных значений, мы можем отладить программу и изменить результат сравнения. Давайте перейдем к месту сравнения строк и поставим точку останова.
![](https://habrastorage.org/webt/2b/ec/cz/2becczi-fufpb29x4drpclzh6ke.png)
Теперь запустим отладку — F9, и введем аргументы программы.
![](https://habrastorage.org/webt/3l/g5/c4/3lg5c4ptz0zsya5aobobarbn5ou.png)
Нажимаем на кнопку далее на навигационной панели, пока не дойдем то своей точки останова. Результат сравнения строк с помощью функции strcmp() будет записан в регистр EAX, который потом и будет проверяться. Так как строки не равны, данный регистр содержит значение 1.
![](https://habrastorage.org/webt/zs/vs/fo/zsvsfodvl9bt4vgxlaw-t3vwte0.png)
Давайте изменим его на 0, чтобы изменить ветку поведения программы и продолжим ее выполнение. После завершения в консоли Cutter мы увидим верный ответ, который следует сдавать на сайте.
![](https://habrastorage.org/webt/zk/ai/yd/zkaiydy-fwu1fm4oxnav7lilszi.png)
Ptrace
![](https://habrastorage.org/webt/e1/xk/o5/e1xko5uhjvzq_fq7w5o-6fnkcyy.png)
Скачиваем программу и проверяем ее.
![](https://habrastorage.org/webt/su/lx/15/sulx15w8tqjj0vzx_jzc0ysntnu.png)
Ничего необычного, нужно найти пароль. Но вот есть маленкая защита от отладки (ptrace) и переходы, которые нужно править вручную. Так показывает граф в IDA Pro.
![](https://habrastorage.org/webt/2_/ip/qj/2_ipqjvbkkroufigslvp61c_fg0.png)
Делать это задание будем также в Cutter, он автоматически поправит все переходы.
![](https://habrastorage.org/webt/xe/ta/br/xetabrzyt_3dra182hmykji4ip0.png)
Перейдем к декомпиляции функции main.
![](https://habrastorage.org/webt/cj/by/zh/cjbyzhvi8eibkxreeepn800wzjg.png)
И верный пароль — это соответствующие 4 буквы из строки, заданной в самом начале.
![](https://habrastorage.org/webt/ko/rf/5z/korf5zx3yytnj7vhkf8otyzar6e.png)
ARM ELF
![](https://habrastorage.org/webt/y3/g7/ia/y3g7ia80wgf_ez-bce0vgwbd2by.png)
Это бинарь для архитектуры ARM, закидываем его в Cutter и выбираем функцию main. По графу функции видим, с чем имеем дело, и скорее всего это посимвольное сравнение.
![](https://habrastorage.org/webt/ke/9q/p5/ke9qp5tich8fwmbryq_tidz2jts.png)
Открываем декомпилятор и анализируем программу.
![](https://habrastorage.org/webt/bg/rk/ue/bgrkueh0csxatmvrxh6awifvqbo.png)
Первым делом проверяется наличие аргумента программы и его длина, она должна быть равна 6.
![](https://habrastorage.org/webt/fm/1n/2r/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
Давайте реализуем алгоритм и получим пароль.
![](https://habrastorage.org/webt/y8/iy/op/y8iyop-u47rncrhqwesdj3jb9xy.png)
И получаем нужный пароль. На этом пока все.
Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.