Don Reverso
09.07.2024, 00:03
ЯП: C
Тип: Native / x86
Защита: UPX[Latest]
Сложность: 4/10 (субъективно)
Задача: Распаковка + Написание Кейгена
Автор:@VX_RET
Хотите сами решить - во вложениях лежит zip. Пароль: rev_time
Примечание автора:
- Простой крякми написанный на C, скомпилированный при помощи tcc, и упакованный Upx'ом, задача состоит в том чтобы распаковать программу и изучив внутренний алгоритм генерации ключей и написать кейген.
Важное-замечание: при решении данной задачи запрешается патч и использование upx'а для автоматического снятия пакера.
(Попробуйте сами снять — это не сложно. При помощи отладчика x96dbg).
Штош, раз автор говорит, значитъ, будем делать.
По традиции, сначала попытаем удачу:
https://forum.antichat.xyz/attachments/29112655/1720469085105.png
А теперь немного теории:
Упаковщик UPXработает следующим образом: в исполняемом файле создаются три секции: UPX0, UPX1и UPX2. Первая, обычно, заполняется нулями - туда пакер будет распаковывать исходный код программы. Entrypointуказывает на UPX1, ибо там находится код, занимающийся распаковкой.
https://forum.antichat.xyz/attachments/29112655/1720459281312.png
https://forum.antichat.xyz/attachments/29112655/1720459287083.png
Поэтому наша задача состоит в том, чтобы отыскать OEP(Original Entry Point - энтрипоинт в распакованный код), и сдампить это дело в отдельный бинарь. Для этого воспользуемся x96dbg(дебаггер) и модулем Scylla(для дампа)
Обычно UPXоставляет где-то в коде инструкцию popad, а затем после неё идёт прыжок в секцию UPX0- этот адрес прыжка и будет нашим OEP. Для того, чтобы отыскать этот адрес, x96dbgлюбезно автоматически ставит брейкпоинты на pushad- можно посмотреть, после какого из таких брейкпоинтов в UPX0вместо нулей объявляется код, и перед этим брейкпоинтом поискать popad. В x96dbgесть удобная функция поиска с текущего места - этим мы и воспользуемся (поиск выполнялся после первого автоматического брейкпоинта).
https://forum.antichat.xyz/attachments/29112655/1720464397919.png
А поиск выдаёт один-единственный вариант:
https://forum.antichat.xyz/attachments/29112655/1720464454455.png
И если мы перейдём по этому адресу, то и наткнёмся на следующий после popad jmp с искомым OEP:
https://forum.antichat.xyz/attachments/29112655/1720464601587.png
После же, когда мы выполним jmpпо этому адресу и окажемся уже в исходной программе, нам необходимо её сдампить с помощью модуля Scylla.
https://forum.antichat.xyz/attachments/29112655/1720464752195.png
Удостоверьтесь, что OEPв одноимённом поле такой же, как у jmp. Если всё правильно, то нам нужно найти таблицу импортов и сами импорты - это кнопки IAT Autosearchи Get Importsсоответственно.
https://forum.antichat.xyz/attachments/29112655/1720464922994.png
После того, как всё найдено - можно делать дамп. Но при этом получившийся бинарь у вас так просто запустить не получится - нужно будет пофиксить оффсеты в получившейся таблице импортов. Но для этого есть кнопка "Fix Dump".
https://forum.antichat.xyz/attachments/29112655/1720465067685.png
И теперь, после всех этих манипуляций на выходе мы имеем исходный бинарь, который можно ковырять, как вам угодно. А нам угодно открыть его в IDAдля статического анализа (переменные я переименовал для наглядности):
https://forum.antichat.xyz/attachments/29112655/1720465342021.png
Здесь же до банального просто - ввод логина, серийника, и последний сравнивается с каким-то, который мелькает в strange_func. Возможно, раз в неё передаётся логин, то он там и генерируется? Заглянем внутрь!
https://forum.antichat.xyz/attachments/29112655/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
(
)
Пробуем:
https://forum.antichat.xyz/attachments/29112655/1720465867726.png
Получилось! Наша задача - распаковка + кейген - выполнена! Надеюсь, этот небольшой райтап помог вам в нашей нелёгкой стезе.
Удачного ревёрса!
made 4@rev_with_da_boys
Тип: Native / x86
Защита: UPX[Latest]
Сложность: 4/10 (субъективно)
Задача: Распаковка + Написание Кейгена
Автор:@VX_RET
Хотите сами решить - во вложениях лежит zip. Пароль: rev_time
Примечание автора:
- Простой крякми написанный на C, скомпилированный при помощи tcc, и упакованный Upx'ом, задача состоит в том чтобы распаковать программу и изучив внутренний алгоритм генерации ключей и написать кейген.
Важное-замечание: при решении данной задачи запрешается патч и использование upx'а для автоматического снятия пакера.
(Попробуйте сами снять — это не сложно. При помощи отладчика x96dbg).
Штош, раз автор говорит, значитъ, будем делать.
По традиции, сначала попытаем удачу:
https://forum.antichat.xyz/attachments/29112655/1720469085105.png
А теперь немного теории:
Упаковщик UPXработает следующим образом: в исполняемом файле создаются три секции: UPX0, UPX1и UPX2. Первая, обычно, заполняется нулями - туда пакер будет распаковывать исходный код программы. Entrypointуказывает на UPX1, ибо там находится код, занимающийся распаковкой.
https://forum.antichat.xyz/attachments/29112655/1720459281312.png
https://forum.antichat.xyz/attachments/29112655/1720459287083.png
Поэтому наша задача состоит в том, чтобы отыскать OEP(Original Entry Point - энтрипоинт в распакованный код), и сдампить это дело в отдельный бинарь. Для этого воспользуемся x96dbg(дебаггер) и модулем Scylla(для дампа)
Обычно UPXоставляет где-то в коде инструкцию popad, а затем после неё идёт прыжок в секцию UPX0- этот адрес прыжка и будет нашим OEP. Для того, чтобы отыскать этот адрес, x96dbgлюбезно автоматически ставит брейкпоинты на pushad- можно посмотреть, после какого из таких брейкпоинтов в UPX0вместо нулей объявляется код, и перед этим брейкпоинтом поискать popad. В x96dbgесть удобная функция поиска с текущего места - этим мы и воспользуемся (поиск выполнялся после первого автоматического брейкпоинта).
https://forum.antichat.xyz/attachments/29112655/1720464397919.png
А поиск выдаёт один-единственный вариант:
https://forum.antichat.xyz/attachments/29112655/1720464454455.png
И если мы перейдём по этому адресу, то и наткнёмся на следующий после popad jmp с искомым OEP:
https://forum.antichat.xyz/attachments/29112655/1720464601587.png
После же, когда мы выполним jmpпо этому адресу и окажемся уже в исходной программе, нам необходимо её сдампить с помощью модуля Scylla.
https://forum.antichat.xyz/attachments/29112655/1720464752195.png
Удостоверьтесь, что OEPв одноимённом поле такой же, как у jmp. Если всё правильно, то нам нужно найти таблицу импортов и сами импорты - это кнопки IAT Autosearchи Get Importsсоответственно.
https://forum.antichat.xyz/attachments/29112655/1720464922994.png
После того, как всё найдено - можно делать дамп. Но при этом получившийся бинарь у вас так просто запустить не получится - нужно будет пофиксить оффсеты в получившейся таблице импортов. Но для этого есть кнопка "Fix Dump".
https://forum.antichat.xyz/attachments/29112655/1720465067685.png
И теперь, после всех этих манипуляций на выходе мы имеем исходный бинарь, который можно ковырять, как вам угодно. А нам угодно открыть его в IDAдля статического анализа (переменные я переименовал для наглядности):
https://forum.antichat.xyz/attachments/29112655/1720465342021.png
Здесь же до банального просто - ввод логина, серийника, и последний сравнивается с каким-то, который мелькает в strange_func. Возможно, раз в неё передаётся логин, то он там и генерируется? Заглянем внутрь!
https://forum.antichat.xyz/attachments/29112655/1720465517817.png
А внутри нас ждёт тривиальная функция генерации серийника: каждый символ логина ксорится с 0x42. Для этого можно написать кейген за 3 минуты! Единственное - нам бы ограничиться в логине символами [a-zA-z0-9] для того, чтобы в получившемся серийнике не было стрёмных ASCII-символов.
Python:
login
=
list
(
input
(
"pick any login u like [a-zA-Z0-9]: >> "
)
)
(
"Serial: >> "
,
end
=
""
)
for
i
in
login
:
(
chr
(
ord
(
i
)
^
0x42
)
,
end
=
""
)
(
)
Пробуем:
https://forum.antichat.xyz/attachments/29112655/1720465867726.png
Получилось! Наша задача - распаковка + кейген - выполнена! Надеюсь, этот небольшой райтап помог вам в нашей нелёгкой стезе.
Удачного ревёрса!
made 4@rev_with_da_boys