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

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

AnGel

Администратор
Команда форума

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
Хорошо, мы уже увидели что-то о ЗАГРУЗЧИКЕ и мы будем продолжать его разбирать и дальше, но сейчас мы будем разбирать некоторые особенности ОТЛАДЧИКА, которые дополняют друг друга.

IDA поддерживает множество ОТЛАДЧИКОВ, чтобы увидеть их, мы открываем оригинальный файл КРЭКМИ CRUEHEAD без патча в IDA.

Очевидно, мы выбираем OVERWRITE, если IDA спросит нас, хотим ли мы создать новую базу данных и затереть старую, чтобы сделать новый анализ, если у нас уже была в том же месте предыдущая база данных или файл IDBпропатченой программы.

daf72f3de1ae6edbfdbf379ec5f8067d._.png

Мы не будем устанавливать режим РУЧНАЯ ЗАГРУЗКА, потому что не хотим соглашаться на все окна, которые появляются до тех пор, пока они все не загрузятся.

6cf18d3b08cb77c4780b2e02a94f67ea._.png

Очевидно, чтобы начать с самого начала между различными возможностями ОТЛАДЧИКОВ, мы будем выбирать для начала LOCAL WIN32 DEBUGGER,который будет служить отправной точкой, позже мы рассмотрим и другие отладчики.

748bfca85be35b52bf4454ececb227fc._.png

Мы увидим некоторые возможности ОТЛАДЧИКА включенного в IDA, который имеет свои особенности и если не научиться использовать его, так как он немного отличается от остальных отладчиков, то в дальнейшем Вам будет сложно.

Я думаю, что различия возникают, потому что IDA начинала свой жизненный путь просто как так называемый ЗАГРУЗЧИК или очень хороший статический дизассемблер и с большими возможностями интерактивности для реверсинга, затем в неё был добавлен ОТЛАДЧИК, который принёс свои проблемы, которые были решены, но способы работать с ним иногда немного отличается от других ОТЛАДЧИКОВ, таких как OLLYDBG.

В DEBUGGERS → DEBUGGERS OPTIONS у нас есть опции для ОТЛАДЧИКА.

90bf38c162bb91ae7f433426aa9b31f3._.png

Мы будем устанавливать галочку SUSPEND ON PROCESS ENTRY POINT для того, чтобы останавливаться на точке входа.

Мы будем делать изменения в анализе, как мы это делали и раньше, мы будем ПЕРЕКРАШИВАТЬ и ПЕРЕИМЕНОВЫВАТЬ зоны условных переходов.

cdcb1a13fb270eb41eb83b3ec3ead5a7._.png

Здесь мы установим BP с помощью F2 на переход, который принимает решение по адресу 0x401243 и мы идём к другому переходу, который мы пропатчили и также нажимаем F2.

d03d2a14c4301516c89e5460c30fd6fd._.png

Сейчас мы можем запустить ОТЛАДЧИК с помощью DEBUGGER → START PROCESS.

1c9f81727ffb1c4547bd7b886d8be03a._.png

Это окно всегда будет появляться у нас, когда мы идём в ОТЛАДЧИК, чтобы отлаживать наш исполняемый файл на нашей локальной машине, так как пока мы анализируем его в ЗАГРУЗЧИКЕ, он никогда не выполнится на нашей машине, но сейчас если он будет выполняться в отладчике, нам всегда нужно быть осторожным выполняя такой файл, если это ВИРУС или что-то потенциально опасное, нужно использовать УДАЛЕННЫЙ ОТЛАДЧИК и выполнять его код в виртуальной машине, мы увидим это в своё время.

Поскольку изучение КРЭКМИ CRUHEAD более интересное занятие, чем лечение ЛЕССИ, мы нажимаем YES.

7acbbe19456e7023c537ee3b8dea5dea._.png

Выше мы попросили отладчик остановиться на ТОЧКЕ ВХОДА, так это и произойдёт, отладчик остановится по адресу 0x401000, если я нажму пробел то перейдём в графический режим прям как в ЗАГРУЗЧИКЕ.

Небесный цвет фона блоков говорит мне, что я нахожусь в ОТЛАДЧИКЕ, в ЗАГРУЗЧИКЕ же блоки белые по умолчанию.

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

