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

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

AnGel

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

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
Так как этот курс называется введение с нуля, есть вещи про которые многие уже знают, если Вы один из них, пропустите эту главу если хотите, но большинству они не знакомы, я верю, что это важно, поэтому я добавил эту информацию.

СИСТЕМЫ СЧИСЛЕНИЯ

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

Базовые концепции каждой из системы рассмотрим ниже:

ДВОИЧНАЯ: Числа представляются двумя символами 0 и 1, вот почему она называется ДВОИЧНАЯ.

ДЕСЯТИЧНАЯ: Все числа представляются с помощью 10 символов(от 0 до 9), вот почему она называется ДЕСЯТИЧНАЯ.

ШЕСТНАДЦАТЕРИЧНАЯ: Все числа представляются с помощью символов от 0 до F ( от 0 до 9, далее A, B, C, D, E и F, или 16 символов в итоге).

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

0cbcc1bc0d6e8efaaebc4b6658c16f49._.png

Если я введу, например 0x45, он интерпретирует это как 16-ное число, т.к. в начале стоят символы 0x, мы можем конвертировать из 16-ной в десятичную, одиночным нажатием ENTER.

b697e032358c697fe433b6282f597dc4._.png

Нажимаем

e02f62d642e7a49b3076e0ad59df8102._.png

Это даёт нам 69, что есть 0x45 в 16-ной системе.

Если мы хотим сделать обратное преобразование, то будем использовать функцию hex()

9a67be3c026c263ff530b0a7cc1899e0._.png

Чтобы получить двоичное представление, будем использовать bin()

3fc4f325584aceb0a2043a189e9d2d34._.png
2b4103a1b8be8beb04fe89c228bf0b37._.png

Результат равен 1000101, 0b в начале означает двоичный, также панель может конвертировать из двоичной в десятичную или в 16-ную.

6910798fc6084a65e9a54f10914e0205._.png
8bf2d8b20b694e49681e6eb60c775630._.png

Любое число введенное непосредственно в окно, после нажатия ENTER, покажет результат в десятичной системе, чтобы получить числа в HEX или BIN, будем использовать функции Python hex() или bin().

Для управления такими преобразованиями в IDA есть интегрированный калькулятор, в VIEW - CALCULATOR, он позволяет увидеть преобразованное число во всех системах счисления сразу, и, кроме того, показывает его соответствие символу, если оно есть, в случае c 0x45 – это E.

5ba873bdf358fabbab2888752aa1fbaf._.png

ОТРИЦАТЕЛЬНЫЕ ЧИСЛА В 16-НОМ ПРЕДСТАВЛЕНИИ

Почти всегда, в любой момент времени, мы будем работать в HEX’e, но сейчас вопрос таков, как представляются отрицательные 16-ные числа в 32-битной системе?

В 32-битных двоичных числах мы будем использовать первый бит, который означает следующее, если он равен 0, то число положительное и если равен 1, то число отрицательное.

d47a70b4bf76af99aa1f83ec6c482acf._.png

Мы видим, что значение для примера -0x45 в 16-ном виде может быть представлено как 0xffffffbb и что его первый байт равен 1 в двоичной системе.

Таким образом минимальное положительное значение очевидно 0, но какое должно быть наибольшее положительное значение, которое мы можем представить?

b39feb3759db6b770d6db77b7fe6c025._.png

Мы видим, что 0x7fffffff наибольшее положительное, если мы рассмотрим знак, как только мы добавим единицу все остальные биты кроме первого станут равны единице.

Если мы добавим один

c2de003714f6e55ee015213075a0f423._.png

Видим, что первый бит изменился на 1 и все остальные стали равным 0.

Анализатор рассматриваем все числа как положительные, до тех пор, пока мы не добавим знак минус, например.

4b3083e2053e7a058af519cfad2819cb._.png

Мы видим, что минимальное отрицательное значение -1 соответствует 0xFFFFFFFF и максимальное отрицательное значение будет 0x80000000.

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

В то время, если мы рассматриваем в операции знак, то положительные будут от 0x0 до 0x7FFFFFFF и отрицательные будут от 0xFFFFFFFF до 0x80000000.

ПОЛОЖИТЕЛЬНЫЕ

000000000 эквивалентно 0 в десятичной
000000001 эквивалентно 1 в десятичной
………………………………..
………………………………..
7FFFFFFF эквивалентно 2147483647 в десятичной (это будет максимальное положительное число)

ОТРИЦАТЕЛЬНЫЕ

FFFFFFFF эквивалентно -1 в десятичной
FFFFFFFE эквивалентно -2 в десятичной
………………………………
………………………………
80000000 будет равно -2147483648 в десятичной (это будет наибольшее отрицательное число)

104c5d5b2aab3560f43fa7ff01ca7627._.png

СИМВОЛЫ ASCII

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

Далее, в первом столбце мы видим десятичное значение, во втором столбце - шестнадцатеричное значение, и в третьем – символ; если, например, нужно вставить пробел, то следует использовать 0x20 или десятичное 32 и любой необходимый символ, будь то буква или число, который можно увидеть в этой табличке.

Как видим, в калькуляторе, который оценивает выражения, IDA показывает соответствующие символы, как мы видели в случае 0x45E.

