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

Дата публикации 2 окт 2017 | Редактировалось 8 окт 2017
Мы достигли 17-той части и предполагается, что, по крайней мере, Вы должны были попробовать решить это упражнение.

http://ricardonarvaja.info/WEB/INTRODUCCION AL REVERSING CON IDA PRO DESDE CERO/EJERCICIOS/

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

В этой главе мы будем действовать немного по другому. Я буду распаковывать файл удаленно на виртуальную машину VMWARE WORKSTATION с установленной системой WINDOWS 10.

Главная машина для удаленной отладки, это та, где запущенна IDA. В данном случае, это машина с WINDOWS 7. Но это могут быть любые системы, а не только WINDOWS. Например LINUX, IOS и т.д. где есть установленная IDA.

Все ограничения, которые произойдут при удаленной распаковке, будут такими же, как если бы программа отлаживалась напрямую в WINDOWS 10, так как оттуда запускается упакованный файл, который в этой части называется PACKED_PRACTICA_1.EXE.

Чтобы было быстрее читать и понимать, отсюда и далее, главную машину, где установлена IDA, я буду называть “ОСНОВНОЙ”, а образ системы WINDOWS 10, который запускаю в VMWARE буду называть “ЦЕЛЕВОЙ”.

1.png

В ЦЕЛЕВОЙ системе находится упакованный файл. Я также должен скопировать из каталога, где у меня установленна IDA в ОСНОВНОЙ системе, сам сервер. Так как моя система WINDOWS 10 - 64-битная, а упакованная программа – 32-битная, то я должен запустить 32-битый сервер. Он называется WIN32_REMOTE.EXE.

2.png

Копируем также исполняемый файл PACKED_PRACTICA_1.EXE в ОСНОВНУЮ систему, чтобы выполнить ЛОКАЛЬНЫЙ анализ и открываем этот файл в ЗАГРУЗЧИКЕ. Я устанавливаю галочку в MANUAL LOAD, для того, чтобы IDA проанализировала файл и загрузила все его секции.

Сейчас мы находимся в ЗАГРУЗЧИКЕ, который показывает мне EP упакованной программы. Пока мы ещё не запускали ОТЛАДЧИК.

3.png

Очень важно не переименовывать IDB файл. Другими словами, это означает, что если исполняемый файл называется PACKED_PRACTICA_1.EXE в ОСНОВНОЙ системе, то при анализе он будет сохранять IDB файл в ту же самую папку, и он должен называться PACKED_PRACTICA_1.IDB, и никак по другому, потому что так начнутся проблемы с распознаванием какой удаленный процесс принадлежит исполняемому файлу анализируемого локально.

Сейчас, давайте запустим удаленный сервер WIN32_REMOTE.EXE в ЦЕЛЕВОЙ системе.

4.png

Этот файл запускает удаленный сервер IDA и будет слушать IP адрес и порт, который мы ему назначим. В моём случае, IP равен 10.80.65.157, а порт 23946. Скопируйте данные, которые сервер показывает для Вас.

Теперь поменяем тип отладчика на REMOTE WINDOWS DEBUGGER.

5.png

В PROCESS OPTIONS я устанавливаю IP адрес и ПОРТ сервера IDA. Т.к. процесс ещё не создан, то мы не сможет подсоединиться к нему с помощью отладчика. Также, нам нужно отлаживать файл с самого начала. Мы должны исправить пути, которые IDA показывает здесь, чтобы они совпадали с расположением исполняемого файла в ЦЕЛЕВОЙ системе.

6.png

В моём случае, распакованный файл в ЦЕЛЕВОЙ системе находится на РАБОЧЕМ СТОЛЕ и полный путь для моей системы будет - C:\USERS\ADMIN\DESKTOP\PACKED_PRACTICA_1.EXE

7.png

Поэтому давайте отредактируем эти три поля для ввода пути.

8.png
Сейчас, если нажмём кнопку START PROCESS, то IDA остановится на EP упакованного файла в РЕЖИМЕ ОТЛАДЧИКА.

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

9.png

Сейчас, в СЕГМЕНТАХ давайте посмотрим на первую секцию кода после заголовка.

В моём случае, я вижу, что она начинается по адресу 0x231000 и заканчивается по адресу 0x238000.

10.png

