CTF Tools

Wichtige Werkzeuge und Techniken für die Binäranalyse

#CTFs#C#Java#Intel x86-64 Assembly#Python#Linux#Android#Bachelorstudium#Studium

In Capture the Flag-Wettbewerben (CTFs) ist es oft notwendig, Binärdateien zu analysieren und zu manipulieren. Dazu werden oft spezielle Tools verwendet, die die Arbeit erleichtern. Im Modul "Angewandte Binäranalyse" haben wir eine Vielzahl dieser Tools kennengelernt, die man dazu verwenden kann und die ich hier vorstellen möchte.

Desktop Tools

Hex Editor

Ein Hex Editor kann verwendet werden, um Binärdateien byteweise zu bearbeiten. Besonders hilfreich sind Editoren, die auf einer Seite die Bearbeitung und daneben die Darstellung in ASCII oder UTF-8 anzeigen. Es gibt viele Varianten, z.B. als VS Code-Erweiterung oder integriert in Ghidra.

Hex Editor in Ghidra

Der Hex Editor in Ghidra lässt sich über das Bytes-Menü öffnen.

Ghidra Hex EditorGhidra Hex Editor

Hex Editor in VS Code

Hex Editor in VS Code

Ghidra

Ghidra ist ein Reverse-Engineering-Tool, das von der NSA entwickelt wurde und seit 2019 als Open Source verfügbar ist. Es bietet Funktionen wie Disassemblierung, Code-Analyse und Graphendarstellung – ein vielseitiges Tool für die Binäranalyse.

Referenzen

Im oft verwirrenden Dekompilat von Ghidra können Referenzen zu Variablen helfen, den Überblick zu behalten. Ein Rechtsklick auf eine Variable und die Auswahl von "References" zeigt alle Verwendungen im Code.

Referenzen in Ghidra

Umbenennen und Retyping von Variablen

Variablen können in Ghidra umbenannt und ihr Typ geändert werden – ein wichtiger Schritt, um den Code besser zu verstehen. Ist eine Variable im C-Code ausgewählt, kann sie mit L umbenannt und mit CTRL+L der Typ geändert werden.

Umbenennen und Retyping in Ghidra

Das gilt auch für Variablen im Assembly-Code im meist linken Fenster. Durch die Auswahl eines passenden Typs werden diese leichter lesbar.

Umbenennen und Retyping in Ghidra

Process Monitor

Process Monitor ist ein Windows-Tool zur Überwachung von Dateisystem- und Registry-Aktivitäten. Es zeigt, welche Dateien ein Programm öffnet oder verändert.

Process Monitor

strace und ltrace

Unter Linux zeigen strace und ltrace die System- bzw. Library-Aufrufe eines Programms an. So kann man nachvollziehen, welche Dateien geöffnet oder welche Bibliotheken verwendet werden.

Wireshark

Wireshark ist ein Netzwerkanalyse-Tool, das den Datenverkehr überwacht und zeigt, welche Daten über das Netzwerk gesendet werden.

gdb

gdb ist ein Debugger für C und C++ Programme, der das schrittweise Durchlaufen eines Programms sowie die Anzeige von Registern und Speicher erlaubt.

gdb ./binary # Start gdb with binary set disassembly-flavor intel # Set disassembly flavor to Intel syntax break *0x1234 # Set breakpoint at address 0x1234 layout asm # Show assembly view

Wichtige gdb-Befehle:

  • run: Startet das Programm
  • break: Setzt einen Breakpoint
  • step: Führt das Programm Schritt für Schritt aus
  • info registers: Zeigt den Inhalt der Register an
  • x/10x $rsp: Zeigt 10 Wörter ab dem Stackpointer an
  • layout asm: Zeigt die Assembly-Ansicht an

pwndbg

pwndbg ist eine Erweiterung für gdb, die viele zusätzliche Funktionen bereitstellt – etwa die übersichtliche Anzeige von Registern und Speicher.

pwndbg

x64dbg

