[LINUX] Erstellen Sie einen rudimentären ELF-Packer

Ein Packer oder Binärschutz ist ein Mittel zum Schutz von Software vor Reverse Engineering. Malware-Autoren verwenden Packer, um der signaturbasierten Erkennung zu entgehen, z. B. um RE zu vereiteln. Ein wichtiger Teil des Packers ist der Stub-Code zum Wiederherstellen der geschützten Binärdatei, der normalerweise Techniken wie Anti-Debugging, Anti-VM und Anti-Emulator enthält, die die Analyse stören.

Entpacker sind in einigen Antivirenprogrammen implementiert. Soweit ich weiß, Kaspersky und Norton. Ein Entpacker ist ein Programm, das ein gepacktes Programm entpackt, dh die ursprüngliche Binärdatei extrahiert. Es gibt Entpacker, die nur von einem bestimmten Packer entpackt werden können, und Entpacker, die entpackt werden können, auch wenn im Voraus keine Informationen über den Packer vorliegen, z. B. wie der Packer das Programm wiederherstellt. Dies wird als Allzweck-Entpacker bezeichnet. Seit etwa 2005 werden Untersuchungen zu Allzweck-Entpackern durchgeführt und OmniUnpack, PolyUnpack, Pindemonium, Renovo, RAMBO usw. entwickelt.

Zu den bekannten PE-Packern gehören UPX und Armadillo, aber nur wenige sind tatsächlich in ELF erhältlich. Wenn es sich in der POC-Phase befindet oder nur auf der Folie erklärt wird, gibt es Shiva, Burneye, Mayas Schleier und so weiter. Ich empfehle Ihnen, einen Blick auf [Mayas Schleier] zu werfen (http://bitlackeys.org/#maya).

Wenn Sie einen Packer mit ELF erstellen möchten, ist Announcing Userland Exec eine gute Referenz. Schauen Sie sich auch [Modern Userland Exec] an (http://www.stratigery.com/userlandexec.html).

Ursprünglich musste der Packer das ursprüngliche Programm im Speicher wiederherstellen und die Ausführung darauf übertragen. Aber diesmal schreibe ich die Binärdatei auf die Festplatte und führe die ursprüngliche Binärdatei mit execve () aus. Die Funktion als Packer ist nicht gut, aber ich werde mit einer einfachen beginnen. Auf diese Weise sollten Sie beide 32-Bit- / 64-Bit-Programme packen können. Wenn Sie nichts über ELF wissen, empfehle ich Ihnen, zuerst die Referenz zu lesen. Das folgende Bild zeigt das Packen der Binärdatei, die Sie schützen möchten. Die linke Seite ist die Struktur einer normalen ELF-Binärdatei, und die rechte Seite ist der Zustand, in dem die Binärdatei gespeichert ist. Es gibt wahrscheinlich mehrere Möglichkeiten, die Binärdatei zu speichern, aber dieses Mal werde ich das Datensegment erweitern und die Binärdatei dort ablegen.

20190107153129.png                                   Zu diesem Zweck muss der Wert des Mitglieds des Programmkopfes des Datensegments geändert werden. Insbesondere müssen Sie nur die Größe der Binärdatei hinzufügen, die Sie in p_filesz und p_memsz im Programmheader des Stub-Binärdatensegments speichern möchten. Der Stub-Code muss seinen Versatz und seine Größe kennen, um den ursprünglichen Code wiederherzustellen. Sie werden nach dem Originalcode hinzugefügt. Daher ist die endgültige Struktur wie folgt.

20190107154440.png                                                         Wie ich vergessen habe, vergessen Sie nicht, diese Größen zu p_filesz und p_memsz hinzuzufügen, um die Größen und Offsets zu speichern. Außerdem habe ich vergessen, es in der Abbildung zu zeichnen, aber der Stub-Code muss auch den Schlüssel kennen, um den verschlüsselten Originalcode wiederherzustellen. Fügen Sie die Größe dafür hinzu. Das heißt, die Größe des ursprünglichen Datensegments + die Größe der Größe + die Größe des Versatzes + die Größe des Schlüssels ist die Größe des endgültigen Datensegments. Extrahieren Sie anschließend die Binärdatei aus Ihrem eigenen Datensegment, schreiben Sie sie auf die Festplatte und schreiben Sie den Stub-Code, um das Programm mit execve () auszuführen. Den Code dazu finden Sie unter GitHub. Wahrscheinlich sollte Linux gut funktionieren.

Laden Sie den Code herunter und geben Sie make ein, um eine Datei namens Wrapper zu erstellen.

Es kann mit "./wrapper die Binärdatei, die Sie packen möchten" gepackt werden, und eine ausführbare Binärdatei namens gepackt wird generiert. Der Code wurde in wenigen Stunden geschrieben und ist noch nicht vollständig (ich möchte nicht). Es ist fast gekritzelt, so dass Sie doppelte Funktionen und unklare Optionen sehen, aber Sie werden die Idee des Packens von Binärdateien verstehen. (Als nächstes werde ich etwas anständiger machen)

Recommended Posts

Erstellen Sie einen rudimentären ELF-Packer
Erstellen Sie einen Django-Zeitplan
Erstellen Sie ein Python-Modul
Erstellen Sie eine bootfähige LV
Erstellen Sie eine Python-Umgebung
Erstellen Sie einen Slack Bot
Erstellen Sie ein Wörterbuch in Python
Erstellen Sie einen (einfachen) REST-Server
Erstellen Sie eine Homepage mit Django
Erstellen Sie ein Python-Numpy-Array
Erstellen Sie eine Dummy-Datendatei
Erstellen Sie einen Django-Anmeldebildschirm
Erstellen Sie ein Klassenzimmer auf Jupyterhub
Erstellen Sie einen einfachen Textlint-Server
Erstellen Sie ein Verzeichnis mit Python
Erstellen Sie mit Flask einen CSV-Reader
Erstellen Sie mit tkinter eine Python-GUI
Erstellen Sie einen DI-Container mit Python
Schritte zum Erstellen eines Django-Projekts
Erstellen Sie einen Pandas-Datenrahmen aus einer Zeichenfolge.
Erstellen Sie ein verschachteltes Wörterbuch mit defaultdict
So erstellen Sie ein Conda-Paket
Erstellen Sie eine virtuelle Umgebung mit Python!
Erstellen Sie eine Binärdatei in Python
Erstellen Sie einen SlackBot-Dienst für Pepper
Erstellen Sie eine Linux-Umgebung unter Windows 10
Erstellen Sie eine Python-Umgebung in Centos
Wie erstelle ich eine Docker-Datei?
Erstellen Sie einen Unix Domain Socket-Server
Erstellen Sie eine 1-MByte-Zufallszahlendatei
Erstellen Sie ein universelles Dekorationsframework für Python
5 Möglichkeiten zum Erstellen eines Python-Chatbots
Erstellen Sie die CRUD-API mit der Fast API
Erstellen Sie einen Poisson-Stepper mit numpy.random
Erstellen Sie eine zufällige Zeichenfolge in Python
So erstellen Sie eine Konfigurationsdatei
Erstellen Sie mit Boost.Python einen C-Sprach-Wrapper
Erstellen Sie mit Django einen Datei-Uploader