The Ugandan Labyrinth

Flag: CYBN{d4_w4y_1s_n0t_th3_34s13st_but_th3_funn13st}

Challenge

file-archive
21KB
circle-info

Description


Je sais pas comment t'as fait ton compte mais on dirait que tu es totalement perdu... Heureusement pour toi, si tu observes de manière méthodique le labyrinthe qui se dresse devant toi, tu devrais pouvoir t'en sortir !

Solution

Décompilation avec Ghidra. Les symboles n'ont pas été retirés pour faciliter le challenge. On commence par le challenge 1.

Challenge 1

On peut voir ligne 14 une comparaison avec Knuckles > Sonic, c'est le mot de passe attendu.

uint challenge_1(int socket) {
  int iVar1;
  size_t sVar2;
  char local_318 [0x100];
  char local_218 [0x208];
  uint local_10;
  int local_c;
  
  snprintf(local_218,0x200,"Un temple sacré se dresse devant toi, seul celui qui connaît la phrase sacrée peut espérer entrer.\nMais attention, si tu te tro mpes des Ugandan Knights viendront s\'occuper de toi !\n> ");
  sVar2 = strlen(local_218);
  send(socket,local_218,sVar2,0x0);
  memset(local_218,0x0,0x200);
  local_c = read_line(socket,(long)local_318,0xff);
  iVar1 = strcmp(local_318,"Knuckles > Sonic");
  local_10 = (uint)(iVar1 == 0x0);
  if (local_10 == 0x0) {
    snprintf(local_218,0x200,"\nLes Ugandan Knights se retournent vers toi... commencent à faire des cliquetis... et attrapent leurs armes ! CAVALE KENNY, C AVALE !\n");
  }
  else {
    snprintf(local_218,0x200,"\nLa porte du temple s\'ouvre tandis les Ugandan Knights ne font même pas attention à toi. Tu décides d\'entrer à la recherche  du trésor !\n");
  }
  sVar2 = strlen(local_218);
  send(socket,local_218,sVar2,0x0);
  return local_10;
}

Challenge 2

Ligne 18, on appelle check_challenge_2 avec ce qui a été lu dans le socket et local_1c, c'est-à-dire la valeur 0x3d923435fe5b07e4.

Maintenant, on regarde check_challenge_2 :

On comprend donc que local_1c est le résultat attendu des octets conservés du hash. Comme on connait cette valeur et qu'il n'y a que 4 caractères possibles répétés 10 fois (4 puissance 10 = 1048576 possibilités), on peut bruteforce localement.

En python ça donne :


Obtention du flag

Il suffit de se connecter et envoyer ces infos

Mis à jour