Linux инструменты для реверс инжиниринга

Раздербанить odex файл

Имеется apk + odex. Скачал baksmali, запускаю:

Есть какие-нибудь ещё варианты?

Мне надо отреверсить всё это и внести определённые изменения.

binwalk на стероидах?

Есть один большой жирный файл, его надо отреверсить на отдельные файлы (по крайней мере оно не похоже на архив).

Существует ли что-нибудь типа binwalk, но умеющее определять известные форматы (e.g. PNG) без заголовков?

Декомпиляция Linux-программ

Возможно ли декомпилировать/дизассемблировать Linux-программы?

Методика поиска аналогичного кода в бинарном файле нового релиза.

Здравствуйте. Попала в руки такая задача. Есть две dll. Как мне объяснили второй файл (new.dll) это новый релиз первого файла (old.dll). Оба файла собраны под x64. Мне нужно найти во что реинкорнировали несколько функций из old.dll в new.dll. Ниже пример одной из функций. Прошу высказать мысли о моем подходе к поиску новой версии кода: Начал я с того, что при помощи rdare2 нашел все функции в old.dll (более 40 тыс), создал файл с сигнатурами и натравил на новый файл. В итоге ничего не нашлось. Делаю вывод, что изменения более чем косметические. Далее я решил искать следующим образом:

  1. Делаю поиск по кускам кода функции. Беру пролог перед вызовом функции и ищу эту последовательность байт в new.dll.
  2. Пытаюсь найти константы, строки и прочие магические цифры, которые фигурируют в функции и ищу их в new.dll.
  3. Анализирую все функции, которые вызывают нужную функцию и пытаюсь найти аналогичный набор вызывающих функций в new.dll.
  4. Определить последовательность вызывающих функций до самой первой (верхней) и найти аналогичную череду вызовов в новом файле.
  5. Анализирую все функции, которые вызываются из нужной функции и пытаюсь найти аналогичный набор вызываемых функций в new.dll
  6. Тут признаюсь, что все выше перечисленное мне не помогло. Далее думаю, что т.к. встречаются такие вызовы call qword ptr [rax+18h] (их штук 8 в анализируемой функции), то вероятно это вызовы методов объекта(-ов). Вероятно можно найти vftable и понять к какому классу эти методы относятся и уже составить набор класс.метод, которые вызываются в моей функции. Далее искать в new.dll где вызывается такая череда методов из соответствующих классов.
  7. Наверное можно попытаться найти где создавался объект и откуда этот this пришел в мою функцию. Далее искать аналогичный след в new.dll. Не уверен, что этот метод можно применить без отладки этой dll. Запускать dll не понятно как т.к. экспортируемых функций всего пять: Osf::OSFCreateOfficeExtensionsDialogUser Osf::OSFCreateOsfOartGallery DllGetLCID PPMain DllEntryPoint

Что из перечисленных подходов поиска утопия, а что нет? Может есть еще проверенные варианты?

Пример одной из функций:

IDA PRO c++ боль

Как вообще разобраться в таком коде?

Прошивка IPTV-приставки.

Имеется приставка IPTV. Точно известно, что в ней есть микрофон для товарища ё-маёра.

Вопрос, как её негромко хакнуть, чтобы усложнить товарищам жизнь и затруднить мониторинг кухонных разговоров?

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

Хотя бы с чего начать?

Network Traffic Reverser (удалённая вакансия от $3000 до $5000)

Network traffic reverser

Друзья, здравствуйте! В компанию GameShells, занимающуюся разработкой мобильных приложений и онлайн-игр с использованием искусственного интеллекта (AI) требуется Network Traffic Reverser.

Требования: Опыт работы в области расшифровки и чтения сетевого трафика приложений на Windows и/или Android Опыт в MiTM Опыт работы с технологиями: сокеты, Wireshark, WinSock, SocketSniff, Proxocket, сниффинг, SSL шифрование, сертификаты Опыт в разработке приложений под Android: Lua, Cocos, ProtoBuf Java SE, C#

Будет плюсом: Опыт в реверс инжиниринге Android приложений: хуки, xPosed

Спектр задач Прочитать трафик приложения на Windows и/или Android, т.е. получить возможность получать в реальном времени информацию, которой обменивается приложение с удаленными серверами

Условия Удаленная работа full-time Зарплата $3000-$5000 по результатам собеседования Интересные задачи, комфортный коллектив

Куда обращаться По всем вопросам пишите на почту igwtforever7@gmail.com или в Telegram @leonety_lety

Разработчик iOS

  • Разработчика iOS
  • Разработчика Android
  • Удаленная работа на постоянную основу,
  • ЗП 3000-5000 долларов в месяц по результатам собеседования

Ищем разработчика(удаленно): эмуляция действий юзера