acf97f10537cccac38a7aa83ef95dc98._.png

Здесь мы видим РЕГИСТРЫ и ФЛАГИ.

После того, как я добился для себя удобного вида, я буду сохранять его по умолчанию для ОТЛАДЧИКА через меню WINDOWS → SAVE DESKTOP выбирая галочку в DEFAULT, всегда, когда мы запускаем ОТЛАДЧИК он будет загружаться с теми настройками, которые мы сохранили и если мы хотим изменить их снова, мы можем сделать это без проблем.

426ecd766251e7bf61b7c471de197447._.png

Под регистрами мы видим СТЕК.

73d53818eda269c67607e31146c73de6._.png

Также у нас есть дизассемблированный листинг инструкций - IDA → VIEW EIP, а ниже HEW VIEW или, что то же самое, что и HEX DUMP в HEXформате.

dcb9cb5afa20f5b996e6e7d530844fd4._.png

В нижней части дизассемблированного листинга мы видим:

5150b59d0f92960d7ec600a91d4cedc6._.png

Мы всегда будем иметь адрес памяти и ФАЙЛОВОЕ СМЕЩЕНИЕ, или просто СМЕЩЕНИЕ в исполняемом файле, если мы откроем его в HEX редакторе, например таком как HXD, то увидим

bdb216ead0f2f79626f6764d91efd6f1._.png

Мы видим, что в ПО СМЕЩЕНИЮ 0x600 находятся те же самые байты.

Мы уже знаем, что ПО УМОЛЧАНИЮ в ЗАГРУЗЧИКЕ и ОТЛАДЧИКЕгорячая клавиша G сконфигурирована так, что при нажатии на неё происходит переход к адресу памяти, если я нажму G и введу 0x401389.

cb3fdf77f3509b05f60d488325043ee2._.png

Я иду в область, где был BP, мы видим цвета, я делаю так, чтобы байты не были видны, чтобы не загрязнять наш внешний вид программы, и я вижу, что внешний вид стал таким как мы оставили его ЗАГРУЗЧИКЕ, если мы реверсим, изменяем имена и так далее, здесь в ОТЛАДЧИКЕ все изменения сохраняются, также изменения, которые мы сделали здесь появятся в ЗАГРУЗЧИКЕ, так как это модуль помеченный как те, которые загружаются в ЗАГРУЗЧИК.

48d1460b49b74a36e8d10702ae80f50d._.png

1af867822495d1519f16db7ba577528a._.png

В VIEW → OPEN SUBVIEW → SEGMENTS мы видим сейчас три сегмента, которые загружает ЗАГРУЗЧИК, когда не активирован режим РУЧНОЙ ЗАГРУЗКИ, КОД, который загружается по адресу 0x401000, ДАННЫЕ (DATA) и ДАННЫЕ ИМПОРТА (IDATA), любые изменения, которые, мы сделаем с этими тремя сегментами, будут оставаться, так как они загружены в ЗАГРУЗЧИК, но изменения в других сегментах будут потеряны, потому что они являются модулями загруженными ОТЛАДЧИКОМ и они не будут сохранены в базу данных.

=>

Одна из панелей, которую я всегда считаю очень полезной.

dce8d3006667554d3fc9480f68d0e8c3._.png

Я добавляю её и сохраняю снова с помощью SAVE DESKTOP, чтобы использовать её по умолчанию.

8f11ce3bfc799eb8ba389904d93d6d0d._.png

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

Нажав стрелку назад, я возвращаюсь к точке входа, где я был раньше.

acf5858c7f7bd401e9b097e2c9179a2d._.png

Также в меню DEBUGGER.

d086f9b762a024b9d6ed354b255c74b2._.png

Я могу видеть список BP и идти туда, куда я хочу, кликнув на BP два раза.

fab2bf20f8b9df4d9c3efd80999b53b3._.png

20ee3fe7a0d1028f8b18b711ff8df9da._.png

Так что я нахожусь сейчас на EP и у меня есть две установленных BP, так что я могу нажать клавишу F9 для запуска программы.

cf7e06041a495cfd233e996e0db835d3._.png

Мы идём в HELP → REGISTER и давайте введём ключ.

