Предисловие

Привет всем!

Википедия сказал(а):
Обратная разработка (обратное проектирование, обратный инжиниринг, реверс-инжиниринг; англ. reverse engineering) — исследование некоторого готового устройства или программы, а также документации на него с целью понять принцип его работы; например, чтобы обнаружить недокументированные возможности (в том числе программные закладки), сделать изменение или воспроизвести устройство, программу или иной объект с аналогичными функциями, но без прямого копирования.

rev.png

Недавно решился окунуться в это глубокое море реверса, Linux стоит, как основная OS. Первым делом попробовал установить IDA Pro через wine. Успешно, но local debugger не был найден. Спустя некоторое время было понятно одно - нужна винда. На windows переходить не хотелось. Привык уже к linux. Необходимо ставить Windows на Virtual Box. Загрузка , установка - ну, вроде живое.
В ближайшем будущем, собираюсь установить FLARE-VM ради более удобной работы.
Так, это план:
  • Ассемблер, ассемблер, ассемблер.
  • IDA Pro
  • Keygen
Ассемблер, ассемблер, ассемблер

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

MOV:
Код:
Mov приемник, источник
Эта команда используется для копирования значения из приёмника в источник.

CMP (CoMPare operands — сравнить операнды):
Код:
cmp операнд1, операнд2
Для сравнения операндов используется вычитание (это полезно при изучении изучая команды jcc), значения операндов не меняются. Обычно используется для организации условных переходов с командами jmp и jcc (jcc).

JMP (JuMP — прыгнуть, мгновенно перейти):
Код:
jmp метка
Продолжить выполнение кода с указанной метки.

JCC (Jump if conditions — перепрыгнуть, перейти если выполняется условие):
Код:
jcc метка

Переход к указанной метке выполняется при осуществлении определённого условия. Разновидностей этой команды много: ja,je,jl,jna jz,jpe и т.д. Команда проверяет состояние флагов и если условие выполняется, осуществляет переход к метке. Часто в проверки лицензий, ключей и т.д используется JZ (Jump if Zero. Прыгнуть, если значение 0.) или JNE (Jump if Not Zero. Прыгнуть, если значение не 0.). JZ проверяет значение флага ZF (флаг нуля). Программа выполнила действие, в результате которого получилось 0. Теперь ZF=1. Допустим следующая инструкция:
Код:
JZ final
Программа будет выполняться с того места, которое программист пометил как final.

Push:


Команда push заносит значение в стек, а pop забирает значение из стека. .

Логические команды и флаги ассемблера

Основные логические команды двоичной алгебры AND (И), OR (ИЛИ), XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ) и NOT (НЕ). В системе команд процессоров семейства x86 предусмотрены команды AND, OR, XOR, NOT, TEST и ВT, выполняющие перечисленные булевы операции между байтами, словами и двойными словами.

Proc_command_table.png

Команды могут влиять на состояние флагов процессора. Эти флажки находятся в регистре флагов. Регистр флагов содержит различные биты, отражающие текущее состояние процессора. После выполнения арифметических и логических команд процессор может поменять или установить новое значение флагов. Например флаги нуля (ZF), переноса (CF), знака (ZF) и др.

Взял из про ассемблер список флагов.

CF — флаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита или если требуется заем (при вычитании), иначе устанавливается в 0. Например, после сложения слова 0FFFFh и 1, если регистр, в который надо поместить результат, — слово, в него будет записано 0000h и флаг CF = 1.
PF — флаг четности. Устанавливается в 1, если младший байт результата предыдущей команды содержит четное число бит, равных 1; устанавливается в 0, если число единичных бит нечетное. (Это не то же самое, что делимость на два. Число делится на два без остатка, если его самый младший бит равен нулю, и не делится, если он равен 1.)
AF — флаг полупереноса или вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос (или заем) из третьего бита в четвертый. Этот флаг используется автоматически командами двоично-десятичной коррекции.
ZF — флаг нуля. Устанавливается в 1, если результат предыдущей команды — ноль.
SF — флаг знака. Этот флаг всегда равен старшему биту результата.
TF — флаг ловушки. Этот флаг был предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в 1 приводит к тому, что после выполнения каждой команды программы управление временно передается отладчику (вызывается прерывание 1 — см. описание команды INT).
IF — флаг прерываний. Установка этого флага в 1 приводит к тому, что процессор перестает обрабатывать прерывания от внешних устройств (см. описание команды INT). Обычно его устанавливают на короткое время для выполнения критических участков кода.
DF — флаг направления. Этот флаг контроллирует поведение команд обработки строк — когда он установлен в 1, строки обрабатываются в сторону уменьшения адресов, а когда DF = 0 — наоборот.
OF — флаг переполнения. Этот флаг устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице (то есть отрицательное) и наоборот.

В разбираемом crackme используется команда XOR. Разберём подробнее. Например у нас есть 2 пары битов X (получатель) и Y (источник). Их значение может быть 0 или 1. Вот результаты выполнения XOR с разными значениями битов.

XOR.png

После выполнения команды XOR значение заноситься в получателя (X).


