
Ein Werkzeug zur Analyse von Multi-Byte-XOR-Chiffren.
Ein Tool zur XOR-Analyse:
Hinweis: xortool läuft jetzt nur noch unter Python 3. Die alte Python-2-Version ist im py2-Zweig verfügbar. Das pip-Paket wurde aktualisiert.
$ pip3 install xortool
Für die Entwicklung oder das Erstellen dieses Repositorys wird poetry benötigt.
poetry build
pip install dist/xortool*.whl
xortool
Ein Tool zur XOR-Analyse:
- Erraten der Schlüssellänge (basierend auf der Anzahl gleicher Zeichen)
- Erraten des Schlüssels (basierend auf der Kenntnis des häufigsten Zeichens)
Verwendung:
xortool [-x] [-m MAX-LEN] [-f] [-t CHARSET] [DATEI]
xortool [-x] [-l LEN] [-c CHAR | -b | -o] [-f] [-t CHARSET] [-p PLAIN] [-r PERCENT] [DATEI]
xortool [-x] [-m MAX-LEN| -l LEN] [-c CHAR | -b | -o] [-f] [-t CHARSET] [-p PLAIN] [-r PERCENT] [DATEI]
xortool [-h | --help]
xortool --version
Optionen:
-x --hex Eingabe ist hex-kodierter String
-l LEN, --key-length=LEN Länge des Schlüssels
-m MAX-LEN, --max-keylen=MAX-LEN Maximale zu testende Schlüssellänge [Standard: 65]
-c CHAR, --char=CHAR Häufigstes Zeichen (ein Zeichen oder Hex-Code)
-b --brute-chars Brute-Force aller möglichen häufigsten Zeichen
-o --brute-printable Wie -b, prüft aber nur druckbare Zeichen
-f --filter-output Filtert Ausgaben basierend auf dem Zeichensatz
-t CHARSET --text-charset=CHARSET Zieltext-Zeichensatz [Standard: druckbar]
-p PLAIN --known-plaintext=PLAIN Verwendet bekannten Klartext zur Dekodierung
-r PERCENT, --threshold=PERCENT Schwellenwert für Gültigkeitsprozentsatz [Standard: 95]
-h --help Diese Hilfe anzeigen
Hinweise:
Text-Zeichensatz:
* Vordefinierte Sätze: printable, base32, base64
* Benutzerdefinierte Sätze:
- a: Kleinbuchstaben
- A: Großbuchstaben
- 1: Ziffern
- !: Sonderzeichen
- *: druckbare Zeichen
Beispiele:
xortool datei.bin
xortool -l 11 -c 20 datei.bin
xortool -x -c ' ' datei.hex
xortool -b -f -l 23 -t base64 nachricht.enc
xortool -b -p "xctf{" nachricht.enc
xortool -r 80 -p "flag{" -c ' ' nachricht.enc
# xor ist 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 ist das häufigste Byte in Binärdateien
tests $ xortool binary_xored -l 10 -c 00
...
1 possible key(s) of length 10:
secret_key
# Entschlüsselte Chiffretexte werden in ./xortool_out/Number_<key repr> abgelegt
# (mir fällt nichts Besseres ein)
tests $ md5sum xortool_out/0_secret_key /bin/ls
29942e290876703169e1b614d0b4340a xortool_out/0_secret_key
29942e290876703169e1b614d0b4340a /bin/ls
Die häufigste Verwendung ist, einfach die verschlüsselte Datei und das häufigste Zeichen (normalerweise 00 für Binärdateien und 20 für Textdateien) zu übergeben – die Länge wird automatisch gewählt:
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
Hier ist der Schlüssel länger als der Standardgrenzwert von 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
Wenn die automatisierte Entschlüsselung fehlschlägt, kannst Du also nachjustieren:
-m) Maximale Länge, um längere Schlüssel zu testen-l) Ausgewählte Länge, um einige interessante Schlüssel zu sehen-c) Das häufigste Zeichen, um den richtigen Klartext zu erhaltenWir haben eine Nachricht, die in Base64 kodiert und mit einem unbekannten Schlüssel XOR-verschlüsselt wurde.
# 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!
Wir können nun die Schlüssellängen testen, während wir die Ausgaben filtern, sodass nur die Klartexte behalten werden, die den Zeichensatz von Base64 enthalten. Nach einigen getesteten Längen stoßen wir auf die richtige, die nur einen Klartext mit einem Prozentsatz gültiger Zeichen über dem Standardschwellenwert von 95 % ergibt.
$ 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
Durch das Filtern der Ausgaben auf den Zeichensatz von Base64 behalten wir direkt die einzige Lösung.
Autor: hellman
Lizenz: MIT License