Le principe du code PHP est d'envoyer un message composé que de "0" sauf pour un seul bit:
si le serveur répond "1", c'est que ce bit est à "1" (car le serveur fait un & binaire
avec le secret avant de nous dire si le nombre de "1" du résultat est impair), sinon, il est à 0
Redondance
On dispose de quelques essais en plus, qui vont servir à déterminer le bit "menti" par dichotomie:
le PHP affiche maintenant la valeur SECRET qu'il a déterminée, et il tente de savoir quel
bit est inversé (j'ai forcé le secret à 0, et le mensonge au 1er bit pour tester)
On envoie un payload de 64 "0" suivit de 64 "1": si la parité retournée correspond à celle qu'on a
(Parity Matches), alors le mensonge est sur les bits "0" (l'un des 64 premiers), sinon,
sur l'un des 64 derniers
Après ce premier payload, on a donc divisé par 2 les emplacements possibles du mensonges:
on va réitérer les payloads jusqu'à n'avoir qu'un seul bit
Le second payload est une succession de 32 "0", puis 32 "1", puis 32 "0" puis 32 "1",…
Flag
Un peu de détail
Voici un exemple sur 8 bits de l'algorithme, pour aider à la compréhension du système de parité.
On rappelle que le serveur répond "1" s'il y a un nombre impair de "1" dans
Message reçu par python &_binaire Secret,
sauf dans 1 seul cas, où le serveur va mentir