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

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

AnGel

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

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
Перед тем как продолжить, давайте посмотрим сможем ли мы убрать баг, который присутствует в IDA версии 6.8, и который был исправлен в версии 6.9, и которой у нас нет :”( , чтобы увидеть присутствует ли у нас этот БАГ, откройте IDA, и на любой инструкции нажмите ALT + M, что равносильно размещению метки (JUMP → MARK POSITION), а затем на той же инструкции сделайте правый щелчок.

de27d21f09973990f8a899d16707b50f._.png

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

343445d5db3d83835b977664e6d2dedc._.png

Давайте сперва найдём файл IDA.WLL и откроем его с помощью HEXредактора, например такого как HXD, с правами администратора.

0ccf0fd7f099717ab633eb45a254db45._.png

Мы меняем байты 80 3D по смещению 0x3C3F6 на байты EB 30.

31246f71749060d19deef56cc637e3e8._.png

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

Другой файл это файл IDA64.WLL и мы делаем с ним то же самое, только теперь по адресу 0x41606 байты 80 3D меняем на байты EB 30.

Давайте посмотрим присутствует ли сейчас наш БАГ.

Мы пробуем туже самую комбинацию ALT + M на инструкции, а затем делаем правый щелчок, VOILA, IDA не падает, я надеюсь, что всё будет продолжать функционировать без побочных эффектов.

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

ФЛАГИ

ФЛАГ ПЕРЕНОСА


Мы уже видели что-то о ФЛАГЕ CARRY в предыдущей главе, он также активируется в операциях с беззнаковыми числами, когда результат отрицательный как в предыдущем случае или превышает в сумме максимальное возможное значение регистра, давайте посмотрим примеры в отладчике.

Если мы запустим CRACKME.EXE в IDA в режиме отладчика, то остановимся на EP и теперь мы изменим инструкцию на ADD EAX, 1.

b72dcc376cc0ca7c3eeff81daecd3e84._.png

Давайте сделаем EAX равным 0xFFFFFFF c помощью щелчка на пункте MODIFY VALUE.

Если блок функции испортится, то мы можем сделать правый щелчок на пункте CREATE FUNCTION в самом начале для того, чтобы всё было в порядке.

И трассируем инструкцию с помощью F8, для того, чтобы она исполнилась, мы видим, что флаг CF активируется когда превышается максимальное возможное значение.

9d1b22da2ff557bd2c3d879141f4024b._.png

То же самое случится, если мы напишем ниже SUB EAX, EDX.

f6cfbfc12479d7745dc3a3746355962d._.png

Мы уже видели, что если уменьшить два положительных значения, то результат будет отрицательный, CF будет активироваться, потому что такое вычитание даёт ошибку.

1beb5060e67b793e49043a89946c4c11._.png

Измените EAX на 0x25, а EDX на 0x40, и трассируем с помощью F8, чтобы видеть как активируется флаг CF.

8e7a1186cfd50468f9e555ab7b43b763._.png

Был активирован флаг CF, чтобы выполнить снова это вычитание, нужно изменить EIP, для этого делаем правый клик и выбираем - SET IP на инструкции SUB EAX, EDX и меняем EAX на 0x100.

2ba4e8f7c6cca1728c695cc137ab166e._.png

Я выполняю инструкцию с помощью F8.

61fb376f6b1b58fbe8215b5c48dfe154._.png

Флаг не был активирован. Как общее заключение, мы можем прийти к выводу, если активируется флаг CF в операции с беззнаковыми числами, это означает, что произошла ошибка любого типа.

ФЛАГ ПЕРЕПОЛНЕНИЯ.

Это похоже на предыдущий случай, но только для операций СО ЗНАКАМИ, мы меняем EIP на адрес инструкции ADD EAX,1 и вводим в EAX значение 0x7FFFFFFF.

f3185c9344973b5368f6a9e34765575c._.png

Если нажмём сейчас F8.

ded748ca7eb4cdc3138b98c476326dfc._.png

Мы видим, что был активирован ФЛАГ OVERFLOW, так как в операции со знаком происходит сложение единицы с максимальным положительным числом 0x7FFFFFFF, поэтому результат получился максимально-отрицательным и результат суммы ложный.

be57e7e801b69950b0bfe9c7d5af33d3._.png

Если я вычитаю EAX и EDX с использованием этих значений.

05e2e05644c9bc1eb5bb64986ba3df83._.png

Флаг также активируется, потому что максимальное отрицательное число 0x80000000 минус 0x40 даёт нам очень большое положительное число, а это даёт ошибочный результат операции.

Следовательно, мы можем сделать заключение, что если ФЛАГ OVERFLOWактивирован, это означает, что произошла ошибка при работе с операцией СО ЗНАКОМ.

ФЛАГ ЗНАКА

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

fa12edf4b36529941d202ba14a35911c._.png

0x8000000 + 0x1 находится в диапазоне отрицательных чисел, результат сложения равен 0x8000001, поэтому активируется флаг SF, также мы видим, что флаг OF и флаг CF не активируются, когда нет ошибки в БЕЗЗНАКОВОЙ или ЗНАКОВОЙ операции.

8a83ffa67b017629f9ad72b7cffb7cbf._.png

Очевидно, что когда процессор выполняет инструкцию, которая работает с двумя регистрами, он не знает, ЗНАКОВЫЕ они или НЕ ЗНАКОВЫЕ, но мы знаем это за него, потому что мы видим следующие условные переходы, но процессор не знает об этом, поэтому в любой операции он будет оценивать инструкцию как если бы они были БЕЗ ЗНАКА и СО ЗНАКОМ в одно и тоже время и будет изменять необходимые флаги, поскольку условные переходы зависят от флагов, программа будет смотреть на результат флага CF БЕЗ ЗНАКА или флага OF СО ЗНАКОМ в соответствии с переходом, который существует, если например это JB, что есть переход БЕЗ ЗНАКА то будет учитываться только флаг CF и не будет учитываться флаг OF хотя они оба были изменены.

ФЛАГ НУЛЯ

Он не зависит от знака.

e26eaa2bcaebcb84b0826e30417c8b2e._.png

Он активируется, когда при сравнении (что является внутренним вычитанием) оба члена равны, и когда есть увеличение или уменьшение и результат равен нулю, или при вычитании, результат которого равен нулю.

Мы можем проверить.

7567baa1e26546c619e02a10736dc3bd._.png

Я меняю EAX на значение 0xFFFFFFFF и если я добавлю число 1 к нему, что тогда произойдёт?

0059ce8a1c41a8c1e22d9a166016e525._.png

Мы видим, что активируется флаг ZF так как результат операции нуль и если мы рассмотрим оба регистра как беззнаковые, также будет активирован флаг CF, так как превышено максимальное положительное значение, а флаг OF не будет активирован, потому что если оба регистра
ЗНАКОВЫЕ, то -1 + 1 даёт нам нуль и нет никаких ошибок, также флаг SFне был активирован, так как результат не был отрицательным.

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

17e9a914caeda57cf3c9c09801412dca._.png

Я меняю инструкцию так, чтобы получилась инструкция SUB EAX, EDX и ниже пишу инструкцию JB 0x401018.

a99417f825cd2fb05898f4acc3922e4c._.png

Я делаю EAX равным 0x40, а EDX равным 0x2 и исполняю инструкцию SUBс помощью F8.

Красная стрелка начинает мигать, потому что EAX больше чем EDX, следовательно переход не будет выполнен, но давайте посмотрим на флаги.

49d76ac4e27136699ecf43d89aec9bcd._.png

f0140365912fa18d7ef340b1f175454e._.png

JB это БЕЗЗНАКОВЫЙ переход и он сработает если ФЛАГ CF активирован, так как флаг не был активирован, потому что операция была правильная между двумя положительными числами и результат оказался положительный, это означает, что первый операнд больше чем второй, следовательно, переход не произойдёт.

d6a251a331ae4d29e6fe74b04de76f2a._.png

Но если мы изменим EAX на 0x40, а EDX на 0x80 и я снова повторю вычитание.

5c68a80078d8f21b5d1266cf667a83ed._.png
407c51f92f748f497f1a274da11b6136._.png

В этом случае, поскольку EAX меньше чем EDX, переход не будет совершен, но будет совершен переход на зеленую стрелку.

2dc6ce45ded519a246d670e4684bbe6d._.png

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

Также активируется флаг SF, потому что получается отрицательный результат и флаг OF не активируется, потому что оба значения БЕЗЗНАКОВЫЕ, операция не выдаст такую ошибку, и 0x400x80 даёт отрицательный результат.

c9462e326645798186e8ca751b35b0f8._.png

Переход JB зависит от состоянием флаг CF, но если я изменю его на JL.

8aa5fa7e2d9bc8141cc552f3d8c20d58._.png

В этом случае он изменяется и идёт на зелёную стрелку, потому что первое значение меньше чем второе, но на какой флаг смотрит переход JL?

150e7f164cb8f31fd6997ebd7ab312ac._.png

Мы видим, что переход JL сработает, если флаг SF не будет равен нулю, а в нашем случае он равен единице, поэтому он также не будет совершать переход, что логично, так как первый член меньше чем второй и инструкция SUB похожа на инструкцию сравнения CMP, только она сохраняет результат в отличие от CMP, таким образом если первый член меньше чем второй, то будет осуществлён переход.

Вывод этой главы заключается в том, что нет необходимости смотреть на флаги, чтобы узнать, что произойдет в условном переходе, это принадлежит внутренней функции, нам просто нужно знать, что если значения регистров равны JZ будет переходить, если значение регистра меньше и без знака, он будет переходить если это переход JB, если значение регистра меньше и со знаком, то будет переходить если это JL и так далее. Нам просто нужно смотреть третий столбец в знаковой и беззнаковой таблице, но хорошо изучить эти вещи более подробно.

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

О нас

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

    Dark-Time 2015 - 2022

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

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

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