c7e71a86410072e2b3e121ded9b59871._.png

Нажимаем OK.

e143c47926cb84701713b7b2592dcf3e._.png

Стрелка с левой стороны где будет продолжено выполнение начинает мигать, мы видим, что регистр EAX равен 0x72.

68b6926c13506802c3f757ad0ad4a07a._.png

Если я наберу в панели PYTHON CHR(0x72), я увижу, что это буква r слова ricnar.

eaf5df2dbbae65188012e0cf833e2696._.png

И она будет сравниваться с числом 0x41, чтобы узнать ниже ли она.

c8335e11149b90583a92e90a636ed4f7._.png

Мы можем также видеть с помощью функции CHR(0x41) в панели PYTHON, что это буква A.

b0a00e1f0c64e4120ec6ef235f25f79d._.png

Но мы также можем сделать это более легким методом, для этого нужно сделать правый щелчок на числе 41H и в списке между настройками, которые мы можем выбрать для отображения и у меня появляется символ A.

c12f7933b98c4925324d9802efad5272._.png

2671ad9ee4574ee00677147c72a81818._.png

Мы видим, что сейчас идёт сравнение с символами от A и до Z, на данный момент мы не решим полностью этот крэкми, но мы видим, что 0x72 больше чем 0x41, следовательно, IDA не перейдет в красный блок сообщения об ошибке. Очевидно IDA будет переходить в красный блок, если число будет ниже, но также его можно оценить просто увидев флаги.

843811726ef2a1978443bd4c609c1645._.png

Здесь мы видим переход JB, который переходит или следует за зеленой стрелкой в IDA, если первое число ниже, но при этом также активируется флаг C (также называемый как флаг CF или C) , здесь он говорит, что переход будет осуществлен, если C = 1, если мы посмотрим в IDA на наши флаги.

1833674c09ef43372fdaadd2f8772279._.png

Флаг C = 0, поэтому переход не будет сделан и произойдет переход к красной стрелке.

Каково сейчас математическое условие, при котором активируется ФЛАГ CARRY?

Флаг CARRY даёт нам информацию о том, что что-то пошло не так в операции сравнения между беззнаковыми целыми числами, если я делаю вычитание, так как CMP это вычитание без сохранения результата, т.е. 0x72 - 0x41, то результат будет равен 0x31, что есть положительное число и там нет проблем, однако если моё значение было бы 0x30, например уменьшив его на 0x41, он даст мне результат -0x11.

0c2c20ea32acbc30bb0b1646bcd56e63._.png

Это отрицательное значение и оно не принимается как результат операции с положительными числами, поэтому значение продолжает работать с ним в режиме HEX.

bd1520f15b6c30e80ecf0dff30354a22._.png

Оно будет равно числу 0xFFFFFFFEF и считая его как положительное, это очень большое значение равное 4294967279 и ( in no way subtracting ) 0x30 – 0x41 равно отрицательному числу 0xFFFFFFEF.

Как мы узнаем, учитывается знак в операции или нет?

Это зависит от вида инструкции перехода, в этом случае JB - это переход, который используется после БЕЗЗНАКОВОГО сравнения, для операций с числами СО ЗНАКОМИ будет использоваться переход JL.

Если я сравниваю 0xFFFFFFFF с числом 0x40 в беззнаковом переходе, очевидно, что оно больше, так как это максимальное положительное число, но если это переход, где учитываются знаки, это число будет равно -1 и оно будет меньше значения 0x40.

Чтобы оценить, является ли сравнением знаковым или нет, мы должны рассмотреть следующие условные переход.

449f446c191b3dfd3e0a6b31b9b040e4._.png

Если переход какой-либо из этой таблицы, он оценивается БЕЗ ЗНАКА, в то время как каждый из них имеет свой аналог как JL для JB в таблице переходов СО ЗНАКОМ.

347e2e18fa3015418e0e21cc6b20f101._.png

Мы видим, что JE оценивает равны ли числа в обеих таблицах, потому что в этом случае знак не имеет значения, если они равны, флаг ZF будет активирован и в него будет помещена единица.

Мы также видим, что JG означает переход, если число больше, JG в таблице со знаком имеет свой аналог - JA, который совершает переход если число выше в таблице БЕЗ ЗНАКА.

