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

NullX

Участник
Клуб
Студент
Регистрация
30.06.18
Сообщения
141
Лучшие ответы
0
Реакции
320
Баллы
12
Нажав стрелку назад, я возвращаюсь к точке входа, где я был раньше.

19.png


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

20.png


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

21.png


22.png


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

23.png


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

24.png


Нажимаем OK.

25.png


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

26.png


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

27.png


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

28.png


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

29.png


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

30.png


31.png


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

32.png


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

33.png


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

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

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

34.png


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

35.png


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

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

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

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

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

36.png


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

37.png


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

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

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

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

38.png


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

39.png


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

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

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

40.png


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

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

41.png


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

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

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

42.png


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

43.png


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

44.png


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

45.png


46.png


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

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

https://www.hex-rays.com/products/ida/support/freefiles/IDA_Pro_Shortcuts.pdf

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

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

47.png


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


48.png


До встрече в 11-той главе.
 
Сверху