> 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)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://yutewiyof.gitbook.io/intro-rev-ida-pro/chast-22.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
