Всем привет!

Внимание!
В этом посте рассматривается задача Snake Reversing в HackTheBox. Читайте только в том случае, если вы собираетесь отказаться от попыток.

Эта задача - одна из самых простых в реверсивном движении.
Начнем ...

Загрузите zip-архив с веб-сайта и извлеките его содержимое с паролем, указанным на самом веб-сайте.

Мы видим, что расширение файла - .py, что говорит нам, что он написан на Python. Теперь нажмите на терминал и выполните его следующим образом.

Мы видим, что он генерирует какое-то число и говорит «Требуется аутентификация». И он также просит ввести имя пользователя. Я пробовал змейку, но ошибаюсь: P

Теперь посмотрим на код. Чтобы открыть файл, я использовал редактор vi. Вы можете использовать любой из удобных вам редакторов.

При просмотре кода мое внимание привлекла следующая часть. В нем говорится:
Он считывает данное имя пользователя в переменную с именем user_input, а затем user_input сравнивается с другой переменной с именем slither. Мне очень хотелось узнать, какие данные хранятся в slither, поэтому я добавил фрагмент кода, выделенный ниже. :П

Сохраните код и запустите его в терминале.

Вот и все. Имя пользователя - anaconda.
Теперь следующая часть: он запрашивает пароль, и я попробовал случайный пароль, который снова оказался неправильным. : D

Вернемся к коду и посмотрим, что мы можем там сделать.

Часть кода считывает пароль пользователя в переменную pass_input. Теперь есть цикл, в котором берется pass_input
то есть для проходов в pass_input:

Внутри есть еще один цикл, который требует брать каждый элемент в каждом индексе.
т.е. for char in chars:

Первый цикл for, т. е. для проходов в pass_input, будет принимать каждый символ из пароля, указанного в качестве входных данных, а второй цикл for будет принимать каждый элемент из массива chars.
Каждый элемент из массива chars предположительно кодов ASCII преобразованы в соответствующие символы:
str (chr (char))

Каждый из этих символов сравнивается с каждым символом пароля, заданным в качестве входных данных. И мы должным образом заметили, что есть оператор break, который прерывает цикл и выводит «Good Job», даже если один символ соответствует введенным пользователем данным.

Как получить пароль ?????????????

Один из способов - ввести все возможные символы и подождать, пока один из них не попадет. : D Это просто наивная грубая сила, никогда не доставляет удовольствия.

Давай поиграемся с кодом. Мы видим, что каждый элемент из массива chars якобы коды ASCII конвертируются в соответствующие символы. Что, если мы сможем напечатать эти символы заранее. ;)

Поэтому я просто добавил фрагмент кода, выделенный на скриншоте ниже.

А теперь давайте запустим его еще раз и посмотрим, что произойдет.

Вот и все. Распечатаны все возможные пароли. И я попытался ввести ‘u’ в качестве пароля, и он сказал: «Хорошая работа».

Теперь whaaattt ??

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

Итак, давайте откроем код и посмотрим, что еще мы можем найти.
На этот раз я просматривал верхнюю часть кода, которую я предположительно игнорировал до сих пор из-за большого количества преобразований и прочего с множеством переменных, таких как lock, keys, auth, passwords, chain, lock_pick и т. д.

И, перебирая весь этот скучный материал, я обнаружил 2–3 переменных, которые используются повторно. Это ключи, цепочки и символы.
Я также обнаружил, что 2 цикла for во всех элементах ключей и цепочки обрабатываются с помощью некоторых операций (скучный материал) и добавляются в массив chars .

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

Сохраните и запустите.

Мы видим, что напечатан массив некоторых чисел, которые являются кодами ASCII символов, используемых для проверки пароля.

Нет смысла рассматривать это как флаг.

Переменная «keys» меня заинтриговала. Итак, я подумал о том, чтобы узнать, что там внутри. Возможно ключ.

Мы уже знаем, что в нем есть некоторые значения ASCII, поэтому я просто преобразовал их в символы и отобразил их.

В клавишах используются следующие символы.

Теперь в этом есть смысл. Это может быть та часть головоломки, которую мы ищем.

Флаг будет иметь следующий формат: HTB {имя пользователя: ключ}.
Имя пользователя - это имя пользователя, которое мы получили ранее в начале, а ключ - это возможный ключ, который мы напечатали в приведенном выше снимке.

PS: Это моя первая запись. Предложения приветствуются. Скоро появится еще много блогов :)