Sodinokibi/Revil
ef6a96bf68ec54d78f4f4cd304acc6718f9dfe398f368bc1e5b127bd746302f2
Diese Seite soll dir bei der statischen Analyse des Sodinokibi/REvil Samples mit dem obigen SHA256 Hash helfen. Du
musst JavaScript aktivieren, damit sie korrekt funktioniert. Alle Antworten und Hinweise sind im Plaintext im
Quelltext enthalten, schaue dir diesen also nur an, wenn du nichts selbst herausfinden willst.
-
Finde die String Deobfuscation-Funktion
-
Die Funktion sollte relativ Referenzen haben (Shortcut: X). Immerhin muss sie
immer aufgerufen werden, wenn ein String verwendet wird.
-
Sie sollte auf mindestens einen Speicherbereich zugreifen (der die verschlüsselten Daten enthält).
Dieser kann als Argument übergeben werden.
-
Falls sie ein symmetrisches Verschlüsselungsverfahren verwendet, benötigt die Funktion einen Schlüssel.
-
Strings spielen in Software eine große Rolle. Ausserdem werden häufig nicht nur wichtige sondern einfach
alle Strings obfuscated. Folglich sollte der erste Aufruf der String Deobfuscation-Funtion im
Ausführungsfluss "nahe" am Entry-Point auftreten.
-
Der de-obfuscatete String wird wahrscheinlich direkt nach dem Aufruf der String-Obfuscation Funktion
verwendet. Dieser String kann der Rückgabewert der Funktion sein oder als Poinerargument übergeben
werden.
-
In C wird die Länge eines Buffers häufig explizit als Argument an eine Funktion übergeben. Sollte die
String-Deobfuscation funktion also einen Buffer erhalten, sollte sie auch seine Länge und evtl. auch den
Schlüssel und dessen Länge als Parameter erhalten.
-
Folge am Entry-Point der Referenz dem Argument lpStartAddress von CreateThread.
-
Das Argument hat den Namen FUN_10010a26.
-
Der erste Aufruf der String-Obfuscation Funktion kommt in der Funktion
thunk_FUN_1001313f vor.
-
Überspringe die Schleife, die bis 0x280 zählt. Sie hat mit etwas anderem zu tun.
-
FUN_100122f9 ist die String-Deobfuscation Funktion, sie leitet alle aufrufe an
FUN_10013008 weiter. Wir werden FUN_10013008 die
innere Funktion nennen und FUN_100122f9 die äußere.
-
Simuliere den Algorithmus zum deobfuscaten von Strings
-
Es ist ein Stream-Cipher
-
Schaue dir Seite 7 im Handout an.
-
Der Algorithmus ist in zwei Teile FUN_10012cf7 und FUN_10012d4f aufgeteilt.
-
Was passiert mit dem ersten Paramter an diese beiden Funktionen?
-
Analysiere die erste Schleife in FUN_10012cf7.
-
Es ist RC4. Woher kommt der Schlüssel und woher die Daten?
-
FUN_10012cf7 ist das Key-Scheduling, FUN_10012d4f die
eigentliche Verschlüsselung. Welche Daten werden jeweils an diese Funktionen übergeben? Wie gibt die
Funktion Daten zurück?
-
Die innere Funktion (FUN_10013008) hat 5 Parameter. Die ersten beiden sind
Schlüssel und Schlüssel-Länge, die nächsten beiden sind die verschlüsselten Daten und ihre Länge und der
letzte Paramter wird verwendet um das Resultat zurück zu geben.
-
Folglich sind param_1, param_3 und,
param_5 vom Typ byte * und param_2
und param_4 vom Typ byte *.
-
Finde Referenzen/Aufrufe auf die äußere Funktion (FUN_100122f9) (Shortcut
X). Was sind Beispiele für Argumente, die an diese Funktion übergeben werden?
-
Wie leitet die äußere Funktion (FUN_100122f9) die Daten an die innere Funktion
(FUN_10013008) weiter? Welche Paramter erhält die äußere Funktion und welchen Typ
haben sie?
-
param_1 ist vom Typ byte *.
param_2, param_3 und param_4 sind
vom Typ int und, param_5 ist wieder vom Typ
byte *.
-
Als erste Argument erhält die äußere Funktion (FUN_100122f9) einen großen
globalen Buffer. Das zweite Argument ist ein Offset in diesen Buffer. Die Daten dort werden als
RC4-Schlüssel gefolgt vom verschlüsselten String interpretiert. Dafür erhält die äußere Funktion als
dritten und vierten Parameter die Längen des Schlüssels und der Daten. Entschlüssle exemplarisch einige
Daten.
-
FUN_100122f9(DAT_1001d218, 0x832, 10, 0x15, out_string) ist ein Aufruf der
äußeren Funktion. Ein Doppelklick auf DAT_1001d218 führt im Disassembly zu den
Daten. Kopiere die Speicheradresse in die Zwischenablage und drück G. Füge die
Zwischenablage in das Feld von "Go To..." ein und addiere das Offset 0x832.
Klicke mit der rechten Maustaste in den Speicher und wähle "Data" -> "Create Array" und füge als Länge
10 ein. Nun ist der RC4 Schlüssel schon mal korrekt typisiert. Erstelle direkt
danach im Speicher auf die gleiche Weise ein weiteres Array, dises mal mit der Länge
0x15. Nun hat auch der verschlüsselte String den korrekten Typ.
-
Die String-Entschlüsselung könnte in Cyberchef so aussehen:
-
Bereite dich auf das Quiz vor.
-
Das Quiz kann man komplett mit entschlüsselten Strings und mutigen Annahmen bearbeiten.
-
Decrypte lange Strings
-
An Stellen, wo lange Strings entschlüsselt werden, kommen manchmal auch etwas kürzere Strings vor, die
auch Interessant sein können.
-
Die innere Funktion (FUN_10013008) wird noch an anderen Stellen aufgerufen.