Nochmal zum Thema llvm / Sudo Null IT News

Die Recherche einer Anwendung ist ein ziemlich routinemäßiger und langwieriger Prozess. Ohne den Einsatz von Tools und Automatisierung ist es fast unmöglich, selbst die einfachsten Algorithmen zu analysieren, die in einigen Programmiersprachen geschrieben wurden. (Laufzeit ohne Symbole gehen). Die folgenden Anwendungen können diese schwierige Aufgabe bewältigen und bieten eine Reihe von Tools:

  • Trichter

  • IDA Pro

  • Ghidra

  • Radar2

  • Rizin

Die Liste enthält nur diejenigen, die ständig gehört und auf der ganzen Welt bekannt sind. Versuchen wir, unseren Artikel zu verstehen, wie diese Anwendungen Assembler-Listings parsen und Pseudocode erstellen können. Ist es möglich, ein Projekt zu finden, das es ermöglicht, einfach eine Änderung an einem Assembler-Listing vorzunehmen, ohne komplexe Parser schreiben zu müssen?

Geschichte über llvm

Die in der Einleitung beschriebenen Tools sind interaktive Disassembler. Sie helfen Ihnen, einen einfachen Überblick über Befehle und eine grobe Codestruktur zu erhalten. Ein zusätzliches Feature, das die Tools haben, ist die Dekompilierungsfunktion. Es ist eine Transformation von Low-Level-Befehlen in Pseudocode, der der Programmiersprache C sehr ähnlich ist.

Unten sehen Sie ein Beispiel für eine disassemblierte Binärdatei für das Linux-Betriebssystem:

Dies ist eine zerlegte Auflistung der Anwendung. Um zu verstehen, welche Aktionen im Algorithmus ausgeführt werden sollten und was der Entwickler geschrieben hat, müssen Sie ganze Gruppen von Assemblercode in einer Aktion kombinieren. Tatsächlich handelt es sich hierbei um eine Optimierung – Dutzende von Befehlen werden vereinfacht, um schließlich eine lesbare Auflistung zu erhalten. Um dies bei einer Vielzahl von Varianten von Montageanleitungen zu ermöglichen, wird eine Zwischendarstellung verwendet.

Die Zwischendarstellung kann auf einer selbstentwickelten Sprache basieren. So funktionieren alle existierenden Decompiler. Manchmal finden Sie in Anwendungen die Verwendung des llvm-Projekts, dieses Projekt ermöglicht es, eine Zwischendarstellung von Montageanleitungen zu erstellen, die in Zukunft effektiv optimiert werden kann.

Einige der interaktiven Disassembler erstellen ihre eigenen Engines, um Daten in Pseudocode zu optimieren und darzustellen. Dies sind hauptsächlich Closed-Source-Projekte und deren Studium ohne Erlaubnis des Eigentümers ist gesetzlich geschützt, daher können wir nur Open-Source-Projekte verwenden, um Funktionen zu überprüfen. Versuchen wir, die Funktionen des Decompilers anhand eines Beispiels zu betrachten retdec.

Das Besondere am Projekt retdec

Das Projekt ist ein Wrapper für llvm und ermöglicht es Ihnen, jeden Datensatz zu analysieren, von proprietären Formaten von Betriebssystemen bis hin zu reinen Rohdatensätzen, die aus dem Speicher von Geräten und Mikrocontrollern abgerufen werden können.

Das Projekt enthält 3 Arten von Dateien, die sowohl für die Integration des Tools in Ihre Anwendungen als auch für die unabhängige Verwendung verwendet werden können. Liste der Dateien:

  1. Bibliotheken für den Decompiler

  2. Tools, die im Wesentlichen zusammen zum Kompilieren verwendet werden können

  3. Skripte, die Tools so kombinieren, dass alle Operationen automatisch ausgeführt werden

Alle beschriebenen Dateien können in jedem Build gefunden werden, das im Projekt-Repository verfügbar ist. Freigabeinhalt sieht so aus:

Anwendung des Projekts für die Forschung

Lassen Sie uns versuchen, das Projekt zu verwenden, um den Code zu optimieren, der ziemlich schwierig zu analysieren ist. Unten ist ein Diagramm dieses Codes, damit Sie den Umfang des Problems einschätzen können:

Der Graph enthält viele Konstruktionen und Bedingungen, die nicht zur Optimierung in Standard-Decompilern hinzugefügt werden können. Lassen Sie uns versuchen, dieses Diagramm zu optimieren. Nehmen Sie dazu das retdec-Projekt und versuchen Sie, es zu erstellen.

Eine vollständige Liste der Befehle für jedes Betriebssystem befindet sich auf der Hauptseite des Repositorys. Die virtuelle Maschine konnte in 2 Stunden mit Parametern von 4 GB RAM kompiliert werden.

retdec hat die Fähigkeit, mit einem bestimmten Bereich innerhalb einer Datei zu arbeiten. Dazu benötigen Sie:

  1. Adresse in Datei lokalisieren (virtuelle Adresse)

  2. Führen Sie den Befehl aus – python3 retdec.py crackme –select-ranges 0xfrom-0xto –select-decode-only Der Befehl sollte im Verzeichnis eine Zwischendarstellung des Dateistücks hinterlassen, das im Bereich angegeben wurde. Versuchen wir, einen Bereich zu übergeben, der Teil der verschleierten Funktion ist.

Wir verwenden Ghidra für die Datenlokalisierung:

Eine Datei namens crakme.ll ist im aktuellen Verzeichnis verfügbar. Diese Datei enthält Befehle, die dieselbe Zwischendarstellungssprache oder IR darstellen.

Diese Daten können mit llvm in jede Version des Assembler-Listings konvertiert werden:

Arm-Architektur: llc -o crackme.asm -filetype=asm -march=arm crackme.ll

x86-Architektur: llc -o cracme.asm -x86-asm-syntax=intel -filetype=asm -march=x86-64 crackme.ll

mips architecture llc -o cracme.asm -filetype=asm -march=mips crackme.ll

Außerdem befindet sich im Verzeichnis eine zur Analyse verfügbare Datei mit der Erweiterung .c. Dies ist bereits das dekompilierte Listing:

Fassen wir zusammen, was das alles bedeutet:

  1. Beim Arbeiten mit einer Datei kann retdec beliebige Daten auswählen und versuchen, sie als Befehle darzustellen

  2. Dargestellte Befehle können für jede Architektur konvertiert werden

  3. Befehle werden zur einfacheren Analyse automatisch in Pseudocode übersetzt

Mit all diesen Funktionen können Sie:

  • Software auf andere Plattformen portieren. (Mit großen Krücken, aber es geht)

  • Probleme der Code-Optimierung und Entfernung von Junk-Befehlen lösen.

Für Letzteres ist hier ein gutes Beispiel dafür, wie sich ein Stück Code nach der Optimierung verändert hat. Links ist der Originalcode, rechts der optimierte Code:

Dementsprechend konnte der standardmäßig mit ghidra mitgelieferte Decompiler den links befindlichen Code nicht in Pseudocode umwandeln.

Somit kann retdec sowohl zur Optimierung des Assembler-Listings als auch zur Dekompilierung verwendet werden.

Das ist alles. Am Vorabend des Beginns des Reverse Engineering-Kurses lade ich alle ein Kostenlose Demo in deren Rahmen wir typische Methoden zum Einschleusen von Code betrachten, die von bösartigen Programmen verwendet werden. Außerdem werden wir herausfinden, wo der Code eingefügt wird, welche Felder der ausführbaren Dateien bearbeitet werden, und wir werden die Implementierung in der Praxis manuell vornehmen.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *