Введение в крэкинг с нуля, используя OllyDbg - Глава 3

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

AnGel

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

AnGel

Администратор
Команда форума
27 Авг 2015
3,413
2,025
Что такое регистры и для чего они предназначаются

Для чего же нужны регистры и что это такое?

Процессору нужны помощники для выполнения программ. Таковыми и являются регистры: когда необходимо выполнить какую-либо инструкцию, например, которая складывает содержимое двух ячеек памяти, процессору нужно разместить содержимое одной из них в регистре, а затем сложить то, что в нём находится с содержимым другой ячейки. Это один из примеров использования регистров.

ESP указывает на самое верхнее значение стека, посмотрим это на примере крэкми от Cruehead’а.

2d5cbfc0f1e3c08c3ccae294568a0448.jpg

ESP равняется 12FFC4, и если посмотрим в OllyDbg на стек,

140ee68eb9b398b418a4cb3094ba14d6.jpg

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

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

06a41132745c180fbee3d95a2d4611e6.jpg

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

12a8fe16237317352f8a81e0c666ce99.jpg

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

c4abe1f9ef7af27001b740f2012ce8c9.jpg

Теперь EIP равен 401002, и в листинге видим, что первая инструкция выполнилась и находимся сейчас на второй.

20cf459627d51821ff2aaa4f12301cb9.jpg

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

Вспомним, где OllyDbg показывает значения регистров:

c9cb849dc6737d6b761dd88e6af54a06.jpg

Взгланув туда, узнаём, что существуют EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI y EIP.

Они называются 32-х битными регистрами.

OllyDbg отображает их содержимое в шестнадцатеричной форме. Например, минимальное значение EAX может быть равно 00000000, а максимальное – FFFFFFFF, что в двоичной системе счисления будет 11111111111111111111111111111111.

2e76fc4a6425c03d215838c70e52f54c.jpg

24f55839dee03267d5601969a304811e.jpg

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

В ассемблере можно обращаться к частям этих 32-х битных регистров.

Рассмотрим пример работы с регистрами, чтобы немного попрактиковаться в OllyDbg.

Изменим значение EAX на то, которое нужно нам, в данном случае это 12345678. Открываем OllyDbg, где загружен крэкми Cruehead’а (хотя там может быть и что-то другое).

147ad65e0b6b254a65ff088ef5ee50cb.jpg

В открывшемся окне пишем в поле “Hexdecimal” 12345678.

81ec5394dcb4f6e93dcb23af84e904d5.jpg

Вот так:

bbd0a668b977fc7ab46e2d16f84f19af.jpg

Потом нажимаем OK.

dab0bee3812e5108befca41deb02344f.jpg

Видимо, что теперь в регистре нужное значение. OllyDbg выделяет изменённые значения красным цветом.

При желании можно использовать часть EAX, в данном случае AX будет 16-ти битным регистром, например, в примере выше в нём будет находится 5678, в чём можно убедиться, напечатав в Command Bar

? AX (знак вопроса также служит для нахождения значения выражения или регистра).

e9a0d87a12e81ab63e7894432f46de44.jpg

После нажатия клавиши ENTER.

01d589a5bc35d836504715d322e0175f.jpg

видим пресловутые 5678, т.е. AX содержит последние четыре цифры EAX. Также существуют AL и AH, значения которых также можно посмотреть в OllyDbg.

? AL

eb691d04e8b604a2a1892bc37e2fcbdc.jpg

? AH

38614b1e8b1f2d289190b3ae3f4b062c.jpg

Или если EAX = 12345678, то AX – это последние 4 цифры.

6d0512c89e62ed48cfa769732cfc3222.jpg

AH – это 5 и 6 цифры, а AL – это две последние.

3312e8a6cab741971375ee950b1a4829.jpg

Таким же образом EBX делится на BX, BH и BL, равно как подобное деление существует и почти для всех остальных регистров.

Как изменить значение регистров

Как мы увидели, в OllyDbg можно изменять значения регистров. Всё, что мы сделали с регистром EAX применимо и к другим регистрам: отметьте регистр, значение которого вы хотите изменить, затем кликните по правой кнопке и нажмите “Modify”. Единственное исключение - это EIP, указывающий на инструкцию, которая должна выполнится.

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

c3cc6dfe5426e515d163ff532edb36e9.jpg

После того, как отметили, например, 40101A, кликаем правую кнопку мыши -> “New origin here”, и EIP изменится на 40101A, и таким образом, программа продолжит выполнение именно с этго места.

446e43573eeca446eb990b6e4e7c8d79.jpg

Как видим, EIP содержит 40101A.

740c5caa8de525dabdd6015c46dda9f5.jpg

Что такое флаги?

Как мы увидели в первой главе, в OllyDbg под регистрами находятся флаги.

29ac298b4f73bbd2423eb505575ad3d6.jpg

Видим, что флаги бывают C P A Z S T D y O.

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

Мы собираем рассмотреть следующие флаги:

i) Флаг «O» или флаг переполнения

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

Рассмотрим в OllyDbg следующий пример, как обычно используя крэкми Cruehead’а.

Меняем таким же, как и раньше, образом значение EAX на 7FFFFFFF, которое является максимальным положительным.

16b66b9704b36fd576fd62f7dddca741.jpg