Дизассмеблируй, IDA Pro
Ссылка на .
Перед запуском IDA Pro нужно осмотреть пациента.

crackme_1.png

Обычная программа. Есть функция Registr в меню Help. При неправильной регистрации, видим.

crackme_2.png

Запускаем IDA. Нажимаем New, затем Portable Executable. Видео про PE файл.

start_1.png


start_2.png

IDA_1.png


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

У нас слишком много данных. Необходимо за что-нибудь зацепиться. Давайте зацепимся за строку "No luck there, mate!", которая возникает при неправильной регистрации. Нажимаем Alt+B. Вводим "No luck there, mate!" и нажимаем OK.

IDA_2.png

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

IDA_3.png

Мы внутри функции sub_401362. Выделяем её и жмём X, тыкаем OK.

IDA_4.png

Сменим название функции sub_401362 на fail. Выделяем и жмём N. Для удобства, я буду переименовывать некоторые функции. Осмотрев всю карту программы, вернёмся к функции fail. Зелёная и красная стрелочка — это пути по которым программа может выполнить код. Команда JZ помогает в этом выборе.

IDA_5.png

Для удобства я добавил комментарий Good work. Нажимаем на то место, где хотите поставить комментарий и жмём ;

IDA_7.png

Зайдём внутрь функции test_1. Чтобы выйти из функции нажмите ESC. Внутри функции test_1 видим следующую картину.

IDA_8.png

Это проверка на валидность входной строки. Берётся одна из букв строки, которую мы ввели в поле для регистрации. Она помещается в al:
Код:
mov al, [esi]
.
Дальше al сравнивается c 41h:
Код:
cmp al 41h
( 41h - это буква A) (цифра 1 на скриншоте). Начиная с 41h и далее идут буквы и иные знаки в таблице кодировки. Для перевода строк из шестнадцатеричного вида в десятичный нажмите H. Ежели число, которые сравнивает программа меньше 41h выводиться "No luck!" (5). Наша буква больше A. Затем она сравнивается с 5Ah (Z) (2). И так далее по этому циклу проверяются последующие буквы (4). По окончанию данного процесса выполняется блок с функцией sub_40139C (7). Внутри этой функции выполняется сложение всех прежде полученных букв. Стоит обратить внимание на:
Код:
xor edi 5678h
.

IDA_9.png

Запоминаем это число и то, что полученное значение заносится в eax:
Код:
mov eax edi
.
Выходим из функции test_1.

Заходим в функцию test_2.

IDA_10.png

Видим цикл (1-2-3). Можем предположить, это цикл обработки пароля. В этот цикл также передается значение из функции test_1. Здесь мы видим:
Код:
xor edi 1234h
.
Значение заносится в ebx :
Код:
mov ebx edi
.
Выходим из функции test_2. Переименуем эти функции. Теперь мы кое-что поняли.


Выполняется функция login_func, значение заноситься в стек:
Код:
push eax
(1).
Потом выполняется password_func. Значение логина берётся из стека и переносится в eax:
Код:
pop eax
(2).
Следом выполняется сравнение:
Код:
cmp eax ebx
.
Если всё прошло успешно, появляется сообщение "Good work!"

Из всего выше описанного мы поняли алгоритм. Сначала программа складывает коды всех букв, затем делает xor 5678h и в конце ещё раз xor, но уже с 1234h.


Keygen

Пришло время для keygen'а. Для быстрого написания скриптов Python очень хорошо подходит. Алгоритм не сложный. Соответственно и кода будет чуть-чуть:
Python:
#!/usr/bin/python3

import sys

def generate_key(name):
    word = 0
    for letter in name:
        word += ord(letter)
    return word ^ 0x5678 ^ 0x1234

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("Enter a name for registration. (Example: python3 keygen_1.py Alucard)")
        sys.exit(1)
    else:
        print(generate_key(sys.argv[1].upper()))

Код:
sys.argv
из библиотеки sys используется для передачи аргументов командной строки.
Код:
sys.exit(1)
- выход из программы
^ - это XOR.

Проверка работjспособности keygen'а:

final_1.png


final_2.png


final_3.png
 
Последнее редактирование модератором:

ROP

Red Team
27.08.2019
326
660
BIT
141
Спасибо. Вхожу в мир реверса, такие статьи очень помогают.
Сейчас смотрю и вижу, что неудобно повторять действия из статьи.
Я думаю, что в будущем мне стоит писать статьи + видео к ним. Так будет понятнее.
 

ROP

Red Team
27.08.2019
326
660
BIT
141
Ждём продолжение.
Главное не делай резких скачков от простого к сложному.
Постепенно.
Эту статью я написал в 2020 году.
Теперь, я стою перед выбором: писать про решения различных тасков, связанных с бинарными уязвимостями, или про реверс-инжиниринг.
Хочу спросить. О чём лучше начать писать?
 
Последнее редактирование:
  • Нравится
Реакции: a1d3n и mcfly

nks1ck

Green Team
02.11.2020
223
109
BIT
0
Эту статью я написал в 2020 году.
Теперь, я стою перед выбором: писать про решения различных тасков, связанных с бинарными уязвимостями, или про реверс-инжиниринг.
Хочу спросить. О чём лучше начать писать?
reverse
 
  • Нравится
