> 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-35.md).

# Часть 35

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

Я скомпилировал две программы. Первую программу скомпилировал с защитой **DEP**, а вторую программу - без этой защиты. Код везде один и тот же. Но в этом случае, вместо того, чтобы изменять код и компилировать программу, я напрямую вызываю **API** функцию **SETPROCESSDEPPOLICY**. В первой программе, я вызываю эту функцию с аргументом **0** (без использования защиты **DEP**), а во второй программе - с аргументом **1** (с использованием защиты **DEP**).

Если я запущу обе программы и посмотрю на них через утилиту **PROCESS EXPLORER**, я увижу, что обе остановятся на функции **GETS\_S**, ожидая ввода данных, которые передаются функции **SETPROCESSDEPPOLICY**. Поэтому, защита **DEP** активируется в обеих программах с помощью **API** функции.(В первой программе, защита включена, а во второй - выключена)

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu_ZBdg3BendVEjpc%2F01.png?generation=1563266016362044\&alt=media)

Эти примеры лучше чем предыдущие, потому что код очень похож, а в предыдущих примерах ещё и не хватало места в буфере для выполнения **ROP**.

Единственный плагин, которого нам сейчас не хватает - это **IDASPLOITER**.

<https://github.com/iphelix/ida-sploiter>

Это просто **.PY** файл, который мы загружаем по приведенной ссылки выше. Я нажимаю ссылку **CLONE ИЛИ DOWNLOAD** и копирую его в папку **PLUGINS**, где установлена **IDA**. Это всё что нужно сделать, чтобы он заработал.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjrDv_m4LAycSFMBnkh%2F-LjrE0rRJ6-5mMKdnJEv%2F35-02.png?generation=1563221044922719\&alt=media)

Код одинаков в обеих программах. Единственное отличие — это аргумент функции, который равен **0** или **1**.

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

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjrDv_m4LAycSFMBnkh%2F-LjrE0rXhmZuXRBZGaDn%2F35-03.png?generation=1563221043343742\&alt=media)

Сейчас, я буду работать с программой, которая не имеет защиту **DEP**. Анализ этой программы послужит нам для обеих программ.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjrDv_m4LAycSFMBnkh%2F-LjrE0r_c-o2i5uzAQpj%2F35-04.png?generation=1563221043745181\&alt=media)

Мы видим, что программа использует функцию **ATOI** для того, чтобы преобразовать данные в число, которые мы вводим как аргумент и далее, программа сохраняет полученное число в переменную **SIZE**, которая является знаковой. Ниже мы видим, что программа использует инструкцию сравнения **JG**, которая представляет собой сравнение со знаком. Поэтому, Вы можете передать отрицательное число, которое будет меньше чем **0x300**, и оно как размер передастся как аргумент в функции **SALUDA**. Внутри этой функции, это число будет использоваться как размер в функции **GETS\_S**, которая принимает этот аргумент как беззнаковое, провоцируя возможное переполнение, так как функция позволяет ввести больше **0x300** байт в буфер для этого размера.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu__ArUgJNWKBhxO6%2F05.png?generation=1563266016697496\&alt=media)

Программа загружает модуль **MYPEPE.DLL** используя функцию **LOADLIBRARY**. Мы можем использовать **DEMANGLE** имена для того, чтобы анализ стал выглядеть лучше.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjrDv_m4LAycSFMBnkh%2F-LjrE0rk2vbTQn1WQskL%2F35-06.png?generation=1563221044075961\&alt=media)

Сейчас, анализ выглядит лучше и всё понятно. Давайте посмотрим функцию **SALUDA**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjrDv_m4LAycSFMBnkh%2F-LjrE0rokPoxEH-uaJyZ%2F35-07.png?generation=1563221049127859\&alt=media)

Поскольку я скомпилировал программу с символами, **IDA** уже обнаружила буфер **NOMBRE** и передаёт его адрес в функцию **GET\_S**, помимо размера, который является аргументом этой функции.

Давайте посмотрим на статическое представление стека.

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

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjrDv_m4LAycSFMBnkh%2F-LjrE0ruy0BanmoZPPa3%2F35-08.png?generation=1563221044664845\&alt=media)

Поэтому, в функцию **GETS** я должен передать что-то похожее на это.

Fruta = **"A"** \* 772 + struct.pack(**"\<L"**,0xCCCCCCCC) + shellcode

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

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu_aSDHjABCocUg2y%2F09.png?generation=1563266016630771\&alt=media)

Если я запущу скрипт и присоединю к нужному процессу **IDA**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjrDv_m4LAycSFMBnkh%2F-LjrE0s0zoFqKxWtLCyu%2F35-10.png?generation=1563221044060123\&alt=media)

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu_b3bmCWiJLZhv1v%2F11.png?generation=1563266016512280\&alt=media)

Я вижу, что всё хорошо посчиталось. Здесь программа переходит по адресу **0xCCCCCCCC**, как я и запрограммировал в своём скрипте.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu_bQ1WcyvqxtubkO%2F12.png?generation=1563266016772481\&alt=media)

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu_bfhuot_UW6oF1B%2F13.png?generation=1563266016506898\&alt=media)

Конечно, после согласия, регистр **ESP** указывает на мой шеллкод в стеке поскольку у программы нет **DEP**. Eсли вместо перехода на адрес **CCCCCCCC** программа перейдет на инструкцию **JMP ESP**, **CALL ESP** или **PUSH ESP**-**RET** в некотором модуле без рандомизации для того, чтобы она не перемещалась, шеллкод был был готов.

**IDA SPLOITERом** будет отображать список модулей, который можно увидеть через **VIEW→ OPEN SUBVIEW → MODULES** или **SHIFT** + **F6**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjrDv_m4LAycSFMBnkh%2F-LjrE0sI4aaEflKry47v%2F35-14.png?generation=1563221043912205\&alt=media)

Здесь мы видим список модулей. Мы видим, что библиотека **MYPEPE.DLL** не имеет **ASLR** (рандомизацию), поэтому она хороший кандидат на поиск инструкции **JMP ESP**.

Мы видим, что если мы сделаем правый щелчок, появится опция **SEARCH GADGETS**, которая ищет кусочки кода, которые заканчиваются на **RET**. Как только я пометил все гаджеты, я могу нажать **CTRL**+ **F** и начать искать **PUSH ESP**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjrDv_m4LAycSFMBnkh%2F-LjrE0sMoIkntAI9ufLd%2F35-15.png?generation=1563221042904743\&alt=media)

Поэтому я могу использовать этот адрес здесь. У него нет проблем с нулями, так как их принимает функция **GETS\_S**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu_cL4-dVmjCSEHJ5%2F16.png?generation=1563266016464265\&alt=media)

Готово. Шеллкод был сделан для файла **MYPEPE.DLL**. Поэтому он работает, как и в прошлый раз.

В следующей части мы будем разбирать файл **DEP.EXE** с **ROP**.

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

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

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

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

19.03.2018

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