Если мы просто сделаем SEARCH FOR TEXT, чтобы найти инструкцию POPAD или POPA, в этом случае, найдём ту инструкцию, которая выполняется до перехода в OEP.

11.png
12.png

Здесь, мы уже знаем, что OEP находится по адресу 0x23146E, но я могу найти её по другому. Я устанавливаю BP на ВЫПОЛНЕНИЕ, который охватывает всю первую секцию.

Теперь иду в начало секции по адресу 0x231000.


Здесь я вижу данные, которые принадлежат заголовку. Очевидно, адреса не совпадают из-за рандомизации. IB не равна 0x400000, но VIRTUAL SIZE такой же, как и был, и равен 0x7000 байт, т.е. размер секции в памяти совпадает, так как она начинается по адресу 0x231000, а заканчивается по адресу 0x238000. Это разница и составляет 0x7000 байт.

13.png

Теперь, в начале секции, я устанавливаю BP с помощью F2. В моём случае, это адрес 0x231000 или соответствующий адрес, который на Вашем компьютере имеет размер 0x7000.

14.png

Я удаляю все другие BP. Но оставляю только один этот и нажимая F9, для того, чтобы запустился отладчик.

15.png

Отладчик останавливается здесь и совпадает с адресом, который мы видели ранее, который принадлежит OEP. Сейчас удаляю BP, чтобы исчез красный фон.

16.png

Теперь, делаю правый щелчок в левом нижнем(верхнем?) углу, чтобы ПОВТОРИТЬ АНАЛИЗ.

17.png

В этом случае, отладчик оставляет этот блок таким, как будто это блок того же СТАБА. Поэтому отладчик не поместил префикс SUB_, а оставил префикс как LOC_.

Сейчас, я исправляю скрипт для дампа в PYTHON, для того, чтобы он показывал мне мою настоящую IB и конец файла.

18.png

Другими словами, IB в моём случае, находится по адресу 0x230000, а её конец 0x23B000.

19.png

Здесь, я меняю значения в скрипте и запускаю его через FILE → SCRIPT → FILE.

20.png

Отладчик сохраняет дамп в этой папке, так как скрипт запускается на ОСНОВНОЙ машине.

Я открываю этот файл с помощью PEEDITOR и выбираю пункт DUMPFIXER.

21.png

Теперь меняю расширение файла на EXE.

22.png

Вот у него появляется такая же иконка, как и у сжатого файла. Сейчас, открываю SCYLLA в ЦЕЛЕВОЙ системе и копирую туда сдампленный файл PACKED.EXE.

23.png

Пришло время нажать на кнопку IAT AUTOSEARCH.

24.png

Я меняю поле OEP на значение 0x23146E, которое мы нашли.

И вижу, что после нажатия IAT AUTOSEARCH и GET IMPORTS, остаётся только одна НЕДЕЙСТВИТЕЛЬНАЯ запись.

Складывая IB с адресом недействительной записи, получаю

Python>hex(0x230000+0x20D4)
0x2320D4

25.png

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

Видим, что этот указатель имеет ссылки.

26.png

27.png

Теперь посмотрим куда он ведёт.

28.png

Видим, что он заканчивается тем, что приходит в блок с инструкцией RET.

Для нас, настоящих хакеров, это не проблема. Так как указатель ведёт в фиксированное значение программы, которое равно RET, то это не API функция, поэтому на неправильной записи делаю ПРАВЫЙ ЩЕЛЧОК → CUT THUNK для удаления записи из IAT.

29.png

Сейчас, я нажимаю FIX DUMP на PACKED.EXE и у меня получается файл PACKED_SCY.EXE, однако он не запускается. Это происходит потому, что в дампе не перераспределены адреса, которые были созданы во время выполнения, которые не принадлежат IAT и всегда меняются при запуске. Поэтому, я буду удалять рандомизацию. Я открываю PACKED_SCY.EXE в IDA с помощью MANUAL LOAD, загружаю заголовок и перехожу в него.

30.png

В заголовке есть поле DLL CHARACTERISTICS. У Вас значение будет отличаться от нуля, потому что я уже изменил его.

31.png

Из меню EDIT → PATCH PROGRAM → CHANGE WORD меняем этот байт на нуль.

32.png