Реакции: ROP

.Method

Well-known member
17.12.2018
255
63
BIT
0
Эту статью я написал в 2020 году.
Теперь, я стою перед выбором: писать про решения различных тасков, связанных с бинарными уязвимостями, или про реверс-инжиниринг.
Хочу спросить. О чём лучше начать писать?
60% на 40% в пользу Ревёрса)
 
  • Нравится
Реакции: ROP

nks1ck

Green Team
02.11.2020
223
109
BIT
0
Эту статью я написал в 2020 году.
Теперь, я стою перед выбором: писать про решения различных тасков, связанных с бинарными уязвимостями, или про реверс-инжиниринг.
Хочу спросить. О чём лучше начать писать?
На самом деле, делай то, что тебе в кайф, так статьи лучше будут.
 
  • Нравится
Реакции: Rev0x1337, a1d3n и ROP

B13

Заблокирован
01.01.2020
412
55
BIT
134
Если будете устанавливать Flare VM, на win7 встанет на ура, но я путем исследований все же пришел к выводу, что лучше на win10 ставить как написано в инструкции по установке FVM, единственное, что там убрали IDA Pro. Если я правильно понял, то local debugger это встроенный в саму IDA, но почему не воспользоваться тем же gdb/edb?

P. S.
Сам просто в Linux в основном работаю.
 
Последнее редактирование:

B13

Заблокирован
01.01.2020
412
55
BIT
134
Эту статью я написал в 2020 году.
Теперь, я стою перед выбором: писать про решения различных тасков, связанных с бинарными уязвимостями, или про реверс-инжиниринг.
Хочу спросить. О чём лучше начать писать?
Раз возник такой вопрос, у меня встречный вопрос. Можете пояснить разницу между?
=> решения различных тасков, связанных с бинарными уязвимостями, или про реверс-инженеринг. ©
 

ROP

Red Team
27.08.2019
326
660
BIT
141
Раз возник такой вопрос, у меня встречный вопрос. Можете пояснить разницу между?
=> решения различных тасков, связанных с бинарными уязвимостями, или про реверс-инженеринг. ©
Если бинарные уязвимости, то это переполнение буфера, Write-Whar-Where и так далее.
Реверс-инжиниринг - это реверси инжиниринг :)
Но пока что немного занят другим :)
 

ROP

Red Team
27.08.2019
326
660
BIT
141
Если будете устанавливать Flare VM, на win7 встанет на ура, но я путем исследований все же пришел к выводу, что лучше на win10 ставить как написано в инструкции по установке FVM, единственное, что там убрали IDA Pro. Если я правильно понял, то local debugger это встроенный в саму IDA, но почему не воспользоваться тем же gdb/edb?

P. S.
Сам просто в Linux в основном работаю.
Для Linux есть отдельная версия IDA. Лучше использовать её.
 

B13

Заблокирован
01.01.2020
412
55
BIT
134
Для Linux есть отдельная версия IDA. Лучше использовать её.
да, это я знаю. Просто на win10 с FVM работал, из объема программ записанных скриптом все равно в пользование будут только те, к которым привык, если конечно не заниматься анализом вредоносов.
 
Последнее редактирование:
  • Нравится
Реакции: ROP

B13

Заблокирован
01.01.2020
412
55
BIT
134
Если бинарные уязвимости, то это переполнение буфера, Write-Whar-Where и так далее.
Реверс-инжиниринг - это реверси инжиниринг :)
Но пока что немного занят другим :)
я как раз изучаю тему бинарных уязвимостей и переполнение буфера, поэтому хотел понять разницу.
 
  • Нравится
Реакции: ROP

tglhteam

One Level
13.10.2022
2
1
BIT
0
Для Linux есть очень интересный дизассемблер GHidra, также в нем есть отладчик. Кстати, Гидра есть и для других осей. Очень хотелось по-больше статей/уроков по реверс-инженерингу.
 
  • Нравится
Реакции: ROP

B13

Заблокирован
01.01.2020
412
55
BIT
134
Для Linux есть очень интересный дизассемблер GHidra, также в нем есть отладчик. Кстати, Гидра есть и для других осей. Очень хотелось по-больше статей/уроков по реверс-инженерингу.
есть инструкция по работе с Ghidra и даже на русском, но данный инструмент отценивается/отценивался как "сырой" по сравнению с IDA Pro, как дела обстоят в данный момент не знаю. И на Linux мало кто реверсом занимается, в основном на Win работают.
 

tglhteam

One Level
13.10.2022
2
1
BIT
0
есть инструкция по работе с Ghidra и даже на русском, но данный инструмент отценивается/отценивался как "сырой" по сравнению с IDA Pro, как дела обстоят в данный момент не знаю. И на Linux мало кто реверсом занимается, в основном на Win работают.
Сейчас GHidra, вроде как, и не совсем сырая. Работает стабильно, ну по крайней мере у меня, на лине)) Ну, а про реверс - да, линь почти не используют, по мне так, зря) Есть пара программ на Linux, которые хотелось бы излечить от чрезмерной жадности)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!