LeHack 19 - HackHackLeHack

Posted on dim. 07 juillet 2019 in CTF

File : HackHackLeHack.flac

HackHackLeHack
200 Points - Hard
HackHackLeHack

Url: https://static.wargame.rocks/HackHackLeHack.flac

Afin de rendre le traitement plus facile, on commence par la conversion en mp3.

On l'écoutant, on remarque que le son est différent entre la gauche et la droite.

Gauche

On sépare les deux et on commence par écouter la gauche : Gauche.

Transform1

Il faut alors reporter les 0 et 1 qui sont donnés dans la piste audio. On obtiens :

0010111101101000001100110100110001001100001100000101111101100011001100010101000001101000001100110101001000100101

On la décode facilement depuis le terminal en utilisant perl:

$ echo "0010111101101000001100110100110001001100001100000101111101100011001100010101000001101000001100110101001000100101" | perl -lpe '$_=pack"B*",$_'
/h3LL0_c1Ph3R%

On a une première chaîne de caractère. Mais c'est pas le flag :(. On poursuit alors avec la piste droite.

Droite

De base, on obtient ce rendu : Droite.

On remarque alors que deux mots se répètent sur la durée de la piste : le et hack. On peut donc supposer que cela correspond à un code binaire :

  • le pour 0
  • hack pour 1

La vitesse étant trop rapide pour suivre le rythme, on ralenti la piste : Droite ralentie. Des fréquences parasites apparaissent, on peut donc également les éliminer et isoler les fréquences correspondantes aux mots qui nous intéressent : Droite ralentie EQ.

L'ensemble est beaucoup plus facile de compréhension. Cependant, au vu de la durée de la piste, un découpage par octet permet de séparer et vérifier plus facilement la chaîne binaire reportée : Droite ralentie EQ coupée. Le résultat est une piste d'une durée de 8:55 min.

Transform2

Après de très nombreuses écoutes et vérifications, on obtiens ainsi la chaîne binaire suivante. On peut la décoder comme fait précédemment :

$ echo "01010011011000010110110001110100011001010110010001011111010111111110011011110110110100010111100101111101010110001000001110001110110101111000110111110010010010100000010000010000100101001100001111111110011111011101101111100110000000101110000010100010101011101000001101100010111001000000011110111101110001111001111100010110000010011011101010001011100010000110010111011110100110000011011101001100011011101000101110001000011011001000000100011001111100000100110011110001100100100100111011110101001010111100000110011001"| perl -lpe '$_=pack"B*",$_'
Salted__���y}X��׍�J���}��ࢮ�b��ǟ ���eޘ7Ln��l��L�N�+��

Une recherche sur le début de la chaîne de caractéres décodées nous indique que l'ensemble correspond au résultat d'un chiffrement avec un salt. On peut donc supposé que la première partie du fichier audio donne le salt correspondant au chiffrement.

On essaye donc de décoder avec openssl en précisant le salt via l'option -k (password to use) :

# les erreurs sont renvoyées vers /dev/null pour être sur d'affiché que le flag
$ echo "01010011011000010110110001110100011001010110010001011111010111111110011011110110110100010111100101111101010110001000001110001110110101111000110111110010010010100000010000010000100101001100001111111110011111011101101111100110000000101110000010100010101011101000001101100010111001000000011110111101110001111001111100010110000010011011101010001011100010000110010111011110100110000011011101001100011011101000101110001000011011001000000100011001111100000100110011110001100100100100111011110101001010111100000110011001"| perl -lpe '$_=pack"B*",$_'| openssl aes-256-cbc -salt -d -k "/h3LL0_c1Ph3R%" 2>/dev/null
flag: lh_1bd534f7046f509e2921a2dce3455a35

On a donc notre flag :D.