В ежедневном анализе мы видим слишком много флагов, видим переходы JBи знаем, что это сравнение между положительными числами или числами БЕЗ ЗНАКА и что если первое число меньше второго, то будет осуществлен переход, но хорошо то, что можно видеть, что находится ниже.

Если я продолжу останавливаться на всех BP, я буду видеть, что я нахожусь в цикле, который читает один за одним символы моего имени и сравнивает затем их с числом 0x41, если есть символ ниже этого числа, то покажется сообщение об ошибке, так как я ввел только буквы (ricnar) у нас не будет этого случая, но давайте перезагрузим процесс с помощью TERMINATE PROCESS и запустим с помощью START PROCESS снова и сейчас введем имя 22ricnar, а ключ 98989898.

e5d37f6e38d00a7527ae7b1f9f2d50f6._.png

Нажмём ОК и остановимся на BP.

d3493f0aef5992e1279722116ecc96e4._.png

Мы видим, что сейчас мой первый символ равен 0x32, что соответствует символу 2 слова 22ricnar.

Я вижу, что 0x22 – меньше, чем 0x41, зеленая стрелка активируется и это означает что переход будет выполнен и мы увидим, что флаг C – активирован, потому что 0x32 минус 0x41 - вычитание без учета знака, результат вычитания отрицательный и это - ошибка, которая активирует флаг C.

Если я сделаю правый щелчок на ФЛАГЕ C.

62a77efccd5c2e3428275d9e06a9dba9._.png

Мы можем установить его в ноль.

В этот самый момент, когда мы изменили переход, красная стрелка начинает мигать, потому что мы инвертировали переход.

7abb53ec9d55ef8eeff36a677d964f24._.png

Если мы нажмём RUN отладчик снова остановится, когда сравнит следующие символ 2 из слова 22ricnar и направится в мигающую зеленую стрелку, что приведет нас к сообщению об ошибке, мы инвертируем снова флаг CFпомещая в него 0.

В следующий раз он остановится в этом переходе, что соответствует буквам ricnar, которые больше чем 0x41 и которые не активируют флаг CF и они продолжают до красной стрелке.

После обмана проверки каждого символа моего имени мы переходим к финальному переходу.

d94337a7e85b1b6ce917c5ac3043d692._.png

Здесь он сравнивает EAX и EBX, чтобы узнать равны ли они, но это не имеет значения, отладчик включил красную стрелку, потому что они разные и меня отправляют к сообщению об ошибке.

863a3f482a6bb1d17c2ae7a7faccb145._.png

Здесь я вижу, что они не равны, и флаг Z неактивный.

915cd8e9c41aaa538bf26aa463544a30._.png

Если мы активируем его, он будет менять переход и идти на зеленую стрелку в сообщение GOOD BOY, делаем правый щелчок на флаге ZF и выбираем INCREMENT VALUE.

228307d53538b32981a3caaf5cc4d97d._.png

c23d787718dba166f6c335c1dd5f90ed._.png

Мы сделали то же самое, что и когда мы пропатчили код, но не делая никаких изменений, а просто только меняя флаги в ОТЛАДЧИКЕ.

Каждый раз, когда мы не хотим инвертировать переходы напрямую, мы идём в хороший блок где мы хотим продолжать и помещаем там курсор и делаем правый клик, хотя в IDA 6.8 присутствует БАГ, которая был устранён в версии 6.9, который возникает при правый клике рушится IDA если это случится с вами, найдите ярлык который вам нужен по следующей ссылке:

Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!


А в самой IDA идём в OPTIONS → SHORTCUTS.

Если у нас есть проблемы, когда мы щелкаем правой кнопкой мыши, чтобы установить EIP поместите курсор туда, куда Вы хотите перейти, например 0x40124C и нажмите сочетание CTRL + N что является командой SET IP.

f85a81810a85975ea2d7f5fa5c4045bc._.png

И программа будет продолжена с адреса 0x40124C, что является тем же самым, что и инвертирование флага.


744243e2f7cd2f4fa5383e58ab47b419._.png

До встрече в 11-той главе.
 
  • Лайк
Reactions: n00ba

О нас

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

    Dark-Time 2015 - 2022

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя