Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
polypyus — Nur-binärer Firmware-Historian, der lernt, Funktionen in rohen Binärdateien zu lokalisieren, indem er bekannte Funktionen aus ähnlichen Binärdateien extrahiert, was einen schnellen Funktionsabgleich ohne Disassemblierung für die Analyse eingebetteter Firmware ermöglicht. | Kitploit
Tools/GitHubGitHub/seemoo-lab/polypyus
Embedded-System-SicherheitReverse EngineeringBinäranalyseFirmware-Analyse
GitHubseemoo-lab/polypyus

polypyus

Nur-binärer Firmware-Historian, der lernt, Funktionen in rohen Binärdateien zu lokalisieren, indem er bekannte Funktionen aus ähnlichen Binärdateien extrahiert, was einen schnellen Funktionsabgleich ohne Disassemblierung für die Analyse eingebetteter Firmware ermöglicht.

Repository anzeigen
23225vor 5 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

PyTest

Polypyus

Polypyus Firmware Historian

Polypyus lernt, Funktionen in rohen Binärdateien zu lokalisieren, indem es bekannte Funktionen aus ähnlichen Binärdateien extrahiert. Somit ist es ein Firmware-Historian. Polypyus arbeitet ohne diese Binärdateien zu disassemblieren, was ein Vorteil für Binärdateien ist, deren Disassemblierung komplex ist und bei denen gängige Werkzeuge Funktionen übersehen. Darüber hinaus macht der rein binäre Ansatz es sehr schnell und lässt es innerhalb weniger Sekunden laufen. Allerdings erfordert dieser Ansatz, dass die Binärdateien für dieselbe Architektur bestimmt sind und ähnliche Compiler-Optionen aufweisen.

Polypyus integriert sich in den Workflow vorhandener Werkzeuge wie Ghidra, IDA, BinDiff und Diaphora. So kann es beispielsweise zuvor annotierte Funktionen importieren und daraus lernen, und auch gefundene Funktionen exportieren, um sie in IDA zu importieren. Da Polypyus eher strenge Schwellenwerte verwendet, hat es in unseren Experimenten nur korrekte Übereinstimmungen gefunden. Dies führt zwar zu weniger Ergebnissen als in vorhandenen Werkzeugen, ist aber ein guter Ausgangspunkt, um diese Übereinstimmungen in IDA zu laden, um dessen Auto-Analyse-Ergebnisse zu verbessern und dann BinDiff darauf anzuwenden.

Was Polypyus löst

Bei der Arbeit mit rohen Firmware-Binärdateien, nämlich verschiedenen Broadcom- und Cypress-Bluetooth-Firmware-Versionen, stellten wir fest, dass die IDA-Autoanalyse Funktionsanfänge oft falsch identifizierte. In IDA Pro 6.8 ist die Autoanalyse etwas aggressiver, was zu mehr Ergebnissen, aber auch mehr falsch Positiven führt. Insgesamt war IDA Pro 7.2 pessimistischer, übersah aber viele Funktionen. Dies führte zu nur wenigen BinDiff-Übereinstimmungen zwischen unseren Firmwares in IDA Pro 6.8 und zu gar keinen brauchbaren Übereinstimmungen in IDA Pro 7.2.

Interessanterweise scheiterte BinDiff oft daran, Funktionen zu identifizieren, die – abgesehen von Verzweigungen – byteweise identisch waren. Beachten Sie, dass Polypyus genau nach diesen byteweise identischen Funktionen sucht. Wir vermuten, dass BinDiff bei diesen Funktionen aufgrund eines anderen Call-Graphen scheitert, der durch fehlende Funktionen und falsch Positive entsteht. Manchmal wurden diese Funktionen bereits von IDA erkannt, aber oft erkannte IDA sie entweder nicht als Code oder markierte sie nicht als Funktion. Beachten Sie, dass Diaphora ähnliche Probleme hat, da es von IDA identifizierte Funktionen exportiert, bevor es sie weiterverarbeitet. Im Folgenden wird ein Benchmark auf dem CYW20735B1-Bluetooth-Firmware-Binärlauf gezeigt, der verschiedene Disassembler und die daraus resultierenden Folgeprobleme beim Diffing vergleicht.

