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.

  1. Finde die String Deobfuscation-Funktion

    1. Die Funktion sollte relativ Referenzen haben (Shortcut: X). Immerhin muss sie immer aufgerufen werden, wenn ein String verwendet wird.
    2. Sie sollte auf mindestens einen Speicherbereich zugreifen (der die verschlüsselten Daten enthält). Dieser kann als Argument übergeben werden.
    3. Falls sie ein symmetrisches Verschlüsselungsverfahren verwendet, benötigt die Funktion einen Schlüssel.
    4. 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.
    5. 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.
    6. 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.
    7. Folge am Entry-Point der Referenz dem Argument lpStartAddress von CreateThread.
    8. Das Argument hat den Namen FUN_10010a26.
    9. Der erste Aufruf der String-Obfuscation Funktion kommt in der Funktion thunk_FUN_1001313f vor.
    10. Überspringe die Schleife, die bis 0x280 zählt. Sie hat mit etwas anderem zu tun.
    11. 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.
  2. Simuliere den Algorithmus zum deobfuscaten von Strings

    1. Es ist ein Stream-Cipher
    2. Schaue dir Seite 7 im Handout an.
    3. Der Algorithmus ist in zwei Teile FUN_10012cf7 und FUN_10012d4f aufgeteilt.
    4. Was passiert mit dem ersten Paramter an diese beiden Funktionen?
    5. Analysiere die erste Schleife in FUN_10012cf7.
    6. Es ist RC4. Woher kommt der Schlüssel und woher die Daten?
    7. 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?
    8. 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.
    9. Folglich sind param_1, param_3 und, param_5 vom Typ byte * und param_2 und param_4 vom Typ byte *.
    10. Finde Referenzen/Aufrufe auf die äußere Funktion (FUN_100122f9) (Shortcut X). Was sind Beispiele für Argumente, die an diese Funktion übergeben werden?
    11. 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?
    12. 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 *.
    13. 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.
    14. 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.
    15. Die String-Entschlüsselung könnte in Cyberchef so aussehen: Cyberchef Screenshot
  3. Bereite dich auf das Quiz vor.

    1. Das Quiz kann man komplett mit entschlüsselten Strings und mutigen Annahmen bearbeiten.
    2. Decrypte lange Strings
    3. An Stellen, wo lange Strings entschlüsselt werden, kommen manchmal auch etwas kürzere Strings vor, die auch Interessant sein können.
    4. Die innere Funktion (FUN_10013008) wird noch an anderen Stellen aufgerufen.