x64dbg ist ein Open Source Debugger für Windows mit grafischer Benutzeroberfläche, der das Debuggen von Binärdateien vereinfacht. Zur Orientierung im Programm können die im Debugger angezeigten Texte analysiert werden.

x64dbgx64dbg

Auch hier lassen sich Haltepunkte setzen:

x64dbg

Ghidra mit Debuggern

Ghidra kann in Kombination mit Debuggern wie x64dbg verwendet werden. Dabei ist es wichtig, dass die Adressen in beiden Tools übereinstimmen. Ist dies nicht der Fall, kann die .text-Section in Ghidra verschoben werden – diese wird aus dem Debugger (z.B. x64dbg) ausgelesen:

x64dbg

Die .text-Section kann dann in Ghidra importiert werden:

x64dbgx64dbg

z3

z3 ist ein SMT-Solver, der mathematische Probleme löst. In der Binäranalyse wird er eingesetzt, um Variablen so zu belegen, dass ein bestimmter Pfad im Programm durchlaufen wird.

Zunächst wird das Programm statisch (z.B. in Ghidra) analysiert, um die relevanten Bedingungen zu identifizieren. Anschließend kann z3 verwendet werden, um eine passende Belegung für die Variable input zu finden.

undefined8 checK-flavour(char input) { undefined8 uVar1; if ((((input < '0') || ('9' < input)) && ((input < 'b' || (input == '')))) && ((((input < '>' || ('[' < input)) && ((input < ']' || ('_' < input)))) && (((input < ' ' || ('#' < input)) && ((input < ')' || (',' < input)))))))) { uVar1 = 0; } else { uVar1 = 1; } return uVar1; } /* only allow characters that are 0-9 or b- or >-[ or ]-_ ... */ from z3 import * def check_characters(s: Solver, character: BitVec) -> None: s.add( Or( And(ord("0") <= character, character <= ord("9")), And(ord("b") <= character, character != 127), And(ord(">") <= character, character <= ord("[")), And(ord("]") <= character, character <= ord("_")), And(ord(" ") <= character, character <= ord("#")), And(ord(")") <= character, character <= ord(",")) ) ) s = Solver() character = BitVec("character", 8) check_characters(s, character) s.check() print(s.model())

Das Skript gibt eine Belegung für die Variable input zurück, die die Bedingungen erfüllt. Wichtig ist, die richtigen Typen zu verwenden – beispielsweise als 8-Bit BitVec, um Overflows analog zum Programm zu simulieren.

Ghidra für Native Libraries von APKs

In APKs können native Libraries entweder dynamisch oder statisch gelinkt sein. Beide Varianten können als .so-Dateien in Ghidra analysiert werden. Während dynamische Libraries oft Funktionsnamen ähnlich wie in Java anzeigen, müssen bei statischen Libraries Methoden wie JNI_OnLoad und RegisterNatives gefunden werden, um die Funktionen zuzuordnen.

void RegisterNatives(JNIEnv* env, jclass clazz, JNINativeMethod* methods, jint nMethods);

Android Tools

APKLab

APKLab ist ein Tool zur Analyse von Android-Apps. Es ermöglicht das Dekompilieren, Analysieren und Modifizieren des Quellcodes. Mit der decompile java-Flag kann der Java-Code einer App extrahiert werden, und es lässt sich parallel zu einem Android Emulator verwenden, um die App sicher zu testen.

Manifest auslesen

Mit APKLab kann das AndroidManifest.xml ausgelesen werden – dieses enthält Informationen zu Permissions, Activities und Services, einschließlich des Namens der Start-Activity.

<activity-alias android:exported="true" android:name="com.google.android.youtube.app.honeycomb.Shell$HomeActivity" android:targetActivity="com.google.android.apps.youtube.app.watchwhile.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter>

Smali Code

Der Smali-Code einer App, der den Assembler-Code darstellt, kann mit APKLab eingesehen und modifiziert werden. Anschließend lässt sich die App wieder in eine APK-Datei umwandeln.

Rebuild APK

Kommentare

Noch Fragen?