Principe:
Brute-forcer un mot de passe caractère par caractère
Infos (cf menu latéral):
🚩 Flaggué! +978 points gagnés —
💾 Téléchargez les fichiers du challenge
404CTF{M3RC1_PY7H0N3.10_P0UR_L3_M47CH}
Le challenge
Un faux random
rd.seed(s[n]); return rd.randint(0,30) == f and c(rest, n + 1)
On va donc se faire un script rands.py qui va constituer un array FS tel qu'on ait FS[i] = {rd.seed(s[i]); rd.randint(0,30)} et on pourra se passer dorénavant du random
Le reverse, `c()` facile
c() réalise en fait une comparaison de chaines de caractères via match: on peut donc se passer de cette fonction. On tester des mots de passe de longueur différente, jusqu'à ce que b() soit de la même longueur que FSBrute force?
b()[i] et FS[i]: la meilleure sera considérée comme le bon char
Ma screen n'est pas correcte ici car le at_place n'était pas 0. En revanche, on voit bien qu'une seule valeur (ASCII 78) a maximisé le nombre de correspondances justes entre b() et FS, signifiant que ce caractère est un N (ASCII 78 ou 0x4E)
32,128 (caractères ASCII imprimables)Flag
On n'était même pas obligé de supprimer le "random": le même bruteforce aurait sans doute marché en le conservant.
Flag: 404CTF{M3RC1_PY7H0N3.10_P0UR_L3_M47CH}