Writeup: CrackMe (by @VX_RET)

Don Reverso

Green Team
05.07.2024
14
37
BIT
323
  • ЯП: C
  • Тип: Native / x86
  • Защита: UPX[Latest]
  • Сложность: 4/10 (субъективно)
  • Задача: Распаковка + Написание Кейгена
  • Автор: @VX_RET
  • Хотите сами решить - во вложениях лежит zip. Пароль: rev_time

Примечание автора:
- Простой крякми написанный на C, скомпилированный при помощи tcc, и упакованный Upx'ом, задача состоит в том чтобы распаковать программу и изучив внутренний алгоритм генерации ключей и написать кейген.

Важное-замечание: при решении данной задачи запрешается патч и использование upx'а для автоматического снятия пакера.
(Попробуйте сами снять — это не сложно. При помощи отладчика x96dbg).

Штош, раз автор говорит, значитъ, будем делать.
По традиции, сначала попытаем удачу:

1720469085105.png


А теперь немного теории:
Упаковщик UPX работает следующим образом: в исполняемом файле создаются три секции: UPX0, UPX1 и UPX2. Первая, обычно, заполняется нулями - туда пакер будет распаковывать исходный код программы. Entrypoint указывает на UPX1, ибо там находится код, занимающийся распаковкой.

1720459281312.png
1720459287083.png


Поэтому наша задача состоит в том, чтобы отыскать OEP (Original Entry Point - энтрипоинт в распакованный код), и сдампить это дело в отдельный бинарь. Для этого воспользуемся x96dbg (дебаггер) и модулем Scylla (для дампа)

Обычно UPX оставляет где-то в коде инструкцию popad, а затем после неё идёт прыжок в секцию UPX0 - этот адрес прыжка и будет нашим OEP. Для того, чтобы отыскать этот адрес, x96dbg любезно автоматически ставит брейкпоинты на pushad - можно посмотреть, после какого из таких брейкпоинтов в UPX0 вместо нулей объявляется код, и перед этим брейкпоинтом поискать popad. В x96dbg есть удобная функция поиска с текущего места - этим мы и воспользуемся (поиск выполнялся после первого автоматического брейкпоинта).

1720464397919.png


А поиск выдаёт один-единственный вариант:

1720464454455.png


И если мы перейдём по этому адресу, то и наткнёмся на следующий после popad jmp с искомым OEP:

1720464601587.png


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

1720464752195.png


Удостоверьтесь, что OEP в одноимённом поле такой же, как у jmp. Если всё правильно, то нам нужно найти таблицу импортов и сами импорты - это кнопки IAT Autosearch и Get Imports соответственно.

1720464922994.png


После того, как всё найдено - можно делать дамп. Но при этом получившийся бинарь у вас так просто запустить не получится - нужно будет пофиксить оффсеты в получившейся таблице импортов. Но для этого есть кнопка "Fix Dump".


1720465067685.png


И теперь, после всех этих манипуляций на выходе мы имеем исходный бинарь, который можно ковырять, как вам угодно. А нам угодно открыть его в IDA для статического анализа (переменные я переименовал для наглядности):


1720465342021.png


Здесь же до банального просто - ввод логина, серийника, и последний сравнивается с каким-то, который мелькает в strange_func. Возможно, раз в неё передаётся логин, то он там и генерируется? Заглянем внутрь!

1720465517817.png


А внутри нас ждёт тривиальная функция генерации серийника: каждый символ логина ксорится с 0x42. Для этого можно написать кейген за 3 минуты! Единственное - нам бы ограничиться в логине символами [a-zA-z0-9] для того, чтобы в получившемся серийнике не было стрёмных ASCII-символов.

Python:
login = list(input("pick any login u like [a-zA-Z0-9]: >> "))
print("Serial: >> ", end="")
for i in login:
        print(chr(ord(i) ^ 0x42), end="")
print()

Пробуем:

1720465867726.png


Получилось! Наша задача - распаковка + кейген - выполнена! Надеюсь, этот небольшой райтап помог вам в нашей нелёгкой стезе.

Удачного ревёрса!

made 4 @rev_with_da_boys
 

Вложения

  • 1720464825787.png
    1720464825787.png
    12,5 КБ · Просмотры: 32
  • 1720464903162.png
    1720464903162.png
    15,1 КБ · Просмотры: 31
  • crackme.zip
    3,2 КБ · Просмотры: 40
Мы в соцсетях:

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