Principe:
Brute-forcer les clefs de tatouage possible pour chaque entrée d'un journal, pour trouver quelle clef a permi de tatouer certaines entrées
Infos (cf menu latéral):
🚩 Flaggué! +496 points gagnés —
💾 Téléchargez les fichiers du challenge
404CTF{436333370349117}
Le challenge
Watermarking
G, green) "au hasard" en prenant le token précédent comme seed
Prendre le token précédent comme seed permet de rendre répétable l'opération. C'est indispensable pour vérifier le watermark car à chaque token N, la vérification va consister à confirmer que le token N+1 est bien dans G, les tokens conservés. Il faut donc que l'ensemble G ne soit pas aléatoire. En revanche, le choix du token dans G peut l'être.
Les données du challenge
Tester pour comprendre
Ici, le challenge ne nous a pas fourni de poids car on utilise un modèle standardisé, qui sera téléchargé depuis internet
print, on comprend le principe du tatouage Red/Green
Le principe est de générer N tokens (les Choix initiaux dont le \n fait partie) puis de discriminer la liste (True/False pour Green/Red) pour n'en garder qu'une partie (True). Cela nous donne les Nouveaux choix, parmi lesquels le modèle va choisir un token en fonction de sa probabilité (le Jeton choisi). Et de même avec chaque nouveau token prédit.
G des tokens admissibles n'est pas aléatoire, mais le choix du token dans G l'est.
Green et de voir si token N+1 est dans G
Pour une suite de tokens t(0),t(1),…,t(N) si le t(N+1) de la sortie, donnée dans le journal.json, ne fait pas partie du groupe Green qu'on aura généré, alors on saura que le token N+1 n'a pas pu venir d'une génération tatouée
Ici, j'ai démarré mon test au 12e token car il s'agit de la longueur de mon prompt de départ. Mais dans le challenge, on ne connait pas le prompt initial ni sa longueur!
key possible (dans un petit intervalle pour aller vite), je confirme que la seule clef de tatouage plausible est celle que j'avais utilisée: le concept marche!
1…999999 donné par le challenge, je m'aperçois que j'ai plusieurs clefs possibles!
Les plus observateurs (que moi) auront remarqué que j'ai pris 1…999999 au lieu de 1…99999 !
printant les choses à fond, j'ai constaté qu'il s'agit d'un caractère spécial dans certaines sorties (token 564)
Un challenge plus complexe aurait pu consister à trouver K clefs pour chaque entrée tatouée du journal, et à ne garder que la clef communes à tous les journaux tatoués. Mais cela aurait obligé à trouver comment les identifier, ce qui aurait pu être difficile.
Toutefois, des méthodes statistiques devraient permettre de le faire, en considérant par exemple la clef qui ne revient pas forcément à chaque entrée de journal (ne sachant si l'entrée est tatouée ou pas) mais qui revient le plus souvent dans tous les journaux.
On notera qu'il y a, pour chaque journal, deux clefs possibles. C'est normal, il y a un modulo dans l'algorithme aléatoire. J'ai donc pris, au pif, la valeur la plus petite. Théoriquement, les deux devraient valider le challenge, mais je ne peux pas le confirmer.
Flag: 404CTF{436333370349117}