a2eea6530405a8ecc4f5222f29f670db._.png
d30f178cefcade025cd105a32629b4e7._.png

Также в строке для Python можно использовать функцию chr()

f5314363390a5d534040522bfc2abea2._.png

В окне HEX DUMP есть колонка, которая показывает все символы.

1377070c90fc5600c3d77453e37f8c77._.png

Здесь мы видим число 45, которое в правой колонке соответствует символу E.

ВОЗМОЖНОСТИ ПОИСКА

Мы видим, пункт SEARCH в меню и если мы в дизассемблере или вкладке IDA-VIEW, мы имеем много опций поиска, которые легко интерпретировать.

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

Некоторые опции в следующих рисунках соотв. плагинам добавленных в мою IDA вручную и поэтому Вы не увидите их в загруженном с интернета стандартном установщике .

8142d8bbdc0ee4b3eb80e8c13e48550c._.png

СЛЕДУЮЩИЙ КОД

Будет искать следующую инструкцию, которая интерпретируется как CODE, если эта часть не будет найдена как код, то пропустит её

Search completed. Found at 004011A1.
Search completed. Found at 004011A3.
Search completed. Found at 004011A5.
Search completed. Found at 004011AA.
Search completed. Found at 004011AC.
Search completed. Found at 004011AF.
Search completed. Found at 004011B6.

СЛЕДУЮЩИЕ ДАННЫЕ


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

6cb4c6ce9fc31972afc5efc06e70050e._.png

Как в том случае я ищу двойное слово dword (dd) в адресе, который не соответствует ни одной команде, очевидно, что если мы будем продолжать искать, мы найдем следующие данные, в этом случае они будут под данным разделом, если возобновить поиск.

98f049cc240fb419c7bb4d1c52e807d3._.png

Вижу, что поиск останавливается на адресе, где справа имеется ссылка, соответственно это то место, где ведется работа с данными.

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

Search completed. Found at 00402004.
Search completed. Found at 00402048.


dd60caba46cc31f77ec9c4e4e80b68c4._.png

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

ПОИСК РАСПОЗНАННОГО И НЕ РАСПОЗНАННОГО

Первый пропустит для кода или обнаруженных данных и второй для зон не обнаруженный как допустимый код или данные.

77cf9364ddcd468dae08728064ca516e._.png

Область с нулями, которая находится в 0x402000, найдена с помощью SEARCH UNEXPLORED.

Search completed. Found at 00402000.
Search completed. Found at 00402000.
Search completed. Found at 00402001.
Search completed. Found at 00402001.
Search completed. Found at 00402002.
Search completed. Found at 00402003.
Search completed. Found at 00402008


Повторяя, видим, что поиск охватывает данные 0x402004, так что они считаются обнаруженными (EXPLORED).

ПОИСК НЕПОСРЕДСТВЕННОГО ЗНАЧЕНИЯ – ПОИСК СЛЕДУЮЩЕГО НЕПОСРЕДСТВЕННОГО ЗНАЧЕНИЯ

Мы будем искать константу, которую мы писали между инструкциями и данными.

c48302369d33a08365dc289805d1a000._.png

Если мы выберем FIND ALL OCURRENCES мы будем искать всё и для того, чтобы не просматривать их один за другим, можно использовать SEARCH NEXT INMEDIATE VALUE

dcce7b6124a16af79c50aa92bc0e52ff._.png

ПОИСК ТЕКСТА – ПОИСК СЛЕДУЮЩЕГО ВХОЖДЕНИЯ ТЕКСТА

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

f7ec0169d71535d88f9fd78a86abd99c._.png
a10fe35c7da7576046060b81a8e39467._.png

Если нужно найти только одно, то используем SEARCH NEXT TEXT, чтобы найти конкретный текст.

ПОИСК ПОСЛЕДОВАТЕЛЬНОСТИ БАЙТ

cbfa4b03b3bcb00e59056456608490d8._.png

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

38320231984dec80b0983d71d3760607._.png

Если мы сделаем двойной щелчок на пером из них для примера.

В опциях IDA отметим 6 для того, чтобы отобразилось, например, максимум только 6 байт соответствующих каждой команде.

246bcb100340781fd9d15ee77c8e2601._.png

Мы видим, что нашлись байты 90 90, чего мы и хотели.

eb5a6e7eaa6c9045c0f07e094e626e16._.png

ПОИСК НЕ СОВСЕМ ФУНКЦИЙ

Он ищет до следующего адреса, где находит что-то неразобранное как выполненная функция.

Search completed. Found at 004013D7.

2d618575907d8dc058084a0dc7c1928c._.png

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

Это наиболее важные функции поиска в меню IDA, конечно, когда есть возможность работать со скриптами Python, всегда можно увеличить возможности с помощью нескольких строк кода.

Мы видим, что каждый поиск, который мы осуществляем, не теряется – открывается новая вкладка с результатом и всегда остается там до того момента, пока мы сами ее не закроем.

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

До встрече в главе 3

Рикардо Нарваха
Перевод на английский - @IvinsonCLS
Перевод на русский — Яша_Добрый_Хакер
Перевод специально для форума системного и низкоуровневого программирования - WASM.IN
17.02.2017
 
  • Лайк
Reactions: _k0NsuL

О нас

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

    Dark-Time 2015 - 2022

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

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

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