Grover 2/2 (Quantique) - 404CTF2025

Principe:
Retrouver le flag quantique avec un Grover partiel

Infos (cf menu latéral):
🚩 Flaggué! +495 points gagnés — 💾 Téléchargez les fichiers du challenge
404CTF{011001010000000100011011}

Le challenge

L'énoncé du challenge

Installation

Comme précédemment, on fait un venv Python, un pip pour installer poetry, un poetry pour installer le bazar et on lance jupyter
J'ai toujours mes bugs d'affichage, donc, je 'fix' le code comme pour le 1er challenge
Les print nous seront utiles
On est prêt!

Au bluff

Desfois que, on tente au bluff de mettre toutes les portes… le serveur refuse, dommage! 😄
De même, si on teste brutalement sans réfléchir, on ne voit pas de pattern qui ressorte de la réponse
Une lecture rapide du code serveur nous confirme qu'il n'y a pas de faille à ce niveau là, donc on va devoir trouver une solution 'legit'

Setup local

On commence donc par se faire un test en local, avec nos angles d'entrée et nos portes manquantes

Mathématiquement, il est très probable que le rôle des qbits soit symétrique et donc interchangeable. Autrement dit, qu'on pose les portes sur les 2 derniers, les 2 premiers, ou n'importe quels qbits, ce devrait être pareil. Je choisis donc de les poser sur les n-2 premiers qbits.

En revanche, pour l'instant, j'ignore sur quels qbits et avec quels valeurs d'angles utiliser mes portes U

Avec un Flag connu

Histoire d'y voir clair, on va changer l'affichage des probabilités pour n'avoir que les plus élevées (les probas les plus élevées pour chaque flag possible)
C'est plus joli. Quelques proba se détachent, mais il ne devrait y avoir qu'un seul flag

En plus, ces probas élevées ne sont pas le flag 'connu' sur lequel on fait nos tests

On va maintenant procéder à un test: on ignore 2 des bits du flag, mais si on considère qu'on les connait?
Alors la proba du Flag crève le plafond!
Et si on fixe les deux qbits sans porte à des valeurs erronnées, là, aucune proba ne ressort clairement

L'idée va donc être simplement de faire 4 requetes, avec les 4 combinaisons de 2 premiers qbits possibles, et de garder la combinaison qui n'a qu'une seule probabilité élevée en sortie

Automatisation

On va faire automatique pour cela (même si on pourrait faire 4 requetes à la main, pour chaque moitié de flag)
On lance cela avec notre flag de test, et on voir la proba du Flag ressortir nettement
Mais j'ai encore des doutes sur ma gestion du boutisme (aka, l'ordre des bits)
Je teste, et patatras, rien ne ressort!
Avec un petit test sur les angles, je vois rapidement le problème…
… mes angles pour le bit 1 étaient simplement incorrects (on se fichera du 0 if X else 0 qui pourrait se simplifier 😄)

Flag

On balance la même chose en requêtant le serveur
Zut, rien ne ressort!
Hé, crème d'andouille que je suis, j'ai oublié qu'on a 10 portes, pas 5!
Mais à nouveau, bof, rien…

Il me vient alors une idée: comme l'ordre de mes bits est peut-etre incorrect, et si au lieu de tester toutes les combinaisons des 2 premiers bits, je fixais 2 bits (consécutifs) à zéro, que je fais 'glisser' le long du flag sur tous les emplacements possibles?

Cette technique marche toujours, sauf si le flag est 0101…01 ou 111…111 puisqu'il n'y aurait alors aucun 00 dans le Flag

Je teste donc cette méthode, avec un flag connu, en faisant 'glisser' mon 00 le long du flag
Le Flag de test ressort alors régulièrement!
Je tente la même chose sur le serveur
Et là aussi, une combinaison ressort 000010100110
Je me la note
Je fais pareil sur la seconde moitié du flag
Et crack, loupé, premier fail
J'en déduis donc juste que j'ai oublié d'inverser l'ordre des bits de chaque bloc, et là, ça passe

Flag: 404CTF{011001010000000100011011}