Nanocombattants

404CTF{fi3r_n4n0comb4ttant}

Catégorie: Reverse Difficulté: hard Flag: -

Challenge

4KB
Ouvrir

Description


Entrez dans l'arène

Le CHAUSSURE, cette fameuse entité pionnière dans le domaine du sport de combat a ouvert un tournoi pour tous les chat-diateurs qui souhaiteraient se mesurer au reste du monde. Il est l'heure d'aller se confronter dans l'arène, à un détail près... Une vérification est opérée à l'entrée, mais impossible de vous souvenir du mot de passe ! Retrouvez-le.

Format de flag : 404CTF{mot-de-passe}

Décompilation du binaire

Pour des questions de simplicité, j'ai commenté le code et zappé 2-3 lignes inutiles pour les explications.

Commençons déjà par le main, on voit qu'un mot de passe est demandé et que sa taille doit faire 19 caractères, sans quoi on ne rentre pas dans la fonction verify.

int main() {
  // ... des trucs inutiles
  puts("=================================================================================");
  puts("Bienvenue dans l\'arène ! Pour rentrer, saisissez le mot de passe du CHAUSSURE :  ");
  puts("_____                                                                       _____");
  puts("tez de me suivre, pleutre!");
  puts(" |||                                                                         ||| ");
  puts(" |||          ~Qu\'est-ce que tu peux faire contre le 404 CROU~               ||| ");
  puts(" |||            ~on a la méthode et les XOR qui rendent fou~                 ||| ");
  puts(" |||                                                                         ||| ");
  puts(
      "(___) ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈  (___)"
      );
  puts("");
  __printf_chk(0x1,"              >>> ");
  
  __isoc99_scanf("%255s",&password);
  size = strlen(password);
  if (size == 19) {
    verify(&password);
    code = 0x0;
  } else {
    perdu();
    code = -1;
  }
  
  return code;
}

Passons maintenant à la fonction verify mais on ne va pas s'amuser à tout décortiquer. Il suffit de voir que la boucle est parcourue 19 fois (si entre temps, on n'a pas terminé dans la fonction perdu) et qu'à chaque fois, l'adresse de notre password est incrémentée. Autrement dit, on vérifie très probablement notre mot de passe caractère par caractère.

Il faut juste retenir qu'à l'intérieur de la fonction joue_avec_les_regs, il y a un appel de ptrace avec le paramètre PTRACE_GETREGS.


Résolution

En lançant avec la commande strace et un mot de passe de 19 caractères, on voit 3 appels à la fonction ptrace avec PTRACE_GETREGS.

En fait, chaque tour de boucle dans la fonction verify déclenche 3 appels PTRACE_GETREGS. On peut donc tester tous les caractères pour savoir lequel nous fait passer au tour de boucle suivant en comptant le nombre d'appels à ptrace.

Mis à jour

Ce contenu vous a-t-il été utile ?