Benchmark comparing IDA Pro, Ghidra, Binary Ninja, radare2, BinDiff and Diaphora

Darüber hinaus fanden wir zwar, dass Amnesia viele Funktionen findet, aber auch viele falsch Positive. Allerdings haben viele Funktionen einen ähnlichen Stack-Frame-Aufbau am Anfang. Daher bietet Polypyus eine Option, um gängige Funktionsanfänge aus den annotierten Eingabe-Binärdateien zu lernen und auf andere Binärdateien anzuwenden, um Funktionen ohne Namenszuordnung zu identifizieren. Dieser optionale Schritt wird nur auf die Bereiche angewendet, in denen zuvor keine Funktionen lokalisiert wurden, sodass die Methode der gemeinsamen Funktionsanfänge und die Hauptfunktionssuche nicht in Konflikt geraten.

Da diese Matcher auf der rohen Binärdatei arbeiten, sind sie nicht von einem Disassembler abhängig. Dies hat jedoch einen wichtigen Nachteil: Wenn unterschiedliche Compiler-Optionen oder eine andere Zielarchitektur vorlagen, wird Polypyus keine ähnlichen Funktionen erkennen. Darüber hinaus sind die identifizierten Übereinstimmungen zwar sehr zuverlässig, die Identifizierung von Funktionsanfängen ist jedoch etwas weniger zuverlässig, daher ist letztere mit Vorsicht zu verwenden. Im Folgenden sehen Sie, dass die Cypress-Evaluierungs-Kits einander sehr ähnlich sind, die MacBook-Firmware jedoch sehr unterschiedlich ist.

Benchmark on four different firmwares

Wie es funktioniert

Polypyus erstellt unscharfe binäre Matcher durch den Vergleich gemeinsamer Funktionen in einer Sammlung annotierter Firmware-Binärdateien.

Derzeit werden die folgenden Annotationen unterstützt:

  • Eine WICED Studio patch.elf-Datei, eine spezielle ELF-Datei, die nur Symboldefinitionen enthält.
  • Eine .symdefs-Datei, wie sie von den meisten ARM-Compilern erzeugt wird.
  • Eine .csv-Datei mit einem im Ordner firmware dokumentierten Format.

Diese Annotationen enthalten die Adresse, Größe und den Namen bekannter Funktionen. Je mehr Gemeinsamkeiten die Eingabe-Binärdateien in der Historiensammlung haben, desto besser für die Leistung und die Ergebnisse von Polypyus. Bei mehreren leicht unterschiedlichen Funktionen erstellt Polypyus sehr gute Matcher.

Wie man es installiert

Polypyus erfordert Python 3 >= 3.6. Wir empfehlen die Verwendung einer virtuellen Umgebung für die folgende Installation. Klonen Sie dieses Repository und führen Sie in diesem Ordner Folgendes aus:

root@kitploit:~
pip install .

Wie man es ausführt

Nach der Installation stehen die folgenden Befehle zur Verfügung:

  • polypyus-gui
  • polypyus-cli

Polypyus verwenden

Polypyus ist über eine grafische und eine Befehlszeilen-Schnittstelle verfügbar. Sowohl die GUI polypyus-gui als auch die CLI polypyus-cli akzeptieren beim Aufruf diese Argumente:

root@kitploit:~
  --verbose  Legt den Ausführlichkeitsgrad fest. Standardmäßig werden Warnungen angezeigt, -v zeigt Informationen, -vv Debug-Informationen.
  --project  Legt den Speicherort der Projektdatei fest. Dies ist entweder ein Dateipfad oder ":memory:".
  --help     Zeigt die Hilfemeldung an.

Die Projektoption ermöglicht es Ihnen, Ihre Arbeit für verschiedene Kontexte in verschiedenen Dateien zu speichern und auch wieder zu öffnen.

