Введение в реверсинг с нуля, используя IDA PRO. Часть 22.

Дата публикации 12 ноя 2017 | Редактировалось 22 ноя 2017
РАЗЛИЧАЯ

DIFFER (В дальнейшем — Дифер, прим. Яши) - это программа, которая из двух последовательных версий одного и того же файла, пытается найти различия в функциях, несмотря на изменения и пытается показать нам какие функции были изменены и где.

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

Поскольку мы будем работать с разными ДИФЕРАМИ, мы должны знать, что чем больше и больше было изменений в исполняемом файле, то и работа получается более неприятной, так как ДИФЕР совершает некоторые ошибки при сравнении.

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

Первый ДИФЕР, который мы будем устанавливать, называется BINDIFF.
(Совершенно недавно он стал бесплатным — прим. Яши)

https://www.zynamics.com/software.html

1.png


Отсюда его можно загрузить, просто соглашаясь с условиями использования.

2.png

Хорошо, также загружаем JAVA, если у нас её нет на нашей машине.

3.png

4.png

Кажется эта та версия, которая нам нужна. Мы загружаем её и устанавливаем.

5.png

Затем я повторяю установку BINDIFF и видно, что проблемы больше нет. Инсталлятор ни на что не жалуется.

У меня всё ещё остались предыдущие исполняемые файлы с упражнениями - уязвимый и неуязвимый. Я открываю как новый неуязвимый или пропатченный файл в ЗАГРУЗЧИКЕ IDA, для того, чтобы она создала IDB файл, если я не сделал этого раньше.

6.png

Затем, я открываю уязвимую версию файла.

7.png

Теперь, я иду в меню EDITPLUGINS.

8.png

и выбираю пункт BINDIFF 4.2 (CTRL + 6).

9.png

И нажимаю кнопку DIFF DATABASE и ищу пропатченную версию файла для сравнения с непропатченной.

10.png

11.png


Как только сравнение будет завершено, IDA покажет мне результаты. Иногда результат неудобно смотреть в столбце, поэтому я могу перетащить и опустить его на панель вкладок.

12.png

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

13.png

Мы видим, что в таблице есть только одна строка со сходством, меньшим чем 1.

14.png

15.png


Зеленые блоки говорят о том, что код внутри них схожий. Желтые имеют незначительные изменения. А красные или серые блоки означают, что они новые.

16.png

Здесь мы видим изменение. Как мы знаем, если изменить переход JLE на JBE то это поможет избежать ПЕРЕПОЛНЕНИЕ БУФЕРА. Поэтому, если в программе которая у нас есть в двух версиях - уязвимая и пропатченная и смотря на измененные функции мы находим это. Мы будем знать, что нам придется реверсить эту функцию статически, чтобы увидеть действительно ли она уязвима для программы.

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

17.png

Она очень полезная, и Вы можете найти адреса и любой текст, который находится на графике.

18.png

Мы можем скопировать адрес блока для того, чтобы вставить его в IDA и перейти по этому адресу.

У нас также есть графический обозреватель для навигации по функциям и списку блоков.

19.png

Мы можем пометить блок. В меню у нас есть пункты SELECT ANCESTOR или SELECT SUCCESORS для того, чтобы затемнять наши блоки [del camino] внутри функции. Это поможет вернуться оттуда в начало блока. В этом случае это простая функция. Но в больших и сложных функциях находить путь к блоку - очень важно. (На картинки я не вижу этих пунктов, поэтому я мог тут неправильно перевести. Если что, поправьте меня — прим. Яши.)

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

TURBODIFF

Это ДИФЕР, созданный моим коллегой Николасом Экономэ из CORE SECURITY. Он будет приложен к данному туториалу. Плагин также может быть загружен с сайта CORE SECURITY, но там находится более ранняя версия, чем та, которую я приложил.

Файл PLW просто копируется в папку PLUGINS где установлена IDA.

20.png

21.png

Мне придется перезапустить IDA, чтобы плагин заработал.

Как всегда, я загружаю сначала НЕУЗЯВИМУЮ версию файла.

22.png

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

23.png

Поэтому я делаю эту операцию с первым файлом.

24.png

Затем я открываю уязвимый файл и делаю то же самое.

25.png

Теперь из уязвимой версии файла я снова вызываю наш плагин.

26.png

27.png

Я ищу неуязвимую версию файла и соглашаюсь с опциями, которые плагин предлагает мне по умолчанию.

28.png

Здесь я могу нажать CTRL + F для того, чтобы начать искать изменения или подозрительные вещи, чтобы увидеть изменения, которые произошли в коде.

29.png

Вот одно из них. Делаем двойной щелчок по этой строке.

30.png

Здесь Вы увидите изменение. Также существует цветовой код в соответствии с типом изменения. Зеленый цвет для блоков с минимальными изменениями, желтый для блоков с очень большими изменениями и красный для новых блоков.

Очевидно графики - это просто картинки и они не интерактивные, но это очень быстрый ДИФЕР. Он действительно самый быстрый. Это очень заметно в больших исполняемых файлах и он не показывает слишком много глупых изменений как BINDIFF, предполагая, что некоторые вещи не так важны, что цениться в большой работе.

