
Un outil pour analyser le chiffrement xor multi-byte
Un outil pour faire des analyses xor :
Avis : xortool fonctionne désormais uniquement sur Python 3. L'ancienne version Python 2 est accessible sur la branche py2. Le paquet pip a été mis à jour.
$ pip3 install xortool
Pour le développement ou la construction de ce dépôt, poetry est nécessaire.
poetry build
pip install dist/xortool*.whl
xortool
A tool to do some xor analysis:
- guess the key length (based on count of equal chars)
- guess the key (base on knowledge of most frequent char)
Usage:
xortool [-x] [-m MAX-LEN] [-f] [-t CHARSET] [FILE]
xortool [-x] [-l LEN] [-c CHAR | -b | -o] [-f] [-t CHARSET] [-p PLAIN] [-r PERCENT] [FILE]
xortool [-x] [-m MAX-LEN| -l LEN] [-c CHAR | -b | -o] [-f] [-t CHARSET] [-p PLAIN] [-r PERCENT] [FILE]
xortool [-h | --help]
xortool --version
Options:
-x --hex l'entrée est une chaîne hexadécimale
-l LEN, --key-length=LEN longueur de la clé
-m MAX-LEN, --max-keylen=MAX-LEN longueur maximale de clé à tester [par défaut : 65]
-c CHAR, --char=CHAR caractère le plus fréquent (un caractère ou code hexadécimal)
-b --brute-chars forcer brutalement tous les caractères les plus fréquents possibles
-o --brute-printable identique à -b mais ne vérifie que les caractères imprimables
-f --filter-output filtrer les sorties en fonction du jeu de caractères
-t CHARSET --text-charset=CHARSET jeu de caractères du texte cible [par défaut : imprimable]
-p PLAIN --known-plaintext=PLAIN utiliser un texte clair connu pour le décodage
-r PERCENT, --threshold=PERCENT pourcentage de validité seuil [par défaut : 95]
-h --help afficher cette aide
Notes:
Text character set:
* Pre-defined sets: printable, base32, base64
* Custom sets:
- a: lowercase chars
- A: uppercase chars
- 1: digits
- !: special chars
- *: printable chars
Examples:
xortool file.bin
xortool -l 11 -c 20 file.bin
xortool -x -c ' ' file.hex
xortool -b -f -l 23 -t base64 message.enc
xortool -b -p "xctf{" message.enc
xortool -r 80 -p "flag{" -c ' ' message.enc
# xor is xortool/xortool-xor
tests $ xor -f /bin/ls -s "secret_key" > binary_xored
tests $ xortool binary_xored
The most probable key lengths:
2: 5.0%
5: 8.7%
8: 4.9%
10: 15.4%
12: 4.8%
15: 8.5%
18: 4.8%
20: 15.1%
25: 8.4%
30: 14.9%
Key-length can be 5*n
Most possible char is needed to guess the key!
# 00 is the most frequent byte in binaries
tests $ xortool binary_xored -l 10 -c 00
...
1 possible key(s) of length 10:
secret_key
# decrypted ciphertexts are placed in ./xortool_out/Number_<key repr>
# ( have no better idea )
tests $ md5sum xortool_out/0_secret_key /bin/ls
29942e290876703169e1b614d0b4340a xortool_out/0_secret_key
29942e290876703169e1b614d0b4340a /bin/ls
L'utilisation la plus courante est de passer simplement le fichier chiffré et le caractère le plus fréquent (généralement 00 pour les binaires et 20 pour les fichiers texte) - la longueur sera choisie automatiquement :
tests $ xortool tool_xored -c 20
The most probable key lengths:
2: 5.6%
5: 7.8%
8: 6.0%
10: 11.7%
12: 5.6%
15: 7.6%
20: 19.8%
25: 7.8%
28: 5.7%
30: 11.4%
Key-length can be 5*n
1 possible key(s) of length 20:
an0ther s3cret \xdd key
Ici, la clé est plus longue que la limite par défaut de 32 :
tests $ xortool ls_xored -c 00 -m 64
The most probable key lengths:
3: 3.3%
6: 3.3%
9: 3.3%
11: 7.0%
22: 6.9%
24: 3.3%
27: 3.2%
33: 18.4%
44: 6.8%
55: 6.7%
Key-length can be 3*n
1 possible key(s) of length 33:
really long s3cr3t k3y... PADDING
Donc, si le déchiffrement automatique échoue, vous pouvez calibrer :
-m) longueur maximale pour essayer des clés plus longues-l) longueur sélectionnée pour voir des clés intéressantes-c) le caractère le plus fréquent pour produire le bon texte clairNous recevons un message encodé en Base64 et XORé avec une clé inconnue.
# xortool message.enc
The most probable key lengths:
2: 12.3%
4: 13.8%
6: 10.5%
8: 11.5%
10: 8.6%
12: 9.4%
14: 7.1%
16: 7.8%
23: 10.4%
46: 8.7%
Key-length can be 4*n
Most possible char is needed to guess the key!
Nous pouvons maintenant tester les longueurs de clé tout en filtrant les sorties pour ne conserver que les textes clairs correspondant au jeu de caractères Base64. Après avoir essayé quelques longueurs, nous trouvons la bonne, qui ne donne qu'un seul texte clair avec un pourcentage de caractères valides supérieur au seuil par défaut de 95%.
$ xortool message.enc -b -f -l 23 -t base64
256 possible key(s) of length 23:
\x01=\x121#"0\x17\x13\t\x7f ,&/\x12s\x114u\x170#
\x00<\x130"#1\x16\x12\x08~!-\'.\x13r\x105t\x161"
\x03?\x103! 2\x15\x11\x0b}".$-\x10q\x136w\x152!
\x02>\x112 !3\x14\x10\n|#/%,\x11p\x127v\x143
\x059\x165\'&4\x13\x17\r{$("+\x16w\x150q\x134\'
...
Found 1 plaintexts with 95.0%+ valid characters
See files filename-key.csv, filename-char_used-perc_valid.csv
En filtrant les sorties sur le jeu de caractères Base64, nous conservons directement la seule solution.
Auteur : hellman
Licence : Licence MIT