Verwenden der GUI

Der allgemeine GUI-Workflow geht von der linken Seite des Fensters zur rechten Seite. Zuerst werden Binärdateien zum Verlauf hinzugefügt. Dann folgen Symbolannotationen zu den Einträgen im Verlauf. Danach können Ziel-Binärdateien hinzugefügt werden. Für das Matching klicken Sie auf Create matchers from history. Sobald die Matcher erstellt sind, können einzelne Ziele ausgewählt oder alle Ziele durch Auswahl von batch match gematcht werden. Schließlich können die Ergebnisse in eine .csv-Datei exportiert werden.

Im Folgenden sehen Sie ein Demo-Video, in dem Polypyus nur wenige Sekunden benötigt, um aus zwei Eingabe-Binärdateien zu lernen, diese zu annotieren, Matcher zu erstellen und Übereinstimmungen auf eine neue Binärdatei anzuwenden.

GUI Video

Verwenden der CLI

Der Vorteil der CLI ist ihre Automatisierbarkeit. Derzeit kann sich das Ausgabeformat der CLI noch ändern. Hier ist jedoch ein Beispiel für den Aufruf:

root@kitploit:~
polypyus-cli --history firmware/history/20819-A1.bin --annotation firmware/history/20819-A1_patch.elf --history firmware/history/20735B1.bin --annotation firmware/history/20735B1_patch.elf --project test.sqlite
polypyus-cli --target firmware/history/20739B1.bin --project test.sqlite

Der erste Befehl erstellt test.sqlite als neue Projektdatei und importiert 20819-A1.bin und 20735B1.bin mit ihren jeweiligen patch.elf-Dateien. Der zweite Aufruf verwendet dieselbe Projektdatei erneut und matcht gegen die Binärdatei 20739B1.bin. Bei jedem Befehl muss die Anzahl der --history- und --annotation-Argumente übereinstimmen. Diese beiden Befehle könnten auch zu einem kombiniert werden, indem das --target-Argument zum ersten Befehl hinzugefügt wird.

Wie funktioniert es intern?

Ein Paper, das die Interna erklärt, wurde auf dem Workshop on Binary Analysis Research (BAR) 2021 mit dem Titel Polypyus - The Firmware Historian veröffentlicht. Einige weitere Details sind auch in der Abschlusspräsentation von Jans Masterarbeit enthalten, die die Probleme behandelt, die bei der Arbeit mit herkömmlichen binären Diffing-Ansätzen im ARM Thumb2-Modus auftreten, und wie der alternative, rein binäre Ansatz funktioniert.

Zusätzlicher PDOM-Typinformationen-Export und -Import

Die geleakten Symbole im patch.elf- oder .symdefs-Format enthalten nur Funktions- und globale Variablennamen. Es gibt jedoch auch einige .pdom-Eclipse-Projektdateien in WICED Studio 6.2 und 6.4. Diese enthalten zusätzliche Typinformationen. Eclipse verwendet sie intern für Auto-Vervollständigung, Funktionssuche usw., und wir können sie beim Reversing nutzen, um Typinformationen hinzuzufügen. Da .pdom-Dateien nur teilweise, zwischengespeicherte Informationen enthalten, kann es hilfreich sein, mehrere von ihnen zu kombinieren.

In einem ersten Schritt exportieren wir .pdom-Typinformationen in eine SQLite-Datenbank. Der Export dauert eine Weile, kann aber sogar abgebrochen und später fortgesetzt werden. Der Export funktioniert wie folgt:

root@kitploit:~
java -jar pdom/export/export.jar -P BCM20739-B0.1462220149391.pdom

