Nous utilisons Cutter pour ce challenge.
Voici les fonctions principales du programme fifty-shades-of-white fourni avec la licence license-walter-white-junior.txt :
undefined8 main(int argc, char **argv)
{
int32_t iVar1;
char **var_38h;
uint64_t var_2ch;
void *j;
var_2ch = argc;
if (argc != 2) {
printf("Usage: %s <license.txt>\n", *argv);
exit(1);
}
// Appel de la fonction parse ci-dessous
// avec les arguments suivants :
// - argv[1] : le fichier de licence
// - var_2ch : un pointeur de pointeur
iVar1 = parse(argv[1], (char **)((int64_t)&var_2ch + 4));
if (iVar1 == 0) {
puts("Invalid license!");
} else {
// Appel de la fonction check ci-dessous
check((int64_t)&var_2ch + 4);
// libération de la mémoire
free(stack0xffffffffffffffd8);
free(j);
}
return 0;
}
// Fonction qui parse le fichier de licence au format spécifique
// récupère dans arg2 les informations de la licence :
// Name, Serial, Type
// arg1 : nom du fichier de licence
// arg2 : tableau de 3 pointeurs pour stocker les informations extraites
// [0] -> "Name" (chaîne de caractères)
// [1] -> "Serial" (chaîne de caractères)
// [2] -> "Type" (entier)
undefined8 parse(char *arg1, char **arg2)
{
int32_t iVar1;
undefined4 uVar2;
undefined8 uVar3;
char *pcVar4;
char **var_d8h;
char *path;
void *buf;
size_t nbyte;
char *var_38h;
char *str;
void *var_28h;
uint64_t j;
char *ptr;
unsigned long fildes;
// ouverture du fichier en lecture seule
fildes = open(arg1, 0);
if (fildes == 0xffffffff) {
perror("open");
exit(1);
}
// récupération des informations du fichier
iVar1 = lstat(arg1, &buf);
if (iVar1 == -1) {
perror("lstat");
exit(1);
}
// allocation mémoire pour lire le contenu du fichier
// nbyte = taille du fichier
ptr = (char *)calloc(nbyte, 1);
// si le fichier est vide, tchao
if (ptr == (char *)0x0) {
perror("calloc");
exit(1);
}
// Lecture du fichier,
j = read(fildes, ptr, nbyte);
if ((int64_t)j < 0) {
perror("read");
exit(1);
}
// Fermeture du fichier
iVar1 = close(fildes);
if (iVar1 != 0) {
perror("close");
exit(1);
}
// Vérification du contenu du fichier
if (j == nbyte) {
// BEGIN WHITE LICENSE = balise entete licence
// END WHITE LICENSE = balise footer licence
// est-ce que le fichier commence par "----BEGIN WHITE LICENSE----\n" ?
iVar1 = strncmp(ptr, "----BEGIN WHITE LICENSE----\n", 0x1c);
if (iVar1 == 0) {
// est-ce que le fichier se termine par "-----END WHITE LICENSE-----\n" ?
iVar1 = strncmp(ptr + (j - 0x1c), "-----END WHITE LICENSE-----\n", 0x1c);
if (iVar1 == 0) {
// décodage Base64 du contenu de la licence dépourvue des balises
// donc contient les informations de la licence :
// Name: Walter White Junior
// Serial: 1d117c5a-297d-4ce6-9186-d4b84fb7f230
// Type: 1
var_28h = (void *)b64d(ptr + 0x1c, j - 0x38);
free(ptr);
str = (char *)var_28h;
// est-ce var_28h commence par "Name: " ?
iVar1 = strncmp(var_28h, "Name: ", 6);
if (iVar1 == 0) {
// recherche du caractère '\n' dans la chaîne
var_38h = (char *)strchr(str, 10);
// si le caractère '\n' n'est pas trouvé, libération de la mémoire et retour
if (var_38h == (char *)0x0) {
free(var_28h);
uVar3 = 0;
} else {
// copie de la chaîne de caractères de la position 6
// à la position du caractère '\n' dans une nouvelle chaîne
pcVar4 = (char *)strndup(str + 6, var_38h + (-6 - (int64_t)str));
// stockage de la valeur dans la variable arg2
*arg2 = pcVar4;
// à var_38h on ajoute 1 pour passer le caractère '\n'
str = var_38h + 1;
// est-ce str commence par "Serial: " ?
iVar1 = strncmp(str, "Serial: ", 8);
if (iVar1 == 0) {
// recherche du caractère '\n' dans la chaîne
var_38h = (char *)strchr(str, 10);
if (var_38h == (char *)0x0) {
free(var_28h);
uVar3 = 0;
} else {
// copie de la chaîne de caractères de la position 8
// à la position du caractère '\n' dans une nouvelle chaîne
pcVar4 = (char *)strndup(str + 8, var_38h + (-8 - (int64_t)str));
// stockage de la valeur dans la variable arg2
arg2[1] = pcVar4;
str = var_38h + 1;
// est-ce str commence par "Type: " ?
iVar1 = strncmp(str, "Type: ", 6);
if (iVar1 == 0) {
// recherche du caractère '\n' dans la chaîne
var_38h = (char *)strchr(str, 10);
if (var_38h == (char *)0x0) {
free(var_28h);
uVar3 = 0;
} else {
// copie de la chaîne de caractères de la position 6
// à la position du caractère '\n' dans une nouvelle chaîne
uVar2 = atoi(str + 6);
// stockage de la valeur dans la variable arg2
*(undefined4 *)(arg2 + 2) = uVar2;
free(var_28h);
uVar3 = 1;
}
} else {
free(var_28h);
uVar3 = 0;
}
}
} else {
free(var_28h);
uVar3 = 0;
}
}
} else {
free(var_28h);
uVar3 = 0;
}
} else {
free(ptr);
uVar3 = 0;
}
} else {
free(ptr);
uVar3 = 0;
}
} else {
uVar3 = 0;
}
return uVar3;
}
// Fonction qui vérifie la validité de la licence
// arg1 : Name,Serial (arg1+8),Type (arg1+8*2)
void check(int64_t arg1)
{
int32_t iVar1;
int64_t i;
// appel de la fonction validate avec les arguments suivants :
// - *(char **)arg1 : Name
// - *(char **)(arg1 + 8) : Serial
iVar1 = validate(*(char **)arg1, *(char **)(arg1 + 8));
if (iVar1 == 0) {
puts("Invalid license!");
} else if (*(int32_t *)(arg1 + 0x10) == 1) {// Type = 1
printf("Valid license for %s!\n", *(undefined8 *)arg1);
} else if (*(int32_t *)(arg1 + 0x10) == 0x539) {// Type = 1337 -> ADMIN LICENSE !
printf("Valid admin license for %s!\n", *(undefined8 *)arg1);
show_flag();
} else {// Rick Astley, sympa...
puts("Invalid license, but nice try! Here: https://www.youtube.com/watch?v=dQw4w9WgXcQ");
}
return;
}
// affiche le flag
void show_flag(void)
{
int32_t iVar1;
char *buf;
ssize_t var_18h;
unsigned long fildes;
// ouverture du fichier flag.txt (dans le container, forcément)
fildes = open("flag.txt", 0);
if (fildes == 0xffffffff) {
puts("Send this license to the remote service to grab the flag of the junior challenge!");
exit(1);
}
var_18h = read(fildes, &buf, 0x46);
if (var_18h < 1) {
perror("read");
exit(1);
}
iVar1 = close(fildes);
if (iVar1 != 0) {
perror("close");
exit(1);
}
puts("Well done! Here is the flag for the Junior challenge:");
// affichage du flag
puts(&buf);
return;
}
// Fonction qui valide la licence
// Cette fonction est le coeur du challenge
// arg1 : Name
// arg2 : Serial
uint32_t validate(char *arg1, char *arg2)
{
int64_t arg2_00;
uint64_t uVar1;
char *s;
char *var_40h;
int64_t var_38h;
int64_t var_2ch;
uint32_t var_24h;
uint64_t j;
int32_t var_14h;
int32_t i;
int64_t var_ch;
// longueur de la chaîne du serial
arg2_00 = strlen(arg2);
// appel la fonction de hachage SHA-256 sur la chaine du serial
// stocke le résultat dans var_38h
sha256(arg2, arg2_00, (int64_t)&var_38h, (int64_t)&var_2ch);
// initialisation du resultat à "valide" par défaut
var_ch = 1;
// 3 passages dans la chaîne Name, décalés de i à chaque passage
for (i = 0; i < 3; i = i + 1) {
// initialise le checksum pour le passage i
var_14h = 0;
// décalage de j à chaque passage
j = (uint64_t)i;
while( true ) {
uVar1 = strlen(arg1);
// si j est supérieur ou égale à la taille de la chaîne Name, on sort
if (uVar1 <= j) break;
// calcule une somme partielle des valeurs ordinales des caractères de Name
// stockée dans le checksum
var_14h = var_14h + arg1[j];
// positionne j 3 caractères plus loin
j = j + 3;
}
// opérations sur le checksum
// (checksum * 0x13 + 0x37) modulo 0x7f pour rester dans une plage de valeurs (0 à 126)
var_24h = (var_14h * 0x13 + 0x37) % 0x7f;
// récupère ième caractère de la chaine de hashage
// donc seulement les 3 premiers caractères de la chaine de hashage sont exploités
var_2ch = ((uint32_t)*(uint8_t *)(i + var_38h) * 0x37 + 0x13) % 0x7f;
// teste si le caractère de hashage est égal à la cheksum et update var_ch en fonction
var_ch = (uint32_t)var_ch & var_24h == var_2ch;
}
CRYPTO_free(var_38h, "fifty-shades-of-white.c", 0xd9);
return (uint32_t)var_ch;
}
// hashage sha256
// arg1 : chaîne à hacher
// arg2 : taille de la chaîne
// arg3 : pointeur de pointeur pour stocker le résultat
// arg4 : taille du résultat
// retourne le hashage sha256 de la chaîne arg1 dans le pointeur arg3
void sha256(char *arg1, int64_t arg2, int64_t arg3, int64_t arg4)
{
int32_t iVar1;
undefined8 uVar2;
undefined8 uVar3;
int64_t var_38h;
int64_t var_30h;
int64_t var_28h;
char *var_20h;
int64_t var_10h;
uVar2 = EVP_MD_CTX_new();
uVar3 = EVP_sha256();
EVP_DigestInit_ex(uVar2, uVar3, 0);
EVP_DigestUpdate(uVar2, arg1, arg2);
uVar3 = EVP_sha256();
iVar1 = EVP_MD_get_size(uVar3);
uVar3 = CRYPTO_malloc((int64_t)iVar1, "fifty-shades-of-white.c", 0xc1);
*(undefined8 *)arg3 = uVar3;
EVP_DigestFinal_ex(uVar2, *(undefined8 *)arg3, arg4);
EVP_MD_CTX_free(uVar2);
return;
}
void print(int64_t arg1)
{
int64_t var_10h;
printf("Name: %s\n", *(undefined8 *)arg1);
printf("Serial: %s\n", *(undefined8 *)(arg1 + 8));
printf("Type: %d\n", *(undefined4 *)(arg1 + 0x10));
return;
}
// Fonction qui décode une chaîne en base64
// arg1 : chaîne à décoder
// arg2 : taille de la chaîne
// url pour tester en ligne : https://www.base64decode.org/fr/
/*
La licence :
----BEGIN WHITE LICENSE----
TmFtZTogV2FsdGVyIFdoaXRlIEp
1bmlvcgpTZXJpYWw6IDFkMTE3Yz
VhLTI5N2QtNGNlNi05MTg2LWQ0Y
jg0ZmI3ZjIzMApUeXBlOiAxCg==
-----END WHITE LICENSE-----
après avoir retiré les balises de licence :
TmFtZTogV2FsdGVyIFdoaXRlIEp
1bmlvcgpTZXJpYWw6IDFkMTE3Yz
VhLTI5N2QtNGNlNi05MTg2LWQ0Y
jg0ZmI3ZjIzMApUeXBlOiAxCg==
devient :
Name: Walter White Junior
Serial: 1d117c5a-297d-4ce6-9186-d4b84fb7f230
Type: 1
*/
undefined8 b64d(char *arg1, size_t arg2)
{
undefined8 uVar1;
undefined8 uVar2;
undefined8 uVar3;
size_t nmeb;
char *var_30h;
int64_t j;
int64_t var_18h;
void *i;
uVar1 = calloc(arg2, 1);
uVar2 = BIO_f_base64();
uVar2 = BIO_new(uVar2);
uVar3 = BIO_new_mem_buf(arg1, arg2 & 0xffffffff);
uVar2 = BIO_push(uVar2, uVar3);
BIO_read(uVar2, uVar1, arg2 & 0xffffffff);
BIO_free_all(uVar2);
return uVar1;
}
Maintenant que la compréhension du programme est vue, il est possible de développer un générateur de licences en Python. La contrainte principale est d’interagir exclusivement avec le conteneur Docker via le port réseau exposé, toute autre méthode n’étant pas considérée comme une solution valide. Ainsi, le script doit être conçu pour communiquer avec le conteneur à l’aide de netcat sur le port 4000. Chaque fois que le programme du conteneur demande une licence, le script devra lui envoyer automatiquement une réponse appropriée via netcat. Le script fait ainsi tout le travail.
#!/usr/bin/env python3
import hashlib
import random
import string
import base64
import subprocess
import re
import logging
import select
# Compilation de la chaîne de caractères en dehors de la fonction
characters = string.ascii_letters + string.digits
# Configuration du logger pour suivre les événements et les erreurs
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def compute_targets(name: str) -> list:
"""
Calcule des valeurs cibles basées sur le nom fourni pour la validation du serial.
Args:
name (str): Le nom à partir duquel générer les valeurs cibles.
Returns:
list: Liste de valeurs cibles.
"""
# les valeurs cibles sont stockées dans une liste (3 valeurs au total)
values = []
# Pour chaque valeur cible,
for i in range(3):
char_sum = 0
# on additionne les valeurs ordinales des caractères ASCII du nom entré par l'utilisateur.
# on commence à l'indice i et pour chaque itération,
# on saute de 3 en 3 dans le nom jusqu'à la fin du nom.
# Pour "Walter White Junior" :
# i = 0 -> W, t, ' ', i, ' ', n, r -> 87 + 116 + 32 + 105 + 32 + 110 + 114 = 596
# i = 1 -> a, e, W, t, J, i -> 97 + 101 + 87 + 116 + 74 + 105 = 580
# i = 2 -> l, r, h, e, u, o -> 108 + 114 + 104 + 101 + 117 + 111 = 655
for j in range(i, len(name), 3):
char_sum += ord(name[j]) # Somme des valeurs ASCII des caractères.
# On applique 2 opérations sur la somme des valeurs ASCII,
# en vérifiant que le résultat reste dans une plage de 0 à 126 (modulo),
# puis on ajoute le résultat à la liste des valeurs cibles.
values.append((char_sum * 0x13 + 0x37) % 0x7f)
return values
def compute_serial(target):
"""
Génère un serial valide en testant des combinaisons aléatoires jusqu'à ce qu'une correspondance soit trouvée.
Args:
target (list): Liste des valeurs cibles pour le serial.
Returns:
str: Un serial valide.
"""
while True:
# Sélectionne 36 caractères aléatoires parmi les lettres et chiffres
raw_serial = ''.join(random.choices(characters, k=36))
# Calcul du hash sha256
sha256_hash = hashlib.sha256(raw_serial.encode()).digest()
# Vérification que les trois premiers octets du hash sha256 respectent les valeurs cibles
if all(((sha256_hash[i] * 0x37 + 0x13) % 0x7f) == target[i] for i in range(3)):
return raw_serial
def generate_serial(name: str) -> str:
"""
Génère un serial pour un nom donné en utilisant des valeurs cibles calculées.
Args:
name (str): Le nom pour lequel générer le serial.
Returns:
str: Un serial généré.
"""
target_values = compute_targets(name)
valid_serial = compute_serial(target_values)
return valid_serial
def generate_license(name: str, user_type_value: int, serial: str) -> str:
"""
Crée une licence encodée en base64 à partir du nom, du type d'utilisateur et du serial.
Args:
name (str): Nom de l'utilisateur.
user_type_value (int): Type d'utilisateur (e.g., 1337 pour admin).
serial (str): Serial généré.
Returns:
str: Licence formatée et encodée.
"""
license_content = f"Name: {name}\nSerial: {serial}\nType: {user_type_value}\n"
# Encodage en base64 de la licence
encoded_license = base64.b64encode(license_content.encode()).decode()
# Formatage de la licence en lignes de 27 caractères
lines = [encoded_license[i:i+27] for i in range(0, len(encoded_license), 27)]
# Fin du formatage de la licence avec préfixe et suffixe
formatted_license = '\n'.join(lines)
return f"----BEGIN WHITE LICENSE----\n{formatted_license}\n-----END WHITE LICENSE-----"
def interact_with_docker():
"""
Interagit avec un container Docker via netcat pour obtenir des noms, générer des licences valides, et les soumettre.
"""
try:
# Ouvre une connexion netcat avec le container Docker
with subprocess.Popen(['nc', 'localhost', '4000'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True, bufsize=1) as proc:
# Tant que la connexion est ouverte
while True:
# Lit les données reçues
output = proc.stdout.readline()
# Si la chaîne est vide, cela signifie que le flux est fermé ou que le processus est terminé
if output == '':
print("No more output from the Docker container. Exiting.")
break
# Affiche les données reçues
logging.info(output.strip())
# Vérifie si une demande de licence est faite
match = re.search(r"\[\*\] Give me a valid (admin )?license for username: (.+)", output)
# Si une demande de licence est faite
if match:
# Récupère le nom de l'utilisateur
user_name = match.group(2)
# Génère une licence admin (1337) pour l'utilisateur
logging.info(f"Generating license for {user_name}")
thelicense = generate_license(user_name, 1337, generate_serial(user_name))
logging.info(f"Generated license: \n{thelicense}")
# Soumet la licence générée
proc.stdin.write(thelicense + '\n')
# Vide le buffer
proc.stdin.flush()
# Envoie une ligne vide pour marquer la fin de la saisie de la licence
# ([*] Send empty lines to mark the end of your inputs.)
proc.stdin.write('\n')
proc.stdin.flush()
except Exception as e:
logging.error(f"Error during Docker interaction: {e}")
finally:
if proc:
proc.stdin.close()
proc.stdout.close()
logging.info("Netcat connection closed")
if __name__ == "__main__":
interact_with_docker()
Exécution du container :
$ docker compose up
[+] Running 1/0
✔ Container fifty-fifty-shades-of-white-1 Created 0.0s
Attaching to fifty-shades-of-white-1
Exécution du programme :
$ ./autogen.py
2025-01-19 12:36:07,146 - INFO - [*] Send empty lines to mark the end of your inputs.
2025-01-19 12:36:07,146 - INFO - [*] Give me a valid admin license for username: Walter White Junior
2025-01-19 12:36:07,147 - INFO - Generating license for Walter White Junior
2025-01-19 12:36:09,780 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogV2FsdGVyIFdoaXRlIEp
1bmlvcgpTZXJpYWw6IEUzUkFYU1
BPQ0JSUWo4WEg5MzlsZjhBRWhtM
nk3UUZMSGp5SApUeXBlOiAxMzM3
Cg==
-----END WHITE LICENSE-----
2025-01-19 12:36:09,831 - INFO - Valid admin license for Walter White Junior!
2025-01-19 12:36:09,831 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:36:09,831 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:36:09,831 - INFO - [*] Give me a valid license for username: Jesse Pinkman
2025-01-19 12:36:09,831 - INFO - Generating license for Jesse Pinkman
2025-01-19 12:36:33,253 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogSmVzc2UgUGlua21hbgp
TZXJpYWw6IHgySllYaklQalA4R2
pFN1NnTnI2MHVoWFI2VEhjMHNhQ
mhLMApUeXBlOiAxMzM3Cg==
-----END WHITE LICENSE-----
2025-01-19 12:36:33,291 - INFO - Valid admin license for Jesse Pinkman!
2025-01-19 12:36:33,291 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:36:33,291 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:36:33,291 - INFO - [*] Give me a valid license for username: Saul Goodman
2025-01-19 12:36:33,291 - INFO - Generating license for Saul Goodman
2025-01-19 12:36:37,132 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogU2F1bCBHb29kbWFuClN
lcmlhbDogQzhZRTJ2S2NCNTlWZX
lkbm5EdHVDUDhyME4xRkF1d2NqS
GVxClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:36:37,179 - INFO - Valid admin license for Saul Goodman!
2025-01-19 12:36:37,179 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:36:37,179 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:36:37,179 - INFO - [*] Give me a valid license for username: Gus Fring
2025-01-19 12:36:37,179 - INFO - Generating license for Gus Fring
2025-01-19 12:36:38,627 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogR3VzIEZyaW5nClNlcml
hbDogTDhoZXFsZEpwSmNpMTdNZE
9NMXBPTkw3ZE9CSGJzakpCdFp1C
lR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:36:38,671 - INFO - Valid admin license for Gus Fring!
2025-01-19 12:36:38,671 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:36:38,671 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:36:38,671 - INFO - [*] Give me a valid license for username: Hank Schrader
2025-01-19 12:36:38,671 - INFO - Generating license for Hank Schrader
2025-01-19 12:36:41,809 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogSGFuayBTY2hyYWRlcgp
TZXJpYWw6IG1BUE1FM2NLVkpWTV
VrTmQwQUVia2tJWkRsM0VXdVZZV
21YaQpUeXBlOiAxMzM3Cg==
-----END WHITE LICENSE-----
2025-01-19 12:36:41,848 - INFO - Valid admin license for Hank Schrader!
2025-01-19 12:36:41,848 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:36:41,848 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:36:41,848 - INFO - [*] Give me a valid license for username: Mike Ehrmantraut
2025-01-19 12:36:41,849 - INFO - Generating license for Mike Ehrmantraut
2025-01-19 12:36:56,721 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogTWlrZSBFaHJtYW50cmF
1dApTZXJpYWw6IGQ0ZDlEVzFzTG
RJak84RGYyYWlQb2tSUUJqMWI1W
WZBdEduSApUeXBlOiAxMzM3Cg==
-----END WHITE LICENSE-----
2025-01-19 12:36:56,759 - INFO - Valid admin license for Mike Ehrmantraut!
2025-01-19 12:36:56,759 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:36:56,759 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:36:56,759 - INFO - [*] Give me a valid license for username: Tuco Salamanca
2025-01-19 12:36:56,759 - INFO - Generating license for Tuco Salamanca
2025-01-19 12:37:05,810 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogVHVjbyBTYWxhbWFuY2E
KU2VyaWFsOiBnV2V4NFZYQnpUYk
J3ZFROWTM3dnEwN2VTeXhZazhKU
VBHMFEKVHlwZTogMTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:37:05,852 - INFO - Valid admin license for Tuco Salamanca!
2025-01-19 12:37:05,852 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:37:05,852 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:37:05,852 - INFO - [*] Give me a valid license for username: vtyIphScpADl7IjiC6hPyTV0TYbaC5
2025-01-19 12:37:05,852 - INFO - Generating license for vtyIphScpADl7IjiC6hPyTV0TYbaC5
2025-01-19 12:37:14,233 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogdnR5SXBoU2NwQURsN0l
qaUM2aFB5VFYwVFliYUM1ClNlcm
lhbDogbElXT2JJdU9QcmxGWWVxZ
2dsTjVzaU55SGVJR1dEVFAxQnFh
ClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:37:14,272 - INFO - Valid admin license for vtyIphScpADl7IjiC6hPyTV0TYbaC5!
2025-01-19 12:37:14,273 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:37:14,273 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:37:14,273 - INFO - [*] Give me a valid license for username: nz3DefpXVnb2Dzhm1fvyN4J3hCsPU
2025-01-19 12:37:14,273 - INFO - Generating license for nz3DefpXVnb2Dzhm1fvyN4J3hCsPU
2025-01-19 12:37:17,379 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogbnozRGVmcFhWbmIyRHp
obTFmdnlONEozaENzUFUKU2VyaW
FsOiBRU3ExUTkzRWYxRzFOWDRNV
0RpS1lmc2tYdWVsbFJ2bWFoZUgK
VHlwZTogMTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:37:17,419 - INFO - Valid admin license for nz3DefpXVnb2Dzhm1fvyN4J3hCsPU!
2025-01-19 12:37:17,419 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:37:17,419 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:37:17,419 - INFO - [*] Give me a valid license for username: SuQF09iFYq8oQvuusk5
2025-01-19 12:37:17,419 - INFO - Generating license for SuQF09iFYq8oQvuusk5
2025-01-19 12:37:20,401 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogU3VRRjA5aUZZcThvUXZ
1dXNrNQpTZXJpYWw6IE5WQkdFaG
JhcXZsOENLcnE1ZkZNVFpIUmZuR
2RMb3piNnZXMApUeXBlOiAxMzM3
Cg==
-----END WHITE LICENSE-----
2025-01-19 12:37:20,442 - INFO - Valid admin license for SuQF09iFYq8oQvuusk5!
2025-01-19 12:37:20,442 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:37:20,442 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:37:20,442 - INFO - [*] Give me a valid license for username: MMF4wW5ScIeQET28etjGIb8ZH
2025-01-19 12:37:20,442 - INFO - Generating license for MMF4wW5ScIeQET28etjGIb8ZH
2025-01-19 12:37:22,718 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogTU1GNHdXNVNjSWVRRVQ
yOGV0akdJYjhaSApTZXJpYWw6IG
cyc1NXdnNPQ2dtYzFLUEVrblJub
lVicms5bUlReGk3QVFVZQpUeXBl
OiAxMzM3Cg==
-----END WHITE LICENSE-----
2025-01-19 12:37:22,758 - INFO - Valid admin license for MMF4wW5ScIeQET28etjGIb8ZH!
2025-01-19 12:37:22,758 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:37:22,758 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:37:22,758 - INFO - [*] Give me a valid license for username: ZvFrdP0BwTlNZmJ
2025-01-19 12:37:22,758 - INFO - Generating license for ZvFrdP0BwTlNZmJ
2025-01-19 12:37:25,516 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogWnZGcmRQMEJ3VGxOWm1
KClNlcmlhbDogNUh4SUM2R2tlNH
VTREQ3eFFXYjJUSWp1Y29NTFc0Y
1pCVmQzClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:37:25,556 - INFO - Valid admin license for ZvFrdP0BwTlNZmJ!
2025-01-19 12:37:25,556 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:37:25,556 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:37:25,556 - INFO - [*] Give me a valid license for username: gPjQpICMoGOmqpy6pvzneyuwG3b
2025-01-19 12:37:25,556 - INFO - Generating license for gPjQpICMoGOmqpy6pvzneyuwG3b
2025-01-19 12:37:29,111 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogZ1BqUXBJQ01vR09tcXB
5NnB2em5leXV3RzNiClNlcmlhbD
ogTW4zaTA5eWZBS0ZwMGtOMWN3M
GVYUVFSUEJtMXpmQU1nUnpBClR5
cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:37:29,150 - INFO - Valid admin license for gPjQpICMoGOmqpy6pvzneyuwG3b!
2025-01-19 12:37:29,150 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:37:29,150 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:37:29,150 - INFO - [*] Give me a valid license for username: HDQLWUpBlQRMMXKQz
2025-01-19 12:37:29,150 - INFO - Generating license for HDQLWUpBlQRMMXKQz
2025-01-19 12:38:00,320 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogSERRTFdVcEJsUVJNTVh
LUXoKU2VyaWFsOiBZcm9HbTlJc3
R2aWVJMWN4S2NTbkpCbWNNWXNje
Ggxc0VTZ0IKVHlwZTogMTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:38:00,360 - INFO - Valid admin license for HDQLWUpBlQRMMXKQz!
2025-01-19 12:38:00,360 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:38:00,360 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:38:00,360 - INFO - [*] Give me a valid license for username: oqOj1vgskfF5IlRzw
2025-01-19 12:38:00,360 - INFO - Generating license for oqOj1vgskfF5IlRzw
2025-01-19 12:38:02,726 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogb3FPajF2Z3NrZkY1SWx
SencKU2VyaWFsOiBzajVESENCcV
B0REZncWxVN0hkeG53d2tlcW1wR
1ZRWTd5T1EKVHlwZTogMTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:38:02,766 - INFO - Valid admin license for oqOj1vgskfF5IlRzw!
2025-01-19 12:38:02,766 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:38:02,766 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:38:02,766 - INFO - [*] Give me a valid license for username: Hh1vf5Jxx4IoFnq4vRw
2025-01-19 12:38:02,766 - INFO - Generating license for Hh1vf5Jxx4IoFnq4vRw
2025-01-19 12:38:10,963 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogSGgxdmY1Snh4NElvRm5
xNHZSdwpTZXJpYWw6IFRWb0U2SG
tLampzNzRZWk9yMnRiTWE5WnBsd
m9PQUNPSktucApUeXBlOiAxMzM3
Cg==
-----END WHITE LICENSE-----
2025-01-19 12:38:11,003 - INFO - Valid admin license for Hh1vf5Jxx4IoFnq4vRw!
2025-01-19 12:38:11,004 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:38:11,004 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:38:11,004 - INFO - [*] Give me a valid license for username: jtMqggCqs8nRht7POULSdBJfglG
2025-01-19 12:38:11,004 - INFO - Generating license for jtMqggCqs8nRht7POULSdBJfglG
2025-01-19 12:38:42,936 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZToganRNcWdnQ3FzOG5SaHQ
3UE9VTFNkQkpmZ2xHClNlcmlhbD
ogS2hwWldZZ0JETXN0OEdWQkhNd
W92SnFzUU1kTlZUMWFXNUtUClR5
cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:38:42,977 - INFO - Valid admin license for jtMqggCqs8nRht7POULSdBJfglG!
2025-01-19 12:38:42,977 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:38:42,977 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:38:42,977 - INFO - [*] Give me a valid license for username: L8IEaLEFLgkw9ea
2025-01-19 12:38:42,977 - INFO - Generating license for L8IEaLEFLgkw9ea
2025-01-19 12:38:47,063 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogTDhJRWFMRUZMZ2t3OWV
hClNlcmlhbDogWlFaT3JvWkNqeH
JPek1PSFdJVmFPcDZZY0kwRmU3b
240NFNVClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:38:47,106 - INFO - Valid admin license for L8IEaLEFLgkw9ea!
2025-01-19 12:38:47,106 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:38:47,106 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:38:47,106 - INFO - [*] Give me a valid license for username: GeE0GOXatYxdSW
2025-01-19 12:38:47,106 - INFO - Generating license for GeE0GOXatYxdSW
2025-01-19 12:38:53,892 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogR2VFMEdPWGF0WXhkU1c
KU2VyaWFsOiBoSE45d0NrU2JnM3
lVaVVCMEJBQ2Q1OXQ3S0pnWllJa
zlvdVIKVHlwZTogMTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:38:53,938 - INFO - Valid admin license for GeE0GOXatYxdSW!
2025-01-19 12:38:53,938 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:38:53,938 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:38:53,938 - INFO - [*] Give me a valid license for username: u39kAjE7ZPHE
2025-01-19 12:38:53,938 - INFO - Generating license for u39kAjE7ZPHE
2025-01-19 12:39:15,566 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogdTM5a0FqRTdaUEhFClN
lcmlhbDogYXRuTXhhRzJiVnlpdU
UxeFJlb3VDMVQ0dlo4MUFLdVllY
292ClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:39:15,606 - INFO - Valid admin license for u39kAjE7ZPHE!
2025-01-19 12:39:15,606 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:39:15,606 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:39:15,606 - INFO - [*] Give me a valid license for username: eDlT2tMwst2R2Yd9q7uOP2LGOvr
2025-01-19 12:39:15,606 - INFO - Generating license for eDlT2tMwst2R2Yd9q7uOP2LGOvr
2025-01-19 12:39:20,076 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogZURsVDJ0TXdzdDJSMll
kOXE3dU9QMkxHT3ZyClNlcmlhbD
ogYnFhUERiTFBtM3JKTWtqQjZNW
mdsSnZFUHJvOG9uOG1TaW81ClR5
cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:39:20,116 - INFO - Valid admin license for eDlT2tMwst2R2Yd9q7uOP2LGOvr!
2025-01-19 12:39:20,116 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:39:20,116 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:39:20,117 - INFO - [*] Give me a valid license for username: 7sQ6G7Q95NU6tETqzd0KSNfs
2025-01-19 12:39:20,117 - INFO - Generating license for 7sQ6G7Q95NU6tETqzd0KSNfs
2025-01-19 12:39:32,146 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogN3NRNkc3UTk1TlU2dEV
UcXpkMEtTTmZzClNlcmlhbDogWW
RyUm5aMXp3WWQ0cmdKYXJnRE04N
lFyY1RyM1laQTVJTHNhClR5cGU6
IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:39:32,188 - INFO - Valid admin license for 7sQ6G7Q95NU6tETqzd0KSNfs!
2025-01-19 12:39:32,188 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:39:32,188 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:39:32,188 - INFO - [*] Give me a valid license for username: mMGIIKVDAPJtKfU2OjBcvm20i
2025-01-19 12:39:32,189 - INFO - Generating license for mMGIIKVDAPJtKfU2OjBcvm20i
2025-01-19 12:39:37,295 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogbU1HSUlLVkRBUEp0S2Z
VMk9qQmN2bTIwaQpTZXJpYWw6IH
ZhWEptODdFdDEzcWpJMVNVaXJUS
GZNeU1Gb3dkUjZjdGJ3SQpUeXBl
OiAxMzM3Cg==
-----END WHITE LICENSE-----
2025-01-19 12:39:37,335 - INFO - Valid admin license for mMGIIKVDAPJtKfU2OjBcvm20i!
2025-01-19 12:39:37,335 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:39:37,335 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:39:37,335 - INFO - [*] Give me a valid license for username: ucHUdwmYWIHdgDnZhf6tIvK
2025-01-19 12:39:37,335 - INFO - Generating license for ucHUdwmYWIHdgDnZhf6tIvK
2025-01-19 12:39:40,529 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogdWNIVWR3bVlXSUhkZ0R
uWmhmNnRJdksKU2VyaWFsOiByVX
Z4ZHZRTDNlNVU2bGZTbTdXMTFER
WZOMEhrd3F6UjZuNGwKVHlwZTog
MTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:39:40,573 - INFO - Valid admin license for ucHUdwmYWIHdgDnZhf6tIvK!
2025-01-19 12:39:40,573 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:39:40,573 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:39:40,573 - INFO - [*] Give me a valid license for username: 9zuuMLZk4RHjYGI
2025-01-19 12:39:40,573 - INFO - Generating license for 9zuuMLZk4RHjYGI
2025-01-19 12:39:51,884 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogOXp1dU1MWms0UkhqWUd
JClNlcmlhbDogaFhTeGJHTVY1NF
ExME9PNW9aT2RJNjRZc2xKYVpxZ
VZNVHB6ClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:39:51,923 - INFO - Valid admin license for 9zuuMLZk4RHjYGI!
2025-01-19 12:39:51,923 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:39:51,923 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:39:51,923 - INFO - [*] Give me a valid license for username: AXzgozNlkgN8kFy1WVFkK9u
2025-01-19 12:39:51,923 - INFO - Generating license for AXzgozNlkgN8kFy1WVFkK9u
2025-01-19 12:40:16,963 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogQVh6Z296TmxrZ044a0Z
5MVdWRmtLOXUKU2VyaWFsOiA4Vj
NXWTNCeXdJQ1psdUtQS0p0bXpDM
3FhRHAzdVVLbHNkVE4KVHlwZTog
MTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:40:17,010 - INFO - Valid admin license for AXzgozNlkgN8kFy1WVFkK9u!
2025-01-19 12:40:17,010 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:40:17,010 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:40:17,010 - INFO - [*] Give me a valid license for username: CvodEuhUCYq3aTTfNLu0aiS
2025-01-19 12:40:17,010 - INFO - Generating license for CvodEuhUCYq3aTTfNLu0aiS
2025-01-19 12:40:31,467 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogQ3ZvZEV1aFVDWXEzYVR
UZk5MdTBhaVMKU2VyaWFsOiBwdj
lnMHpWT3lGM0U0b21zdjMxV25mZ
1JZT2dPa1o3a1ZwY3kKVHlwZTog
MTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:40:31,506 - INFO - Valid admin license for CvodEuhUCYq3aTTfNLu0aiS!
2025-01-19 12:40:31,506 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:40:31,506 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:40:31,506 - INFO - [*] Give me a valid license for username: oow5PNHZreiyZNVY8D
2025-01-19 12:40:31,506 - INFO - Generating license for oow5PNHZreiyZNVY8D
2025-01-19 12:40:34,003 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogb293NVBOSFpyZWl5Wk5
WWThEClNlcmlhbDogWjlyUVlicX
dIaGdPZEhZa3A3SmxUdEVmbmxZZ
XNXTGdQa1VmClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:40:34,042 - INFO - Valid admin license for oow5PNHZreiyZNVY8D!
2025-01-19 12:40:34,042 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:40:34,042 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:40:34,042 - INFO - [*] Give me a valid license for username: Zla58zcTAob155zrGP8YFzQMzsDVb1
2025-01-19 12:40:34,042 - INFO - Generating license for Zla58zcTAob155zrGP8YFzQMzsDVb1
2025-01-19 12:40:48,523 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogWmxhNTh6Y1RBb2IxNTV
6ckdQOFlGelFNenNEVmIxClNlcm
lhbDogbFFQdFljcGRUckhFVXE3R
ElHWmF5TmVwNk9TS3BvV3pWWWo5
ClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:40:48,558 - INFO - Valid admin license for Zla58zcTAob155zrGP8YFzQMzsDVb1!
2025-01-19 12:40:48,558 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:40:48,558 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:40:48,558 - INFO - [*] Give me a valid license for username: iUmIA8b88ZWLmcdItArjWJUyFJb4tLi
2025-01-19 12:40:48,558 - INFO - Generating license for iUmIA8b88ZWLmcdItArjWJUyFJb4tLi
2025-01-19 12:40:51,504 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogaVVtSUE4Yjg4WldMbWN
kSXRBcmpXSlV5RkpiNHRMaQpTZX
JpYWw6IGliS2pKYTZmNGhCV0xKa
EhIYWxYVHNFSHVDR3ZnOFRWQ0NU
WgpUeXBlOiAxMzM3Cg==
-----END WHITE LICENSE-----
2025-01-19 12:40:51,541 - INFO - Valid admin license for iUmIA8b88ZWLmcdItArjWJUyFJb4tLi!
2025-01-19 12:40:51,541 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:40:51,541 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:40:51,541 - INFO - [*] Give me a valid license for username: dAmQvx0RGX1Mgk1sDJ
2025-01-19 12:40:51,541 - INFO - Generating license for dAmQvx0RGX1Mgk1sDJ
2025-01-19 12:40:56,436 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogZEFtUXZ4MFJHWDFNZ2s
xc0RKClNlcmlhbDogUzZhdlB0dT
g1MGtndndlcWVyclVLTlU1TDhQT
W5sSUhkYUkxClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:40:56,476 - INFO - Valid admin license for dAmQvx0RGX1Mgk1sDJ!
2025-01-19 12:40:56,476 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:40:56,476 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:40:56,476 - INFO - [*] Give me a valid license for username: SQFYuWGaa0Ycz3kdGUbK228ctu
2025-01-19 12:40:56,476 - INFO - Generating license for SQFYuWGaa0Ycz3kdGUbK228ctu
2025-01-19 12:41:14,155 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogU1FGWXVXR2FhMFljejN
rZEdVYksyMjhjdHUKU2VyaWFsOi
BRWVBKYkZmQktYbkVuN09mc1BnY
m5sa0UzSXp0TDMwR05ZekoKVHlw
ZTogMTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:41:14,197 - INFO - Valid admin license for SQFYuWGaa0Ycz3kdGUbK228ctu!
2025-01-19 12:41:14,197 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:41:14,197 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:41:14,197 - INFO - [*] Give me a valid license for username: WgsR0S0J0dJOajZBjiUv
2025-01-19 12:41:14,197 - INFO - Generating license for WgsR0S0J0dJOajZBjiUv
2025-01-19 12:41:17,283 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogV2dzUjBTMEowZEpPYWp
aQmppVXYKU2VyaWFsOiBDVUR6SH
dtWGZMaXVGQlN6MkRUUTZEcVpJb
2NNRVRYcGNsbmkKVHlwZTogMTMz
Nwo=
-----END WHITE LICENSE-----
2025-01-19 12:41:17,323 - INFO - Valid admin license for WgsR0S0J0dJOajZBjiUv!
2025-01-19 12:41:17,323 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:41:17,324 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:41:17,324 - INFO - [*] Give me a valid license for username: z11AQROqbu25mcUem51Hflaw
2025-01-19 12:41:17,324 - INFO - Generating license for z11AQROqbu25mcUem51Hflaw
2025-01-19 12:41:31,433 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogejExQVFST3FidTI1bWN
VZW01MUhmbGF3ClNlcmlhbDogM0
Z6dmc2cEVnbTVGUkJYRVVjQzJXO
Uw0VVd2WGFOdTY4VEk2ClR5cGU6
IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:41:31,474 - INFO - Valid admin license for z11AQROqbu25mcUem51Hflaw!
2025-01-19 12:41:31,474 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:41:31,474 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:41:31,474 - INFO - [*] Give me a valid license for username: PsJSCbkanH9z2cN1IMnUuSKQG
2025-01-19 12:41:31,474 - INFO - Generating license for PsJSCbkanH9z2cN1IMnUuSKQG
2025-01-19 12:41:33,623 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogUHNKU0Nia2FuSDl6MmN
OMUlNblV1U0tRRwpTZXJpYWw6IH
hIWWRDSTJ1OGNDRWJwM201bVRQV
FRnQ1RpNEFwTG1KcXBraApUeXBl
OiAxMzM3Cg==
-----END WHITE LICENSE-----
2025-01-19 12:41:33,667 - INFO - Valid admin license for PsJSCbkanH9z2cN1IMnUuSKQG!
2025-01-19 12:41:33,668 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:41:33,668 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:41:33,668 - INFO - [*] Give me a valid license for username: IcJTXp28dOC4sk3yF1S1SgVhlSQwLG
2025-01-19 12:41:33,668 - INFO - Generating license for IcJTXp28dOC4sk3yF1S1SgVhlSQwLG
2025-01-19 12:41:33,977 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogSWNKVFhwMjhkT0M0c2s
zeUYxUzFTZ1ZobFNRd0xHClNlcm
lhbDogcUZweURGZ01zRG13cklCd
nhFNkg5SVJXdEV4OXU4Q1NHSnFk
ClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:41:34,018 - INFO - Valid admin license for IcJTXp28dOC4sk3yF1S1SgVhlSQwLG!
2025-01-19 12:41:34,018 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:41:34,018 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:41:34,018 - INFO - [*] Give me a valid license for username: vGGNcdvvL6aidzF6Df0
2025-01-19 12:41:34,018 - INFO - Generating license for vGGNcdvvL6aidzF6Df0
2025-01-19 12:41:46,472 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogdkdHTmNkdnZMNmFpZHp
GNkRmMApTZXJpYWw6IG12UnB1dX
lCcWdlYmdvQ1hhUDRMRFdnZGplM
zUwMkhlTzRXSgpUeXBlOiAxMzM3
Cg==
-----END WHITE LICENSE-----
2025-01-19 12:41:46,512 - INFO - Valid admin license for vGGNcdvvL6aidzF6Df0!
2025-01-19 12:41:46,512 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:41:46,512 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:41:46,512 - INFO - [*] Give me a valid license for username: 2U4INKbtxnDfX9iSmLO7zH
2025-01-19 12:41:46,512 - INFO - Generating license for 2U4INKbtxnDfX9iSmLO7zH
2025-01-19 12:42:06,021 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogMlU0SU5LYnR4bkRmWDl
pU21MTzd6SApTZXJpYWw6IGtXdz
hBZHBmU3Q4M21DdmNiZjdkdnhKQ
0NETVhobWZqQmxhMApUeXBlOiAx
MzM3Cg==
-----END WHITE LICENSE-----
2025-01-19 12:42:06,063 - INFO - Valid admin license for 2U4INKbtxnDfX9iSmLO7zH!
2025-01-19 12:42:06,063 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:42:06,063 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:42:06,063 - INFO - [*] Give me a valid license for username: CkaIjT1hqUFCAfSVdntDMg
2025-01-19 12:42:06,063 - INFO - Generating license for CkaIjT1hqUFCAfSVdntDMg
2025-01-19 12:42:16,031 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogQ2thSWpUMWhxVUZDQWZ
TVmRudERNZwpTZXJpYWw6IEszcG
xNSjNvcHJMdHpXeDZVUXExaGZmU
ms0YlNualo5a3NHRApUeXBlOiAx
MzM3Cg==
-----END WHITE LICENSE-----
2025-01-19 12:42:16,076 - INFO - Valid admin license for CkaIjT1hqUFCAfSVdntDMg!
2025-01-19 12:42:16,076 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:42:16,076 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:42:16,076 - INFO - [*] Give me a valid license for username: 7khrlBZ8eaAWgq9lpBr4IpVsugn5emyg
2025-01-19 12:42:16,076 - INFO - Generating license for 7khrlBZ8eaAWgq9lpBr4IpVsugn5emyg
2025-01-19 12:42:21,439 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogN2tocmxCWjhlYUFXZ3E
5bHBCcjRJcFZzdWduNWVteWcKU2
VyaWFsOiBOaXR1VnpQd0FQdFdtV
GFWNFc5YXc2eTVrWTdKbWF4bFJa
TTkKVHlwZTogMTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:42:21,479 - INFO - Valid admin license for 7khrlBZ8eaAWgq9lpBr4IpVsugn5emyg!
2025-01-19 12:42:21,479 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:42:21,479 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:42:21,479 - INFO - [*] Give me a valid license for username: FLquwL95eVa5
2025-01-19 12:42:21,479 - INFO - Generating license for FLquwL95eVa5
2025-01-19 12:43:11,429 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogRkxxdXdMOTVlVmE1ClN
lcmlhbDogTFVBS0VSSnJwVUlTZU
hyTGR6QzJKRkEzeFdTWWs5ZFRya
nJyClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:43:11,473 - INFO - Valid admin license for FLquwL95eVa5!
2025-01-19 12:43:11,473 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:43:11,473 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:43:11,473 - INFO - [*] Give me a valid license for username: VM6RWauQdFfpbGsnwXll7tVV
2025-01-19 12:43:11,473 - INFO - Generating license for VM6RWauQdFfpbGsnwXll7tVV
2025-01-19 12:43:23,939 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogVk02UldhdVFkRmZwYkd
zbndYbGw3dFZWClNlcmlhbDogcV
BlejBUZTdKTlFDNDl4aXl1bGNmZ
1pWSDgyRXB1RE10VjVkClR5cGU6
IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:43:23,978 - INFO - Valid admin license for VM6RWauQdFfpbGsnwXll7tVV!
2025-01-19 12:43:23,978 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:43:23,978 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:43:23,978 - INFO - [*] Give me a valid license for username: lsVciRK9ioAld8
2025-01-19 12:43:23,978 - INFO - Generating license for lsVciRK9ioAld8
2025-01-19 12:43:26,927 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogbHNWY2lSSzlpb0FsZDg
KU2VyaWFsOiAwQUdkYk1SUHFVVU
5XbXZ2dUNNcWdiVHpGMGlzUWh0O
DV1UHEKVHlwZTogMTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:43:26,971 - INFO - Valid admin license for lsVciRK9ioAld8!
2025-01-19 12:43:26,971 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:43:26,971 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:43:26,971 - INFO - [*] Give me a valid license for username: sZFehf4iSx0p63fgWtsf
2025-01-19 12:43:26,971 - INFO - Generating license for sZFehf4iSx0p63fgWtsf
2025-01-19 12:43:32,050 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogc1pGZWhmNGlTeDBwNjN
mZ1d0c2YKU2VyaWFsOiByMllHNU
VLVDdvU0U5bTRHUXYyNlViWldkc
VVlRXdIeHJoeEEKVHlwZTogMTMz
Nwo=
-----END WHITE LICENSE-----
2025-01-19 12:43:32,089 - INFO - Valid admin license for sZFehf4iSx0p63fgWtsf!
2025-01-19 12:43:32,089 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:43:32,089 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:43:32,089 - INFO - [*] Give me a valid license for username: J155HrFK9xprnMCWxLx8L
2025-01-19 12:43:32,089 - INFO - Generating license for J155HrFK9xprnMCWxLx8L
2025-01-19 12:43:37,393 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogSjE1NUhyRks5eHBybk1
DV3hMeDhMClNlcmlhbDogY2dKY0
VSdDFmUWZIR0s0cHROR1FYano3T
1B2ak9LTkxvbWU4ClR5cGU6IDEz
MzcK
-----END WHITE LICENSE-----
2025-01-19 12:43:37,434 - INFO - Valid admin license for J155HrFK9xprnMCWxLx8L!
2025-01-19 12:43:37,434 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:43:37,434 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:43:37,434 - INFO - [*] Give me a valid license for username: 1RW5Vcs2oCvdik
2025-01-19 12:43:37,434 - INFO - Generating license for 1RW5Vcs2oCvdik
2025-01-19 12:43:58,292 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogMVJXNVZjczJvQ3ZkaWs
KU2VyaWFsOiBaZjA5Nm83UWpKMV
FWdVN4TWxBRG1YdlJHM0tBVXpzU
WhxN1MKVHlwZTogMTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:43:58,339 - INFO - Valid admin license for 1RW5Vcs2oCvdik!
2025-01-19 12:43:58,339 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:43:58,339 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:43:58,339 - INFO - [*] Give me a valid license for username: k0OUBtl0rfJ3IEtUC1
2025-01-19 12:43:58,339 - INFO - Generating license for k0OUBtl0rfJ3IEtUC1
2025-01-19 12:44:19,619 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogazBPVUJ0bDByZkozSUV
0VUMxClNlcmlhbDogR2RXTEJHWD
JrNkZyeUVSejBESWh0cjdrcWJRW
mxpQ0pHc0pOClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:44:19,659 - INFO - Valid admin license for k0OUBtl0rfJ3IEtUC1!
2025-01-19 12:44:19,659 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:44:19,659 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:44:19,659 - INFO - [*] Give me a valid license for username: htssRhsEpIoPXu
2025-01-19 12:44:19,659 - INFO - Generating license for htssRhsEpIoPXu
2025-01-19 12:44:42,096 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogaHRzc1Joc0VwSW9QWHU
KU2VyaWFsOiBLZ3hOZHFBOXB2VT
YwbVBJaDFpNVFlODIyYXF5eFNNc
1ppRDEKVHlwZTogMTMzNwo=
-----END WHITE LICENSE-----
2025-01-19 12:44:42,140 - INFO - Valid admin license for htssRhsEpIoPXu!
2025-01-19 12:44:42,140 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:44:42,140 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:44:42,140 - INFO - [*] Give me a valid license for username: kytqUQK364NPZETc4CqdmMxcdMH
2025-01-19 12:44:42,140 - INFO - Generating license for kytqUQK364NPZETc4CqdmMxcdMH
2025-01-19 12:44:56,197 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZToga3l0cVVRSzM2NE5QWkV
UYzRDcWRtTXhjZE1IClNlcmlhbD
ogMVFyM1NxeUczMUNyOTNvc3VLV
lUyNElwS21WbWV0cmRHSWFXClR5
cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:44:56,238 - INFO - Valid admin license for kytqUQK364NPZETc4CqdmMxcdMH!
2025-01-19 12:44:56,239 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:44:56,239 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:44:56,239 - INFO - [*] Give me a valid license for username: homWwAYJatKX
2025-01-19 12:44:56,239 - INFO - Generating license for homWwAYJatKX
2025-01-19 12:45:07,007 - INFO - Generated license:
----BEGIN WHITE LICENSE----
TmFtZTogaG9tV3dBWUphdEtYClN
lcmlhbDogdzA4WGdEVDRnM0VqVz
h0TVNiRUpRRU5YZUNMemNTODd6U
VhGClR5cGU6IDEzMzcK
-----END WHITE LICENSE-----
2025-01-19 12:45:07,047 - INFO - Valid admin license for homWwAYJatKX!
2025-01-19 12:45:07,047 - INFO - Well done! Here is the flag for the Junior challenge:
2025-01-19 12:45:07,047 - INFO - FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
2025-01-19 12:45:07,048 - INFO - Well done! Here is the flag for the Pinkman challenge:
2025-01-19 12:45:07,048 - INFO - FCSC{9600becd765ca03baa623504244e008e6f3348bce0219fe4027432d790dd074f}
No more output from the Docker container. Exiting.
2025-01-19 12:45:07,062 - INFO - Netcat connection closed
On voit qu’il y a 50 demandes de licences, et, surprise, 2 flags :
-
un flag pour “the Junior Challenge”, qui se répète tout le temps :
FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
-
un flag pour “the Pinkman Challenge”, qui consistait donc à répondre correctement à toutes les demandes :
FCSC{9600becd765ca03baa623504244e008e6f3348bce0219fe4027432d790dd074f}
Maintenant que le challenge est résolu, si on regarde dans le container :
$ ls -l
total 32
-r-x------ 1 ctf ctf 17784 Apr 8 2024 fifty-shades-of-white
-r-------- 1 ctf ctf 2827 Apr 8 2024 fifty-shades-of-white.py
-r-------- 1 ctf ctf 71 Apr 8 2024 flag-pinkman.txt
-r-------- 1 ctf ctf 70 Apr 8 2024 flag.txt
$ cat flag.txt
FCSC{2053bb69dff8cf975c1a3e3b803b05e5cc68933923aabdd6179eace1ece0c41a}
$ cat flag-pinkman.txt
FCSC{9600becd765ca03baa623504244e008e6f3348bce0219fe4027432d790dd074f}
$ cat fifty-shades-of-white.py
import os
import random
import string
import subprocess
# check la licence en appelant le programme fifty-shades-of-white
def checkSerial(name, license_file):
with subprocess.Popen(['/app/fifty-shades-of-white', license_file],
stdout = subprocess.PIPE,
stdin = subprocess.PIPE,
bufsize = 1,
universal_newlines = True) as proc:
res = proc.stdout.readline().strip()
res2 = proc.stdout.readline().strip()
res3 = proc.stdout.readline().strip()
if "invalid" in res.lower():
print(res)
return False, False
if name == "Walter White Junior" and f"Valid admin license for {name}!" in res:
print(res)
print(res2)
print(res3)
return True, True
if f"Valid license for {name}!" in res:
print(res)
return True, False
if f"Valid admin license for {name}!" in res:
print(res)
print(res2)
print(res3)
return True, True
def randomString():
password_characters = string.ascii_letters + string.digits
length = random.randint(12, 32)
return ''.join(random.choice(password_characters) for i in range(length))
def readLicenseToFile():
license = []
while True:
r = input().strip()
license.append(r)
if len(r) == 0:
break
content = "\n".join(license)
if len(content) > 1024:
print("Error: content too large.")
exit(1)
license_file = randomString()
license_file = f"/dev/shm/{license_file}"
with open(license_file, "w") as fp:
fp.write(content)
return license_file
def check(username, adminCheck = False):
if adminCheck:
print(f"[*] Give me a valid admin license for username: {username}")
else:
print(f"[*] Give me a valid license for username: {username}")
try:
license_file = readLicenseToFile()
except:
exit(1)
valid, is_admin = checkSerial(username, license_file)
if not valid:
return False
# Here, license is valid (either for type 'user' or 'admin')
# Remove temp file before returning
os.remove(license_file)
if adminCheck:
# Return True only if the type is indeed admin
return is_admin
else:
# Return True for any type
return True
if __name__ == "__main__":
print(f"[*] Send empty lines to mark the end of your inputs.")
try:
assert check("Walter White Junior", adminCheck = True), "Error: You need to provide an admin license!"
except AssertionError as e:
print(e)
exit(1)
try:
# demande de licence pour chaque personnage emblématique de Breaking Bad
assert check("Jesse Pinkman")
assert check("Saul Goodman")
assert check("Gus Fring")
assert check("Hank Schrader")
assert check("Mike Ehrmantraut")
assert check("Tuco Salamanca")
# quelques demandes de licences avec génération d'un nom au hasard
for _ in range(43):
username = randomString()
assert check(username)
flag = open("flag-pinkman.txt").read().strip()
print(f"Well done! Here is the flag for the Pinkman challenge:");
print(flag)
except:
exit(1)