Échauffement

404CTF{l_ech4uff3m3nt_3st_t3rm1ne}

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

Challenge

Description


Un bon échauffement permet non seulement d'éviter des blessures, mais aussi de conditionner son corps et son esprit au combat qui va suivre. Ce crackme devrait constituer un exercice adéquat.

Décompilation

Dans le main, on nous demande un mot de passe, puis la fonction secret_func_dont_look_here est appelée avec celui-ci.

int main() {
  int fail;
  char password [0x40];
  
  puts("Vous ne devinerez jamais le mot de passe secret ! Mais allez-y, essayez..");
  // Récupération du mot de passe
  fgets(password, 0x40, stdin);
  // Vérification
  fail = secret_func_dont_look_here(password);
  if (fail == 0) {
    puts("Wow, impressionnant ! Vous avez réussi !");
  }
  else {
    puts("C'est bien ce que je pensais, vous ne connaissez pas le mot de passe..");
  }
  return 0;
}

La fonction secret_func_dont_look_here fait une vérification caractère par caractère sur notre mot de passe. L'équation pour chacun est caractère * 2 - 1 = secret_caractère

int secret_func_dont_look_here(char *password) {
  size_t size;
  int fail;
  int i;
  
  size = strlen(secret_data);
  fail = 0;
  for (i = 0; i < (int)size; i = i + 1) {
    if ((char)(password[i] * 2 - i) != secret_data[i]) {
      fail = 1;
    }
  }
  return fail;
}

Résolution

Il suffit donc de récupérer les valeurs de secret_data et résoudre l'équation. On a donc :

password[i] = (secret_data[i] + 1) / 2

def solve():
    data = b'\x68\x5f\x66\x83\xa4\x87\xf0\xd1\xb6\xc1\xbc\xc5\x5c\xdd\xbe\xbd\x56\xc9\x54\xc9\xd4\xa9\x50\xcf\xd0\xa5\xce\x4b\xc8\xbd\x44\xbd\xaa\xd9'
    print(''.join([chr((data[i] + i) // 2) for i in range(len(data))]))

if __name__ == '__main__':
    solve()

Dernière mise à jour

Cet article vous a-t-il été utile ?