Reverse Engineering

Analyse von Binärprogrammen

Wie analysiert man Programme, deren Quelltext nicht verfügbar ist? Ist ein Programm aus einer mir unbekannten Quelle vertrauenswürdig? Wie genau funktioniert diese Schadsoftware? Wie behebe ich den Fehler in einem Programm, dass nicht mehr offiziell unterstützt wird?

Um Fragen wie diese zu beantworten, beschäftigen wir uns in diesem Kurs mit der Analyse von Binärprogrammen, dem Reverse Engineering. Wir lernen, wie wir Maschinencode zurück in Assembler übersetzen und dann den Code zum besseren Verständnis in einer Hochsprache abbilden können. Dazu werden die Teilnehmer schrittweise an die Thematik herangeführt und wenden die Techniken in den zahlreichen praktischen Aufgaben an.

Die in diesem Kurs gezeigten Techniken sind auf unterschiedlichen Betriebssysteme (Linux, Windows, MacOS, ...) und CPU Plattformen übertragbar. Praktisch verwenden wir hier vor allem Linux und x86_64

Trainer und Dozenten

Tim Blazytko ist Reverse Engineer und Forscher an der Ruhr-Universität Bochum. Zu seinen Forschungsschwerpunkten zählen neue Methoden zur Programmanalyse im Kontext der Anwendungssicherheit. Neben seiner Forschung führt Tim Sicherheitsanalysen durch und gibt Trainings als Freiberufler.

Voraussetzungen

  • Grundkenntnisse im Umgang mit der Linux Kommandozeile, wie sie Sie in unserer Schulung "Linux Grundlagen vermitteln
  • Grundkenntnisse in der Programmiersprache C, wie wir Sie in unserer Schulung "C Programmierung vermitteln
  • Vorwissen über die x86-Assembler ist hilfreich aber nicht notwendig

Inhalt

Von C zu Assembler

  • Source Code versus Assembler
  • Was macht ein Compiler?
  • Was ist Maschinensprache?

x86-64 Assembler

  • Register- und Speicherzugriffe
  • Instruktionen/Befehlssatz
  • Kontrollfluss
  • Wie schreibt man x86-64 Assembler?

Rekonstruktion von Funktionen

  • Rekonstruktion von Kontroll- und Datenfluss
  • Rekonstruktion von Variablen
  • Identifikation von Hochsprache-Konzepten (z.b. if-Statements, Schleifen, ...)
  • Calling Conventions

Rekonstruktion von Datenstrukuren

  • Rekonstruktion von elemantare Datentypen (byte, short, int, ...)
  • Erkennen von Strings
  • lokale versus globale Datenstrukuren
  • Pointer
  • Rekonstruktion von Structs und Unions

Statische Analyse

  • Basic Blöcke
  • Kontrollflussgraphen
  • Disassembler
  • Decompiler
  • state-of-the-art Programme

Dynamische Analyse

  • Debugging
  • Single Stepping
  • Patching
  • state-of-the-art Programme