
rhabdomancer v0.10.0
Assistent für Schwachstellenforschung, der Aufrufe potenziell unsicherer API-Funktionen in einer Binärdatei lokalisiert.
rhabdomancer
"Der Weg zu ausnutzbaren Bugs ist mit nicht ausnutzbaren Bugs gepflastert."
-- Mark Dowd
Rhabdomancer ist ein blitzschnelles IDA-Headless-Plugin, das Aufrufe potenziell unsicherer API-Funktionen in einer Binärdatei lokalisiert. Auditoren können von diesen Kandidatenpunkten aus zurückverfolgen, um Pfade zu finden, die Zugriff auf nicht vertrauenswürdige Eingaben ermöglichen.

Funktionen
- Blitzschnelle, headless Benutzererfahrung dank IDA 9.x und der idalib-rs Rust-Bindings.
- Unterstützung für C/C++-Binärziele, die für jede von IDA implementierte Architektur kompiliert wurden.
- Fundstellen von Aufrufen schlechter API-Funktionen werden auf stdout ausgegeben und in der IDB markiert.
- Aufrufstellen in Bibliothekscode, der von IDA erkannt wird (z. B. eine statisch gelinkte Runtime, die durch FLIRT-Signaturen erkannt wurde), werden mit
(lib)gekennzeichnet. - Aufrufe über Stubs (z. B. die
.plt-Einträge von ELF-Binärdateien oder die Import-Stubs von PE- und Mach-O-Binärdateien, die als Thunks aufgeführt sind) werden bis zu ihren Aufrufern zurückverfolgt. - In ELF-Binärdateien wird eine Funktion bewusst zweimal mit denselben Aufrufstellen aufgeführt: einmal als ihr
.plt-Stub (als Thunk markiert) und einmal als ihr Import. Jede Aufrufstelle wird in der IDB nur einmal markiert.
- Aufrufstellen in Bibliothekscode, der von IDA erkannt wird (z. B. eine statisch gelinkte Runtime, die durch FLIRT-Signaturen erkannt wurde), werden mit
- Bekannte schlechte API-Funktionen sind in Stufen der Schlechtigkeit gruppiert, um die Priorisierung der Audit-Arbeit zu erleichtern.
- [BAD 0] Hohe Priorität – Funktionen, die allgemein als unsicher gelten.
- [BAD 1] Mittlere Priorität – Interessante Funktionen, die auf unsichere Anwendungsfälle geprüft werden sollten.
- [BAD 2] Niedrige Priorität – Codepfade, die diese Funktionen betreffen, sollten sorgfältig geprüft werden.
- Die Liste der bekannten schlechten API-Funktionen ist eingebaut und kann einfach mit einer Konfigurationsdatei auf Basis von
conf/rhabdomancer.tomlangepasst werden. - Funktionsnamen werden ohne folgende Dekorationen abgeglichen: führende Punkte und Unterstriche (z. B.
_strcpy), die Präfixe von Bibliotheks-Aliassen (z. B.__o_mallocin der Universal CRT,__libc_systemund__GI___snprintfin glibc) und, nur für Stubs und solche Aliase, das numerische Suffix, das IDA an bereits verwendete Namen anhängt (z. B.memset_0).
[!NOTE] Fortifizierte Funktionen (z. B.
__strcpy_chk, das anstelle vonstrcpyverwendet wird, wenn mit_FORTIFY_SOURCEgebaut wird) werden bewusst nicht abgeglichen, da sie die geprüften Varianten der aufgeführten Funktionen sind. Um auch ihre Aufrufe zu markieren, füge sie explizit zu einer benutzerdefinierten Konfiguration hinzu (z. B."__strcpy_chk"mit derselben Priorität wiestrcpy).
Artikel
- https://hex-rays.com/blog/streamlining-vulnerability-research-idalib-rust-bindings
- https://hnsecurity.it/blog/streamlining-vulnerability-research-with-ida-pro-and-rust
Siehe auch
- https://github.com/0xdea/ghidra-scripts/blob/main/Rhabdomancer.java
- https://docs.hex-rays.com/release-notes/9_0#headless-processing-with-idalib
- https://github.com/idalib-rs/idalib
- https://books.google.it/books/about/The_Art_of_Software_Security_Assessment.html
Installation
Der einfachste Weg, die neueste Version zu erhalten, ist über crates.io:
- IDA herunterladen, installieren und konfigurieren (siehe https://hex-rays.com/ida-pro).
- LLVM/Clang installieren (siehe https://rust-lang.github.io/rust-bindgen/requirements.html).
- Unter Linux/macOS wie folgt installieren:
Unter Windows verwenden Sie stattdessen die folgenden Befehle:export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo install rhabdomancer --locked$env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo install rhabdomancer --locked
Kompilieren
Alternativ können Sie aus dem Quellcode bauen:
- Laden Sie IDA herunter, installieren und konfigurieren Sie es (siehe https://hex-rays.com/ida-pro).
- Installieren Sie LLVM/Clang (siehe https://rust-lang.github.io/rust-bindgen/requirements.html).
- Unter Linux/macOS kompilieren Sie wie folgt:
Unter Windows verwenden Sie stattdessen die folgenden Befehle:git clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo build --release --lockedgit clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer $env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo build --release --locked
Verwendung
- Stellen Sie sicher, dass IDA ordnungsgemäß mit einer gültigen Lizenz konfiguriert ist.
- Passen Sie optional die Liste der bekannten bösartigen API-Funktionen an: Kopieren Sie
conf/rhabdomancer.toml(wählen Sie das Tag, das Ihrer installierten Version entspricht, für deren exakte integrierte Liste), bearbeiten Sie die Kopie und setzen Sie die UmgebungsvariableRHABDOMANCER_CONFIGauf deren Pfad. Die Datei muss die Arrayshigh,mediumundlowdefinieren und keine anderen Schlüssel. Andernfalls wird die integrierte Liste verwendet, die zur Build-Zeit ausconf/rhabdomancer.tomlin die Binärdatei eingebettet wird (das Bearbeiten dieser Datei erfordert einen Neubuild). - Stellen Sie sicher, dass die Umgebungsvariable
IDADIRgesetzt ist, falls sich Ihre IDA-Installation an einem nicht standardmäßigen Ort befindet. - Führen Sie es wie folgt aus:
Eine vorhandenerhabdomancer <binary_file>.i64-IDB-Datei wird aktualisiert; andernfalls wird eine neue IDB-Datei erstellt. - Öffnen Sie die resultierende
.i64-IDB-Datei mit IDA. - Wählen Sie
View>Open subviews>Bookmarks - Genießen Sie Ihre Ergebnisse, die bequem in einem IDA-Fenster gesammelt werden.
[!NOTE] Rhabdomancer fügt außerdem Kommentare an markierten Aufrufstellen hinzu. Sowohl Lesezeichen als auch Kommentare werden mit
[BAD n] <function_name>gekennzeichnet, wobeindie Prioritätsstufe ist (0 = hoch, 1 = mittel, 2 = niedrig), damit Skripte IDBs danach durchsuchen können. Dieses Format ist über Releases hinweg stabil.
Kompatibilität
Offiziell unterstützt wird nur die neueste IDA-Version, aber ältere Versionen können ebenfalls funktionieren. Die folgende Tabelle fasst die neueste kompatible Version für jede IDA-Version zusammen: