Crushing

Catégorie: Reverse Difficulté: easy Flag: HTB{4_v3ry_b4d_compr3ss1on_sch3m3}

Challenge

file-archive
5KB
circle-info

Description


Crushing is an Easy reversing challenge. Players will reverse engineer a 'compression' algorithm, then write a script to recover the original message.

Analyse du code

Dans le main, on voit que l’on initialise un tableau de 256 éléments, tous à 0.

Ensuite on rentre dans un while, tant que getchar() ne retourne pas -1 alors on appelle la fonction add_to_char_map avec notre tableau, le caracètre récupéré et le numéro du tour de boucle auquel nous somme.

On comprend donc par le nom de la fonction que notre tableau est une map à laquelle on va ajouter l’index de notre char

int main(void) {
  long i;
  undefined8 *key;
  undefined8 char_map [256];
  int c;
  long index;
  
  key = char_map;
  for (i = 0xff; i != 0; i = i + -1) {
    *key = 0;
    key = key + 1;
  }
  index = 0;
  while( true ) {
    c = getchar();
    if (c == -1) break;
    add_char_to_map((long)char_map,(byte)c,index);
    index = index + 1;
  }
  serialize_and_output((long)char_map);
  return 0;
}

On peut le confirmer en regardant la fonction add_to_char_map qui fait bien ce que l’on imaginait

circle-info

Exemple : Charmap de BAKA

La charmap ressemblera à :

Enfin, la fonction serialize_and_output qui va récupérer pour chaque key de notre map, sa valeur associé (c’est à dire la liste chainée d’index) et écrire pour chacun :

  • Le nombre d’index à lire ensuite

  • Tous les index

circle-info

Exemple : Sérialiser BAKA

En reprenant la charmap de l’exemple précedent, on écrira 0 pour chacune des listes vides, donc notre fichier commencera par 64 0

Puis arrivé à A (65), on écrira : 2 1 3 où 2 correspond au nombre d’index à lire ensuite et 1, 3 sont les index

Pour B on aura 1 0 et pour K on aura 1 2

Il faut tout de même souligner que toutes les valeurs sont écrite en sur 8 bytes. Donc il faut le prendre en compte pour ne pas se tromper pendant la déserialisation


Script de résolution

Mis à jour