Der PDOM-Import sucht nach Funktionsnamen in einer IDA-Datenbank, schlägt sie im PDOM nach, um Typinformationen zu finden, und wendet diese Typinformationen dann auf die IDA-Datenbank an. Daher muss die IDA-Datenbank vorab korrekte Funktionsnamen enthalten. Im Prinzip können diese mit den import_export-Skripten von Polypyus erstellt werden. Die etwas fortschrittlicheren Skripte, die den PDOM-Import unterstützen, können jedoch auch patch.elf-Abschnitte verarbeiten. Führen Sie den Import wie folgt durch:

  • Öffnen Sie die Firmware-Binärdatei in IDA.
  • Setzen Sie den Thumb-Modus auf T=0x1 (Alt-g).
  • Setzen Sie die Compiler-Optionen (Options -> Compiler...) auf GNU C++.
  • Führen Sie die Skriptdatei pdom/import/main.py aus (File -> Script file).
  • Wählen Sie eine patch.elf-Datei aus (Select file).
  • Importieren Sie sie (Import ELF). Nach einigen Sekunden haben Sie Abschnitte und Funktionsnamen.
  • Wählen Sie eine Referenzdatenbank aus, die das zu Ihrer Firmware-Binärdatei gehörende PDOM sein sollte.
  • Wählen Sie mehrere zusätzliche Datenbanken aus, und der Import wählt die besten kombinierten Übereinstimmungen aus.
  • Importieren Sie sie (Import PDOM). Dies wird eine Weile dauern.
  • Sie können auch eine Hardware-Registerdatei 20739mapb0.h importieren, um Hardware-Register zu benennen (Import map.h).

Dieses Skript wurde auf IDA Pro 7.4 und 7.5 getestet.

Empfohlener IDA Pro-Workflow

Nach einigen internen Tests können wir den folgenden Workflow bei der Arbeit mit IDA Pro und Polypyus empfehlen:

  • Erstellen Sie eine neue Datenbank. ARM v7 Little Endian, ARM Cortex M für die Bluetooth-Firmware.
  • Markieren Sie Position 0x0 als Thumb (Alt-g, T=0x1).
  • Erstellen Sie ROM- und RAM-Segmente. ROM bei 0x0 mit rx, RAM bei 0x200000 mit rwx (zumindest für die Bluetooth-Firmware).
  • Erstellen Sie Vektor-Tabellen-Offsets im ROM, zumindest für den Reset-Vektor, der ein 4-Byte-Offset bei 0x4 ist (o). Auf der CYW20735-Firmware zeigt er auf 0x3bc+1. Gehen Sie ein Byte zurück und erstellen Sie eine Funktion (p).
  • Warten Sie, bis die Auto-Analyse abgeschlossen ist.
  • Importieren Sie die Polypyus-Ergebnisse.
  • Führen Sie die Thumbs Up-Skripte aus.
  • Führen Sie sowohl BinDiff als auch Diaphora aus. Letzteres idealerweise in einer IDA-Version mit Decompiler. Verwenden Sie beide, da sie unterschiedliche Heuristiken verwenden.

...jetzt könnte Ihre IDA-Datenbank einigermaßen nützlich sein :) Im ARM Thumb2-Modus scheitert der Disassembler zwar immer noch an vielen Dingen, aber es ist weitaus besser als alles, was IDA alleine macht.

Broadcom Bluetooth-Firmware-Historie

Der Ordner firmware enthält verschiedene Firmwares mit und ohne Symbole. Alles im Verzeichnis history enthält Symbole, alles im Verzeichnis targets ist ohne Symbole.

Verlauf
Ziele

Für die Samsung-Serie umfasst S8 auch das Note 8 und S8+ usw., und die S10/S20 umfasst alles vom S10e bis zum Note 20 5G.

Die Dump-Qualität kann variieren, einige sind mit RAM und einige sind nur das ROM. Wir haben Zugang zu den meisten Geräten in dieser Liste. Wenn Sie einen Dump mit den aktuellsten Patch-Leveln und einschließlich RAM benötigen, kontaktieren Sie uns gerne.

Einige im Paper erwähnte Geräte sind hier nicht enthalten, da es sich möglicherweise nicht um reine Forschungsgeräte handelt usw. Einige iPhones und MacBooks fehlen ebenfalls, da wir sie als reine Forschungsgeräte haben, der ursprüngliche Dump jedoch nicht. Diese Geräte werden bald hinzugefügt :)