Необходимо разработать ad spy сервис(привет: http://www.adheart.ru) для Facebook + простановка отзывов и инсталлы на Android девайсах.

Читайте также:  Добавить radmin исключения windows

Ядро системы должно поддерживать эмуляцию действий пользователя:

  • переход по facebook ссылкам
  • установку приложений
  • парсинг креативов и ссылок
  • установка произвольного пакета из Google Play
  • написание отзыва по этому пакету в Google Play

Вакансия: Реверс-инженер ЗП от 120 тыс в месяц (работа в офисе)

Команда специалистов по информационной безопасности ищет опытных реверс-инженеров.

Чем придется заниматься:

  • Обнаружение и анализ уязвимостей IoT устройств;
  • Выполнение анализа безопасности продуктов и решений заказчиков;
  • Опыт реверс-инженеринга;
  • Знание и понимание архитектур ARM/MIPS/x86;
  • Знание принципов работы ОС Linux;
  • Знание Assembler, C/C++, Python;
  • Владение инструментами дизассемблирования и отладки (IDA Pro, WinDBG, etc.)
  • Опыт в поиске уязвимостей;
  • Понимание технологии фаззинга;
  • Опыт написания эксплойтов;

Как плюс – умение пользоваться паяльником, программаторами, логическими анализаторами;

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

ЗП от 120 тыс рублей в месяц + хорошие бонусы

Место работы: Санкт-Петербург

По всем вопросам пишите в телеграм @plutoo2647

Кому интересно пореверсить малварь для Линукса?

Источник

Linux инструменты для реверс инжиниринга

В этой статье мы рассмотрим несколько инструментов для реверс-инжиниринга на Kali Linux.

OllyDbg

OllyDbg — это 32-разрядный анализатор на уровне ассемблера для приложений Microsoft Windows. Акцент на анализе двоичного кода делает его особенно полезным в тех случаях, когда исходный код недоступен. Как правило, он используется для взлома коммерческих программ.

Чтобы открыть пройдите в меню Applications → Reverse Engineering → ollydbg

Для загрузки EXE файла, нажмите на кнопку с желтой папкой в левом верхнем угле (кнопка выделена на следующем скриншоте)

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

dex2jar

Это приложение помогает конвертировать файл APK (android) в файл JAR для просмотра исходного кода. Чтобы использовать его, откройте терминал и напишите

Где myfile — это файл, который нужно взломать.

Ниже на скриншотах мы создали из файла classes.dex файл JAR

jd-gui

JD-GUI — автономная графическая утилита, которая отображает исходные коды Java файлов .class

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

Запустит утилиту можно из терминала

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

apktool

Apktool — это один из лучших инструментов для изменения приложения Android. Он может декодировать ресурсы почти в исходную форму и восстанавливать их после внесения изменений.

Для запуска выполните команду в терминале

Чтобы декомпилировать apk файл, выполните команду

# apktool d myfile.apk

Процесс декомпиляции виден на скриншоте ниже

Источник

Reverse engineering: обратная разработка приложений для самых маленьких

Обратная разработка (англ. Reverse Engineering) — метод исследования устройств или программного обеспечения с целью понять принцип его работы или обнаружить недокументированные возможности. В информационной безопасности она занимает значительную роль, благодаря ей специалисты в области ИБ могут исследовать вредоносные приложения, разбираться как они работают для последующего, например, составления сигнатур в базы антивирусов и защиты других пользователей от предстоящей цифровой угрозы.

Выделяют 4 методики проведения обратной разработки:

анализ обмена данными приложения, с помощью различных анализаторов трафика;

использование режима отладки для поиска нужных участков кода и просмотра данных с которыми работает приложение;

дизассемблирование машинного кода программы (изучение требует довольно много времени);

декомпиляция кода программы для создания исходного кода программы на языке программирования высокого уровня.

Тема дизассмеблирования машинного кода, в целом неразрывно связана с обратной разработкой, но у неспециалиста может попросту отбить какое-либо желание связываться с ним. Связано это с необходимым уровнем подготовки и временем, которое затрачивается на «разборку». Тем не менее, каждый случай может оказаться довольно увлекательным «путешествием» в недра приложения. Поэтому сегодня попробуем наглядно разобрать одно из приложений, чтобы показать, что дизассемблирование — это совсем не страшно и при должном старании и терпении можно прокачать новый скилл.

В качестве подопытного возьмем задание, которое использовалось в бесплатной лаборатории Test lab, где зарегистрировано свыше 30 тысяч участников. Но для большей наглядности программа была скомпилирована без отладочной информации и без использования оптимизаций (gcc -O0). После чего к ней была применена утилита strip с параметром -s, который удаляет всю лишнюю символьную информацию из исполняемого файла, вроде имён переменных и функций.

Рабочим инструментом выступит Radare2 — кроссплатформенный набор утилит для обратной разработки и отладки. Включает в себя инструменты для анализа, дизассемблирования, декомпилирования и патчинга. В отличие от популярного IDA Pro распространяется бесплатно.

Установка

Рекомендуемым разработчиками способом установки и обновления Radare2 является установка из официального git-репозитория. Предварительно в системе должны присутствовать установленные пакеты git, build-essential и make.

Запуск установки рекомендуется производить не из под пользователя root, иначе скрипт сам произведёт понижение привилегий.

Далее устанавливаем графическую оболочку для Radare2. Мы будет устанавливать официальный GUI под названием Iaito. Установим пакеты, необходимые для установки Iaito:

Читайте также:  Bootstrap linux что это

Для дистрибутивов Linux на базе Debian, есть готовые пакеты, ссылки на которые можно взять тут. Скачаем и установим нужную версию пакета:

Теперь установим плагин r2ghidra, который является интеграцией декомпилятора Ghidra для Radare2. Плагин не требует отдельной установки Ghidra, так как содержит в себе всё необходимое. Для установки плагин доступен в качестве r2pm пакета:

Установленный плагин автоматически интегрируется в GUI Iaito. После установки запускаем графическую оболочку и если все сделали правильно, то видим стартовый экран:

Теперь мы можем заняться нашим примером. Суть программы-примера заключается в следующем: при запуске на экране выводится некий токен, необходимый для того, чтобы зафиксировать выполнение задания и приватный SSH ключ. Но что-то пошло не так и в результате ключ выводится в некорректном виде, а токен не принимается в качестве правильного.

Первый запуск программы-примера

Открываем файл в Iaito, оставляем настройки анализа по умолчанию:

После того, как Radare2 проанализирует файл, смотрим результат, открывшийся во вкладке Dashboard:

Программа скомпилирована под 64-битную версию Linux, написана на языке C. Слева мы видим список функций, которые Radare2 смог обнаружить. Среди них импортируемые из библиотеки libc функции printf, puts и putchar, выводящие на экран строку по формату и символ.

Функция main – это главная функция программы. Выполнение начинается с неё. Кликнув два раза по её названию, открывается вкладка Disassembly с результатом её дизассемблирования:

Немного про Ассемблер

Ассемблер — машинно-ориентированный язык программирования низкого уровня. Представляет собой систему обозначений, используемую для представления в удобно читаемой форме программ, записанных в машинном коде. Назван по одноименной утилите, которая транслирует программу в машинный код процессора.

Команды ассемблера

Каждая команда Ассемблера — это команда для процессора. Синтаксис команды состоит из нескольких частей:

Команда — означает какую операцию необходимо выполнить. Например:

mov — команда пересылки данных. Копирует содержимое одного операнда в другой;

lea — вычисляет эффективный адрес операнда-источника и сохраняет его в регистре;

cmp — сравнение двух операндов;

условные и безусловные переходы (jmp, jne, je, jle, …) — безусловные и условные (требуется выполнение условия) переходы к меткам. Например, jump @exit выполняет безусловный переход к метке exit;

nop — однобайтовая команда, которая ничего не выполняет, а только занимает место и время. В основном используется для создание задержки в программе или как заполнитель удаленных инструкций. Например, команду проверки лицензионного ключа во взломанных программах заменяют на «ничего не делать»;

Операнды — то, над чем будут выполняться команды. Операндами могут быть названия регистров, ячейки памяти или служебные части команд.

Комментарий — понятно из названия, что это комментарий для удобства чтения кода. Пишется после точки с запятой.

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

mov — команда (перемещение значения из одного операнда в другой);

ax, 0 — операнды (регистр и значение);

; — комментарий

Или рассмотрим другой пример как выглядит возведение числа в степень в Ассемблере:

Это же действие будет выглядеть на языке высокого уровня, например, Си как:

Вернемся к нашему заданию

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

Масштабирование на этой вкладке выполняется сочетаниями клавиш Ctrl+»-» и Ctrl+»+». Можно было бы начать разбираться в работе программы уже с этого места, но есть возможность посмотреть на программу в ещё более “читаемом” виде. Переключаемся на вкладку Decompiler, внизу окна и видим псевдокод, полученный в результате декомпиляции (восстановление до кода на языке, на котором программа была написана, в нашем случае – язык C) средствами встроенного декомпилятора Radare2.

В полученном тексте всё ещё много упоминаний регистров и безусловных переходов. Переключимся на декомпилятор Ghidra, который мы ранее установили. Для этого в правом нижнем углу окна в выпадающем списке выберем “pdg” вместо “pdc”.

Теперь код программы стал практически полностью читаем, за исключением имён переменных.

В коде мы видим, что сначала выводится строка “Token:”, после чего происходит вызов некой функции с двумя параметрами, после которого идёт цикл с переменной var_8h, которая проходит значения от 0 до 14 включительно и выводит что-то посимвольно, основываясь на адресе памяти 0x5020 и счётчике с множителем 8. Из этого можно сделать вывод, что в памяти, начиная с адреса 0x5020, расположен массив структур из 15 значений размером 8 байт. Также стоит обратить внимание, что адрес 0x5020 передавался в качестве первого параметра в функцию, вызываемую перед этим циклом. Будем для простоты далее называть его “токен”. Далее по коду выводятся строки начала закрытого ключа и в цикле выводится посимвольно закрытый ключ. Внутри цикла вывода ключа идёт повторяющийся цикл по обнаруженному нами ранее массиву структур, используя переменную var_ch. Перед выводом на экран над каждым символом закрытого ключа производится операция исключающего ИЛИ (XOR) с текущим символом токена. После цикла выводится строка, завершающая закрытый SSH ключ. Исходя из того, что выводимый программой токен не является правильным, можно сделать вывод, что что-то происходит не так в ранее обнаруженной нами функции с двумя параметрами fcn.00001189, вызываемой перед выводом токена на экран. Перейдём на неё, дважды кликнув по названию функции в списке слева.

Читайте также:  Apple software update для windows 10 64 bit

В полученном после декомпиляции коде функции мы видим, что она представляет из себя двойной цикл с параметром, в котором после сравнения двух значений элементов структуры происходит их обмен местами, если одно значение меньше другого. Больше всего это похоже на алгоритм сортировки. В частности, на одну из реализаций сортировки “пузырьком”. Основываясь на информации об алгоритме сортировки “пузырёк” и полученном нами коде, можно сделать вывод, что условие выхода из вложенного цикла написано с ошибкой. Проход осуществляется не до конца массива структур.

Получается, нужно это исправить. Переключимся на вкладку дизассемблера:

В полученном коде мы видим только одну команду вычитания 8:

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

Представление в виде графов

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

Теперь нам нужно убрать команду sub rax, 8. Наиболее просто это можно сделать переписав поверх нее команду nop (No Operation) — то есть, заменив команду вычитания командой «ничего не делать».

Для этого, находясь на вкладке дизассемблера, поставим курсор на эту команду и переключимся на вкладку Hexdump:

По относительному адресу команды 0x00001211 убеждаемся, что курсор стоит там, где необходимо. Выделяем 4 байта, начиная с адреса 0x00001211 и справа выберем вкладку “Parsing”. Увидим результат дизассемблирования выделенных байт.

Теперь нужно заменить выделенные байты на 4 байта со значением 90 (шестнадцатиричное значение машинного кода команды nop), но тут мы сталкиваемся с тем, что в Iaito нельзя просто так отредактировать шестнадцатиричное значение по адресу. Список доступных действий мы можем увидеть, нажав на выделенных байтах правую кнопку мыши.

Да, можно воспользоваться сторонним hex-редактором, но это было бы “неспортивно”. Так как мы пробуем выполнить все действия только в рамках функционала Radare2, то будем использовать что есть.

Сначала выберем “Write zeros”. Iaito напомнит нам, что файл открыт в режиме “только для чтения” и предложит переоткрыть его либо в режиме для записи, либо включить режим кэширования. В режиме кэширования все изменения к исходному файлу будут применяться только после выбора пункта меню “File → Commit changes”.

Выберем режим кэширования, после чего снова попытаемся записать нули. И теперь это у нас получается. На каждом из четырёх байт выберем из контекстного меню пункт “Edit → Increment/Decrement” и добавим значение 144 (десятичную запись шестнадцатиричного числа 90).

Смотрим на получившийся результат:

После внесения изменений не забываем нажать “File → Commit Changes”. Запускаем ещё раз программу dechip, чтобы посмотреть результат наших действий:

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

Заключение

В целом, бесплатный аналог IDA Pro в лице Radare2 является довольно неплохим решением. Однако, официальный GUI Radare2 хоть и позволяет удобно перемещаться между инструментами Radare2 и в части отображения информации удобнее консольной версии, но в то же время он ещё недостаточно доработан и не предоставляет всех возможностей, которые можно реализовать через консоль. Со всеми возможностями консольной версии можно ознакомиться в официальной книге по Radare2.

Что касается обратной разработки, то он оказался совсем не страшным и даже при начальном уровне знания языка Ассемблер можно разбираться в устройстве какого-нибудь простенького приложения. А в Корпоративных лабораторияx Pentestit можно попробовать свои силы не только в реверс-инжинеринге бинарных файлов, но и в деассемблировании Android/IOS приложений.

Источник

Оцените статью