April 29, 2019

Решение задания на реверс Python {HTB}

https://tele.click/darkside_team

Привет хацкер, сегодня решим простую задачу на реверс программы на пайтон из Hack The Box.

Задание называется Snake

Скрин задания

Качаем архив, запускаем скрипт. Весь скрипт (Python 2.7):

#!/usr/bin/python2.7
import random 
lr = '\x64'
print '''
___________.__              _________             __          
\__   ___/| |__  ____   /  _____/ ____ _____ | | __ ____ 
 |   |  | | \_/ __ \  \_____ \ /   \\__ \ | |/ // __ \ 
 |   |  |  Y \ ___/  /       \  | \/ __ \|   <\ ___/ 
 |____|  |___| /\___ > /_______ /___| (____ /__|_ \\___ >
               \/    \/         \/    \/    \/    \/   \/ 

'''
chains = [0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x72, 0x6f, 0x6c, 0x6c]
db = '\x6e'
ef = '\x63'
chars = []
keys = [0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x21, 0x21]
nn = '\x61'
lock_pick = random.randint(0, 0x3e8)
lock = lock_pick * 2
password = [0x69, 0x74, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x65, 0x61, 0x73, 0x79]
lock = lock + 10
ty = '\x61'
lock = lock / 2
auth = [0x6b, 0x65, 0x65, 0x70, 0x20, 0x74, 0x72, 0x79, 0x69, 0x6e, 0x67]
lock = lock - lock_pick
gh = '\x6e'
print 'The Snake Created by 3XPL017'
print 'Your number is ' + str(lock_pick)
for key in keys:
   keys_encrypt = lock ^ key
   chars.append(keys_encrypt)
for chain in chains:
   chains_encrypt = chain + 0xA
   chars.append(chains_encrypt)
aa = '\x61'
rr = '\x6f'
slither = aa + db + nn + ef + rr + gh + lr + ty
print 'Authentication required'
print ''
user_input = raw_input('Enter your username\n')
if user_input == slither:
   pass

else:
   print 'Wrong username try harder'
   exit()
pass_input = raw_input('Enter your password\n')
for passes in pass_input:
   for char in chars:
       if passes == str(chr(char)):
           print 'Good Job'
           break
       else:
           print 'Wrong password try harder'
           exit(0)
   break

При запуске скрипт генерирует случайное число с помощью random.randint(0, 0x3e8) и выводит в строке "Your number is ...", но это было лишь для отвлечения внимания.

Первым делом я решил решить первую часть - Юзернейм. Проанализировав код, стало понятно, что за юзернейм отвечают эти строки:

А если быть точнее, то переменная slither это и есть наш юзернейм, было множество вариантов как решить первую часть "головоломки", и я придумал самую простую: просто вывести эту переменную на экран!

print '\nU53RN4M3: ' + slither

Запускаем скрипт, смотрим вывод:

Юзернейм - anaconda. Если юзернейм верный, скрипт запросит пароль, что собственно и произошло:

Т.к мы решали лишь первую часть, пароль нам неизвестен. Проанализировав код на функцию пароля нашёл эти строки:

Passes - пароль. Единственная загвоздка в том, что passes - не переменная. Соответственно сделать также, как и с юзернеймом не получится (потому-что пароль можно вывести в консоль, только после его объявления, а объвляется он когда верный, а мы его не знаем, замкнутый круг). Но я придумал довольно хитрую штуку: Вывести пароль при неверном заполнении, то есть ввести любые символы, а после строки "Wrong password try harder" вывести настоящий пароль, потому-что он уже объявлён.

print '\nP455W0RD; ' + str(chr(char))

Запускаем, вводим правильный юзернейм и НЕправильный пасс:

u ? серьёзно?

Видимо серьёзно...

Но на этом мы не останавливаемся, расскажу ещё способы решения этой задачки.

1 вариант.

Просто поменять значение переменной slither, например на D$_Admin, почему нет?

slither = 'D$_Admin'

2 вариант.

В этом варианте подойдёт абсолютно любой юзернейм путём спроса у пользователя:

slither = raw_input('Who?\n')

Было ещё много вариантов решения, но эти самые простые.

Dark $ide - Твоя Тёмная Сторона

Наш чат - Dark Chat | D$

Наш магазин - Dark $tore