import requests
from binascii import hexlify, unhexlify

url = 'http://192.168.0.222:5000'

# Any registered username and password
username = 'myBLfLEDraYh3Dq'
password = '9GQLqu39EviKw'

# default comment and any much longer string
original = 'No description yet'
description = 'stringadiversamapiulungastringadiversamapiulungastringa'.encode('ascii')

# do login
s = requests.session()
r = s.post(url + '/login', data={'username': username, 'password': password})

cur_iv = s.cookies['iv']

ciphertext1 = s.cookies['session']

# loop trough 256 requests to obtain a two time pad
for i in range(int(cur_iv), int(cur_iv)+256):
	s.post(url + '/user', data={'description': description})

	if s.cookies['iv'] == cur_iv:
		ciphertext2 = s.cookies['session']

for i in range(0, len(ciphertext1), 2):
	if ciphertext1[i:i+1] != ciphertext2[i:i+1]:
		break

# obtain new cookis with the original comment to flip the fals in true
s.post(url + '/user', data={'description': original})

cur_iv = s.cookies['iv']
uid = s.cookies['uid']

description = description.hex()
ciphertext1 = ciphertext1[i:]
ciphertext2 = ciphertext2[i:i+len(description)]

# xor our known plaintext with the given ciphertext to recover part of the rc4 stream
key = '{:x}'.format(int(ciphertext2, 16) ^ int(description, 16))[0:len(ciphertext1)]
# xor our known rc4 stream with the default comment on the same iteration to decrypt the final parte of the cookie
plaintext = unhexlify('{:x}'.format(int(key, 16) ^ int(ciphertext1, 16)))

# print the plaintext and notice it has a show_flag parameter
print('[*] Decrypted first cookie: ' + plaintext.decode('ascii'))

# xor 'true ' with 'false' to calculate the value to use to flip the ciphertext
flip = '{:x}'.format(int('true '.encode('ascii').hex(), 16) ^ int('false'.encode('ascii').hex(), 16))

cur_session = s.cookies['session']
# xor to obtain 'true ' from false'
flip = '{:x}'.format(int(flip, 16) ^ int(cur_session[-12:-2], 16))
session = cur_session[0:-12] + flip + cur_session[-2:]
# get the flag!
flag = requests.get(url + '/user', cookies={'iv': cur_iv, 'uid': uid, 'session': session})

print('[*] Got the flag: ' + flag.text)
