ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.xyz/forumdisplay.php?f=112)
-   -   На венах ЗМЕИНЫЙ УКУС - мне понравился ядовитый вкус. Реверс-инжиниринг, Игры Кодебай (https://forum.antichat.xyz/showthread.php?t=1641740)

AFANX 11.04.2023 22:02

Ку, киберрекруты. Сегодня будет разбор таска с платформы Antichat в разделе Реверс-инжиниринг. Таск является очень простым, поэтому вопросов возникнуть недолжно. Этот таск хорош тем, что дает первоначальные навыки писать кейгены.
Кейген - небольшая программа, которая генерирует: криптографический ключ для шифрования данных, псевдоподлинные CD-ключи или серийные/регистрационные/активационные номера для регистрации/активирования ПО. Однако, в нашем случае немного другой генератор. Это больше дешифратор.

Дано два файла - flag.enc и program.txt. Перейдем к реверсу.

Реверс

program.txt
является кодом написанном на языке Python в виде псевдоассемблерных инструкций. Бегло просмотрев код, можно увидеть такие инструкции:

Код:


Код:

16 LOAD_CONST3 ('ZHEkjgfhdiIR')
18 STORE_FAST2 (key)
....
....
48 BINARY_XOR

Тут в принципе все ясно. Открывается файл, ксорится каждый символ со строкой ZHEkjgfhdiIR и записывается в виде байтов в файл. Таким образом нужно написать декриптор, который будет открывать файл, ксорить байты с ключом ( ибо шифрование симметричное ) и сохранять в файл результат.

Пишем декриптор

Первым делом объявляю ключ и массив, в который будет записан результат. Также открываю файл для чтения байтов:

Python:


Код:

key
=
"ZHEkjgfhdiIR"
flag
=
[
]
with
open
(
'flag.enc'
,
'rb'
)
as
fh
:
content
=
list
(
fh
.
read
(
)
)

Последнее, что необходимо сделать, так это записать результат в новый файл:

Python:


Код:

file_handler
=
open
(
"flag.png"
,
"wb"
)
barray
=
bytearray
(
flag
)
file_handler
.
write
(
barray
)
file_handler
.
close
(
)

Полностью декриптор выглядит так:

Python:


Код:

key
=
"ZHEkjgfhdiIR"
flag
=
[
]
with
open
(
'flag.enc'
,
'rb'
)
as
fh
:
content
=
list
(
fh
.
read
(
)
)
for
i
in
range
(
len
(
content
)
)
:
flag
.
append
(
content
[
i
]
^
ord
(
key
[
i
%
12
]
)
)
file_handler
=
open
(
"flag.png"
,
"wb"
)
barray
=
bytearray
(
flag
)
file_handler
.
write
(
barray
)
file_handler
.
close
(
)

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

yetiraki 15.05.2023 17:46

Спасибо за райтап.

Решал сегодня данную задачу, пришло в голову несколько мыслей

1. Нам неизвестен тип бинарника, можно сделать проверку на магические байты и выбирать нужное расширение для файла, для всех остальных можно .bin сделать, например.
2. Если файл картинка, то можно на него натравливать gocr, я попробовал, но он плохо и не правильно распознал текст, к сожалению. Может быть есть какие другие способы?

M4x 18.01.2025 18:12

Для тех, кто не знаком с языком программирования Python или не проявляет особого интереса к реверс-инжинирингу, существует более простой способ:
  1. Откройте файл flag.enc в инструменте CyberChef.
  2. Выберите рецепт XOR и введите ключ ZHEkjgfhdiIR в соответствующее поле. Почему ключ именно такой - догадаться несложно, учитывая предоставленную подсказку. Не забудьте установить кодировку UTF-8.
  3. После выполнения этих шагов вы увидите сигнатуру PNG, значит, все было сделано правильно. Теперь просто сохраните изображение (Save output to file). На этом изображении будет представлен флаг.


Время: 03:27