Если Вам не нравится форма графиков, Вы можете использовать оба ДИФЕРА одновременно и потом смотреть результаты на графике BINDIFF.

DIAPHORA

DIAPHORA - плагин написанный в PYTHON Джоксеаном Коретом.(Подправьте меня если неправильно — прим. Яши)

https://github.com/joxeankoret/diaphora

31.png


Его не нужно устанавливать. Я могу распаковать его в любое место и ему нужен только установленный PYTHON на машине.

32.png

Так что мы будем действовать как обычно. Сначала делаем так для пропатченной или неуязвимой версии файла в IDA.

33.png

В FILE → SCRIPT FILE откройте поисковик и идите в папку, где мы распаковали DIAPHORA и ищем там файл DIAPHORA.PY.

34.png

35.png


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

36.png

Когда база готова, мы открываем уязвимый файл в IDA и повторяем те же самые действия. Открываем DIAPHORA.PY и не меняя ничего мы экспортируем базу данных в файл.

37.png

Как только мы сделали то же самое в обоих файлах, мы снова открываем DIAPHORA.PY в уязвимой версии файла, но на этот раз делаем так.

38.png

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

Видим, что когда мы идем в папку, то кажется что там ничего нет.

39.png

Но это происходит из-за фильтра файлов. Мы меняем фильтр на *, чтобы увидеть все файлы.

40.png

И мы ищем здесь неуязвимую версию файла.

41.png

Я нажимаю OK как на скриншоте.

42.png

Мы видим, что есть вкладка BEST MATCHES с которой не остается сомнений, что файлы одинаковые.

43.png

На вкладке PARTIAL MATCHES мы видим строки, которые возможно были изменены.

44.png

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

45.png

Этот плагин имеет несколько опций для того, чтобы изображать РАЗЛИЧАЯ.

46.png

DIAPHORA очень точная и подробная, но когда Вы видите сто таких функций, то хочется просто взять и вскрыться >:lol: . Давайте посмотрим вторую опцию DIFF ASSEMBLY IN A GRAPH.

47.png

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

Другая опция DIFF PSEUDO CODE использует плагин HEX RAYS, который поставляется вместе с IDA. Плагин старается воссоздать исходный код из исполняемого файла.

48.png

Мы видим, что в уязвимой версии файла, который мы отреверсили вручную и определили, существует буфер из 16 байт, эта переменная BUF определяется как буфер. Но в неуязвимой версии, поскольку мы не сделали ту же работу, плагин не обнаруживает его, а просто помечает буфер как переменную типа CHAR, ничего более. Плагин также показывает, что переменная в уязвимой версии – ЗНАКОВАЯ, а в неуязвимой версии, не говорит ничего про тип переменной, что предполагает, что это переменная имеет БЕЗЗНАКОВЫЙ тип.

Другая характеристика DIAPHORA состоит в том, что она самая медленная (она написана на PYTHON, а не на C как TURBODIFF) и в больших исполняемых файлах анализ и сравнение очень долгое.

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

Это упражнение открыто обсуждается как в списке рассылки CRACKSLATINOS, так и в нашей телеграмм группе.

https://telegram.me/CLSExploits

До 23-тей части, где будет представлено решение этого упражнения.


Автор текста: Рикардо Нарваха - Ricardo Narvaja (@ricnar456)
Перевод на английский: IvinsonCLS (@IvinsonCLS)
Перевод на русский с испанского+английского: Яша_Добрый_Хакер(Ростовский фанат Нарвахи).
Перевод специально для форума системного и низкоуровневого программирования — WASM.IN
22.11.2017
Версия 1.0

8 10.099
yashechka

yashechka
Ростовский фанат Нарвахи

Регистрация:
2 янв 2012
Публикаций:
90

Комментарии


      1. Kulagin 6 дек 2021
      2. Kulagin 6 дек 2021
        А вот это я не знаю, как пофиксить, когда жмешь на view flow graphs:
        [​IMG]

        Выбрасывает ошибка:
        [​IMG]

        Мне кажется, или этот плагин какой-то
        [​IMG]
      3. Kulagin 6 дек 2021
        Ошибка BinDiff про вторичную базу:

        [​IMG]

        Лечится перемещением папки, где нет русских символов.
        Еще мб из-за лимита в 160 символов от Мелкомягких.
      4. Kulagin 6 дек 2021
        Если у кого-то вдруг не работает BinDiff, надо ставить конкретную версию. Вначале поставил самую последнюю - 7. В IDA не было пунктов в плагинах:
        [​IMG]

        Пользуюсь IDA 7.2. Поставил BinDiff 5, который сделан как раз специально для IDA 7.2 на IDA 7.2 SDK, и заработало.
      5. yashechka 1 мар 2018
        :preved::preved::preved:
      6. yashechka 23 ноя 2017
        :thank_you2::thank_you2::thank_you2:
      7. yashechka 22 ноя 2017
        Уже два человека погладили кота. :thank_you2::thank_you2::thank_you2: С большим уважением к Вам Ваш Яша:thank_you2::thank_you2::thank_you2:
      8. yashechka 22 ноя 2017
        Призываю Всех, кому интересно то, что я делаю погладить кота здесь - https://qiwi.me/please_donate_on_home_pc. Написал ещё в комах номер карты.