Mitwirken

In diesem Repository befindet sich eine .editorconfig-Datei. Sie konfiguriert den Einrückungsstil, die Zeichenkodierung und die Zeilentrenner. Befolgen Sie diese Konfiguration beim Mitwirken, was durch die Verwendung eines IDE-Plugins für .editorconfig erleichtert werden kann.

Wie man Test- und Entwicklungsabhängigkeiten installiert

Um die Testabhängigkeiten zu installieren, führen Sie

root@kitploit:~
pip install '.[test]'

aus. Dies installiert Pakete, die nur für die Ausführung von Testfällen benötigt werden.

Entwicklungsabhängigkeiten bieten z. B. Stubs für Pakettypen. Um sie zu installieren, führen Sie

root@kitploit:~
pip install '.[development]'

aus.

Testen

pytest führt alle Tests aus.

Lokales Testen gegen verschiedene Python-Versionen

Das Projekt verwendet tox, um die Tests lokal gegen verschiedene Python-Versionen auszuführen. Tox ist so eingerichtet, dass es gegen die Versionen 3.6, 3.7, 3.8 und 3.9 testet. Um tox auszuführen, installieren Sie die Testabhängigkeiten und diese 4 genannten Python-Versionen. Unsere empfohlene Methode zur Installation und Verwaltung mehrerer Python-Versionen ist pyenv.

Schritte:

  1. Installieren Sie Pyenv.
  2. Installieren Sie Pyenv virtualenv.
  3. Führen Sie
    root@kitploit:~
    pyenv install 3.9.1
    pyenv install 3.8.6
    pyenv install 3.7.9
    pyenv install 3.6.12
    pyenv virtualenv 3.9.1 polypyus
    pyenv local polypyus 3.8.6 3.7.9 3.6.12
    pip install '.[test]'
    pip install '.[development]'
    
    aus.
  4. Führen Sie tox aus.

Lokale Automatisierung

Polypyus verwendet GitHub Actions für automatisierte Testläufe und einige Linting-Schritte. Wenn Sie möchten, können Sie die Linting-Schritte lokal mit Pre-Commit-Git-Hooks ausführen.

Jedes Mal, bevor ein neuer Commit erstellt wird, wird dadurch das Linting ausgelöst und die Probleme angezeigt, die verhindern würden, dass dieser Code den GitHub Actions-Linting-Schritt besteht. Es wird auch geänderte Dateien mit Black formatieren.

root@kitploit:~
pip install '.[development]'
pre-commit install

Lizenz und Danksagungen

Wir danken Anna Stichling für die Erstellung des Polypyus-Logos. Wir danken auch Christian Blichmann und Joxean Koret für ihr Feedback.

Polypyus ist Open-Source und unter der GPLv3 lizenziert.

Tool herunterladen
ChipGerätBau-DatumSymbole
BCM20703A2MacBook/iMac 2016-201722. Okt. 2015✔
CYW20719B1Evaluierungsboard17. Jan. 2017✔
CYW20735B1Evaluierungsboard18. Jan. 2018✔
CYW20819A1Evaluierungsboard22. Mai 2018✔
ChipGerätBau-DatumSymbole
BCM2046A2iMac Late 20092007?-
BCM2070B0MacBook 2011, Thinkpad T4209. Juli 2008-
BCM20702A1Asus USB-DongleFeb. (?) 2010-
BCM4345B0iPhone 615. Juli 2013-
BCM4335C0Google Nexus 511. Dez. 2012-
BCM4345B0Google Nexus 6P / Galaxy S623. Okt. 2014-
BCM43430A1Raspberry Pi 3 und Zero W2. Juni 2014-
BCM4345C0Raspberry Pi 3+ und 419. Aug. 2014-
BCM4347B0Samsung Galaxy S8-Serie3. Juni 2016-
BCM4375B1Samsung Galaxy S10/20-Serie13. Apr. 2018-
BCM4378B1iPhone 11/SE225. Okt. 2018Strings