Теперь прибавим 1, из-за чего сумма превысит максимальное позитивное число, потому что, как мы знаем, 80000000 соответствует числу отрицательному.

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

7bc677b9f19afb67789eea98572c101b.jpg

В нём пишем ADD EAX, 1.

2bce7e61a0db7740e04b58a0ae4960c6.jpg

После нажатия на кнопку “ASSEMBLE” увидим, что инструкция по адресу 401000 изменится на ту, которая была введена.

07f396c0fcda74cd184c336409be9199.jpg

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

До выполнения этой строки с помощью F7 флаг “O” равен нулю.

6797ab05ad2f6f07caa0b83ded2c70fc.jpg

Если выполнить данную строку с помощью F7, чтобы увидеть, что произойдёт, то в EAX окажется 80000000 и знак числа будет изменён.

Флаг “O” станет активным и будет показывать 1, то есть, что результат выполненной инструкции превзошёл максимально возможный результат. Назначения этого флага – показывать, когда это происходит.

106fd012afb9b89ecef586a107914837.jpg

ii) Флаг “A” или дополнительный флаг переноса.

Имеет схожее назначение при выполнении операция с другими форматом, поэтому сейчас он нам не интересен.

iii) Флаг “P” или флаг чётности

Данный флаг активируется, когда результат выполнения инструкция в двоичной форме содержит чётное количество единиц, например, 1010, 1100 или 1111000.

Чтобы опробовать его, у нас уже есть заданная в OllyDbg инструкция “ADD EAX, 1”, и что выполнить это строку снова, выделим строку 401000, кликнем правую кнопку мыши и выберем “New orgin here”, чтобы вернуться назад, и теперь, если нажмём F7, выполнится инструкция, которую мы задали – “ADD EAX, 1”.

d081c3635b88b1cd6a52cc9870411349.jpg

Сейчас у нас в EAX содержится значения 00000000, а флаг “P” равен 1 (как результат выполнения предыдущей инструкции), посмотрим, что случится, когда прибавим к EAX 1.

Нажимаем F7.

ffd1081ca2cc6d1173fd356279e0ac4d.jpg

Видим, что “P” стал равен 0, так как результат, содержащийся в EAX, равен в двоичной форме 1, что в двоичной форме содержит всего лишь одну единицу, то есть нечётное количество.

И снова кликаем на “ADD EAX, 1”, а потом правой кнопкой мыши и выбираем “New origin here”, чтобы снова прибавить 1. Нажимаем F7.

f69bea0655602e893542ca1c5c1c4392.jpg

Видим, что в EAX, содержавшем прежде значение 1, теперь находится 2, что в двоичной форме равно 10. Число единиц опять нечётно и флаг “P” неактивен. Повторим процесс с прибавлением единицы ещё раз.

5a6a9e5eeccb9ace2cd3d50505d0218c.jpg

Теперь в EAX содержится значение 3, что в двоичной форме равно 11, и сейчас результат содержит чётное количество единиц, а флаг чётности стал активен.

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

iv) Флаг “Z” или флаг нуля

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

Вернёмся к нашей инструкции “ADD EAX, 1” по адресу 401000 (клик правой кнопкой мыши – “New origin here”), но сделаем значение EAX равным FFFFFFFF, что равно десятиричному -1, поэтому когда нажмём F7 и запустим “ADD EAX, 1”, результатом -1 + 1 будет ноль и флаг “Z” должен стать активным.

Видим, что после нажатия F7 EAX содержит ноль, а раз результат – ноль, то флаг Z активен и равен 1.

e4f314cf604287fed8bc854a4f3503f1.jpg

97cb2f43e06a0cbf5d6c51fc7a3c46c6.jpg

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

v) Флаг “S” или флаг знака

Этот флаг равен 1, когда результат операции отрицателен. Что посмотреть его в действии, изменим занчение EAX на FFFFFFF8, что равно -8 в десятиричной форме.

354f705ac4f0f277ba10ebf8366ad5ae.jpg

С помощью “New origin here” и кнопки А7 можно снова выполнить “ADD EAX, 1”. Результатом будет FFFFFFF9, то есть -7 в десятиричной форме, которое является отрицательным числом, поэтому флаг знака должен стать активным.

23f89226ceefe4c4c66abeec47b210fb.jpg

Нажимаем F7 и после выполнения инструкции активируется флаг “S”, который теперь равен 1, то есть ясно, что отрицательный результат его активирует.

vi) Флаг “C” или флаг переноса

Активен, когда превышается максимальное значение, которое может содержать регистр, например, если поместим в EAX значение FFFFFFFF и прибавим 1, то увидим, что флаг переноса стал равен 1.

417c3f01308c092317a15818648d58e8.jpg

vii) Флаги T, D и I

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

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

Если вам ещё что-то осталось непонятным, попрактикуйтесь в изменении значений флагов с помощью использованной нами инструкции “ADD EAX, 1”, а затем переходите к следующей части данного «Введения...»

Очень важно, чтобы вы поняли основую суть, так что не колебайтесь попрактиковаться и пееречитать этот материал ещё раз.
 
  • Лайк
Reactions: Gl.Korolb

О нас

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

    Dark-Time 2015 - 2024

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

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

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