И потом сохраняем изменения с помощью APPLY PATCHES TO INPUT FILE.

Вот и всё ребята.

33.png

Наш файл из примера теперь распакован. В 18-той части мы начнём его реверсить.

До встрече в 18-той части.

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

15 11.311
yashechka

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

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

Комментарии


      1. yashechka 8 окт 2017
        Как быстро идёт время :sorry: Не успел я выложить 16 главу, как нужно уже выкладывать 17-ю. Неделя прошла в лёт. Моей маме сегодня 55, как быстро жизнь идёт :no2:
        RET нравится это.
      2. yashechka 8 окт 2017
        Увидел ошибку - пиши:yes4:
      3. yashechka 9 окт 2017
        Я не понял? А хто лайкать будет?;)
        DzenGURU нравится это.
      4. G0r 9 окт 2017
        Спасибо за перевод. А можно как-нибудь подписаться на твои работы, чтобы при выходе новый главы приходило оповещение на почту, а то, например, я иногда забываю периодически заходить на этот сайт?
        yashechka нравится это.
      5. Alexey 14 окт 2017
        Подписаться на новые статьи закоментино. Попробуй подписаться на самого яшу https://wasm.in/members/yashechka.20788/ там есть кнопка, если не сами статьи то возможно будет приходить то что он пишет ссылки на статьи в профайле своем
      6. yashechka 14 окт 2017
        "Подпишись на Яшу -> Будь в тренде " :lol: :lol: :lol:
        DzenGURU нравится это.
      7. tfs_cradle 14 окт 2017
        :popcorm2:
        yashechka нравится это.
      8. yashechka 15 окт 2017
        [​IMG]

        делаю
      9. Sloneny 6 янв 2018
        Для пользователей VirtualBox:
        Если IDA плачет горькими слезами, и не может подключиться к виртуалке, а в Output Window пишет
        измените в настройках виртуалки (в разделе сеть) тип подключения на "Виртуальный адаптер хоста". И перезагрузите гостевую систему.
        CrawlUp и yashechka нравится это.
      10. CrawlUp 24 дек 2018
        "Could not connect to 169.254.77.70:23946: Сделана попытка выполнить операцию на сокете при отключенной сети."- вот что пишет ida. Виртуальная машина Oracle VirtualBox.
        Хотя нет, немного танцев с бубном и дело пошло, теперь ищем VCRUNTIME140.dll
        yashechka нравится это.
      11. CrawlUp 24 дек 2018
        Танцы с бубном которые позволили подключиться к удалённому серверу, просто так даже и не опишешь. Пока на виртуальной машине в параметрах сети не появился ip адрес 192.168.56.101 и такой же адрес не появился при запуске в удалённом сервере, запуситить отладку не удавалось, лезли какие-то ошибки.
        yashechka нравится это.
      12. кофейник 10 июл 2020
        Виртуальная машина не работала (WMWare Workstation 15.5.6 X5690). В Сети пишут, не предусмотрено с этим процессором. Разрулил установкой версии 12 и проблемами, решение которых детально описано в Сети. Получил рабочую виртуальню машину, с последующим апгрейдом до версии 14 и финальной 15. Повреждений в стволе не обнаружил.
        Описаный Нарвахой файл "win32_remote" находится по адресу: папка с установленной программой IDA > dbgsrv > win32_remote
        yashechka, еще раз спасибо за работу.
        yashechka нравится это.
      13. yashechka 11 июл 2020
        Кофейник, спасибо тебе что оставляешь коммы, мне будет легче делать видеоуроки.
      14. DrVirus 1 дек 2022
        I tried to change the ASLR randomization by changing DLLCharacteristics flag to "dw 0". But the exe cannot be started anyway. The original flag for DLLCharacteristics in IMAGE_OPTIONAL_HEADER section was dw 8140h. But after editing it to as described in tutorial it stops executing. Any suggsetion sregarding this?
      15. DrVirus 2 дек 2022
        I don't know how to edit my earlier comment, so posting a new one. I tried to start with a new seesion today, and to my delight everything worked perfectly. I still don,t understand what mistake I was doing yesterday. I was able to disable the ASLR in dumped unpacked exe by changing "dw field of Dll Characteristics at RVA 0x0156" to 0x0. The final patched file worked flawlessly.