CTF Tools
Wichtige Werkzeuge und Techniken für die Binäranalyse
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.
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.
Der Hex Editor in Ghidra lässt sich über das Bytes-Menü öffnen.
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.
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.
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.
Das gilt auch für Variablen im Assembly-Code im meist linken Fenster. Durch die Auswahl eines passenden Typs werden diese leichter lesbar.
Process Monitor ist ein Windows-Tool zur Überwachung von Dateisystem- und Registry-Aktivitäten. Es zeigt, welche Dateien ein Programm öffnet oder verändert.
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 ist ein Netzwerkanalyse-Tool, das den Datenverkehr überwacht und zeigt, welche Daten über das Netzwerk gesendet werden.
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:
pwndbg ist eine Erweiterung für gdb, die viele zusätzliche Funktionen bereitstellt – etwa die übersichtliche Anzeige von Registern und Speicher.
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.
Auch hier lassen sich Haltepunkte setzen:
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:
Die .text
-Section kann dann in Ghidra importiert werden:
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.
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);
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.
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>
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.
Noch Fragen?