Решение задания на реверс 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')
Было ещё много вариантов решения, но эти самые простые.