> For the complete documentation index, see [llms.txt](https://yutewiyof.gitbook.io/intro-rev-ida-pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yutewiyof.gitbook.io/intro-rev-ida-pro/chast-22.md).

# Часть 22

[\[Используемые материалы\]](https://github.com/yutewiyof/intro-rev-ida-pro/tree/e1367e11cc661f3d69c02ae5f733b7dd168bc5ab/.gitbook/assets/files/22.zip)

## РАЗЛИЧАЯ

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

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

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

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

## BINDIFF

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

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

![](/files/-LjqtGbT5HNFNZ3G6Fen)

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

![](/files/-LjqtGbV_8KY-a29pmOf)

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

![](/files/-LjttzcrCZ8YIadR7IXs)

![](/files/-Ljttzd0FzeMQ16gU_cR)

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

![](/files/-LjttzdAcU1zlDXRJMEL)

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

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

![](/files/-LjttzdL5u59iC7mcATa)

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

![](/files/-LjttzdVGFdbOCaZS6QH)

Теперь, я иду в меню **EDIT** → **PLUGINS**.

![](/files/-LjqtGbg1OmYDEeMEyrr)

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

![](/files/-LjqtGbiEI38dVavvpq0)

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

![](/files/-LjqtGbkmoU9mbDabp1l)

![](/files/-LjqtGbmqjgkWqkga3m-)

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

![](/files/-LjttzeIaEZLPo_QBoPv)

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

![](/files/-LjqtGbq0W18DmeaSYh0)

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

![](/files/-LjttzejQ5DcgsxyEwGy)

![](/files/-Ljttzex5wOcJqBf3auF)

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

![](/files/-LjttzfMsgEC2_dIpJAp)

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

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

![](/files/-LjqtGbyQHAdDhTum143)

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

![](/files/-LjqtGc-VUzXxmq9LrOR)

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

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

![](/files/-LjttzfsTYfip5ACsRXd)

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

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

## TURBODIFF

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

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

![](/files/-Ljttzg3z6Bt_Mi65vl5)

![](/files/-LjttzgEnaNxqwmUzYOh)

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

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

![](/files/-LjqtGc7Np7kTfKJ1Gx4)

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

![](/files/-LjqtGc9uYUjonEGIqmb)

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

![](/files/-LjqtGcBLkoZ7QGeHojN)

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

![](/files/-LjqtGcDNe9HMgCxfknH)

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

![](/files/-LjttzgyHc02vDFnAJKi)

![](/files/-LjqtGcHHrm2Up9ormVE)

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

![](/files/-LjqtGcJ7Ph-6znBvryU)

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

![](/files/-LjttzhTBU8-uWMH-t1R)

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

![](/files/-LjqtGcNcTxSe7nTLsic)

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

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

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

## DIAPHORA

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

<https://github.com/joxeankoret/diaphora>

![](/files/-LjqtGcPaHrTfxeFcvTg)

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

![](/files/-Ljttzi22F7QSd2Qct4U)

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

![](/files/-LjqtGcfFEk_ABjvbKPO)

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

![](/files/-LjttziIv66Kh5PU84tI)

![](/files/-LjttziSzIKmAXNu6a_S)

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

![](/files/-LjqtGclOlQ18S9o5TGC)

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

![](/files/-Ljttzih30X5keyXiNGk)

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

![](/files/-LjqtGcq3CVUnEk4LTVs)

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

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

![](/files/-LjqtGcsfDsWU2mDeSy3)

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

![](/files/-LjttzjFvx3OG6AKRmkh)

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

![](/files/-LjttzjR2S3loKNrNdhf)

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

![](/files/-LjqtGcyasVlPrdBYG8u)

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

![](/files/-LjqtGd-eLhbA3tcj0ap)

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

![](/files/-LjttzjxgiuNoXaFhU0G)

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

![](/files/-LjqtGd3hBRDWUCpaiRp)

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

![](/files/-LjttzkGlQrf0kTKWp-L)

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

![](/files/-LjttzkQBKPdLAZafCMD)

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

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

![](/files/-LjqtGd9zJ5PnSiqmDWr)

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

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

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

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

<https://telegram.me/CLSExploits>

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

Автор оригинального текста — Рикардо Нарваха.

Перевод и адаптация на английский язык — IvinsonCLS.

Перевод и адаптация на русский язык — Яша Яшечкин.

Перевод специально для форума системного и низкоуровневого программирования - WASM.IN

22.11.2017

[**Источник: ricardonarvaja.info**](http://ricardonarvaja.info/WEB/IDA%20DESDE%20CERO/CURSO%20DE%20IDA%20TUTES/22-INTRODUCCION%20AL%20REVERSING%20CON%20IDA%20PRO%20DESDE%20CERO.docx)
