
rhabdomancer v0.10.0
Asistente de investigación de vulnerabilidades que localiza llamadas a funciones de API potencialmente inseguras en un archivo binario.
rhabdomancer
"El camino hacia los bugs explotables está pavimentado con bugs no explotables."
-- Mark Dowd
Rhabdomancer es un plugin headless de IDA extremadamente rápido que localiza llamadas a funciones de API potencialmente inseguras en un archivo binario. Los auditores pueden hacer un backtrace desde estos puntos candidatos para encontrar rutas que permitan el acceso a entrada no confiable.

Características
- Experiencia de usuario headless y extremadamente rápida gracias a IDA 9.x y los bindings de Rust idalib-rs.
- Soporte para objetivos binarios C/C++ compilados para cualquier arquitectura implementada por IDA.
- Las ubicaciones de llamadas a funciones de API maliciosas se imprimen en stdout y se marcan en el IDB.
- Las ubicaciones de llamadas en código de biblioteca reconocido por IDA (por ejemplo, un runtime enlazado
estáticamente que coincide con firmas FLIRT) se etiquetan como
(lib). - Las llamadas a través de stubs (por ejemplo, las entradas
.pltde binarios ELF o los stubs de importación de binarios PE y Mach-O, listados como thunks) se rastrean hasta sus llamadores. - En binarios ELF, una función se lista deliberadamente dos veces con las mismas ubicaciones de llamada: una vez como
su stub
.plt(marcado como thunk) y otra como su importación. Cada ubicación de llamada se marca solo una vez en el IDB.
- Las ubicaciones de llamadas en código de biblioteca reconocido por IDA (por ejemplo, un runtime enlazado
estáticamente que coincide con firmas FLIRT) se etiquetan como
- Las funciones de API maliciosas conocidas se agrupan en niveles de peligrosidad para ayudar a priorizar el trabajo de
auditoría.
- [BAD 0] Prioridad alta - Funciones que generalmente se consideran inseguras.
- [BAD 1] Prioridad media - Funciones interesantes que deberían revisarse en busca de casos de uso inseguros.
- [BAD 2] Prioridad baja - Las rutas de código que involucran estas funciones deberían revisarse cuidadosamente.
- La lista de funciones de API maliciosas conocidas está integrada y puede personalizarse fácilmente con un archivo de
configuración basado en
conf/rhabdomancer.toml. - Los nombres de funciones se comparan sin estas decoraciones: puntos y guiones bajos iniciales (por ejemplo,
_strcpy), los prefijos de alias de biblioteca (por ejemplo,__o_mallocen el Universal CRT,__libc_systemy__GI___snprintfen glibc) y, solo para stubs y dichos alias, el sufijo numérico que IDA añade a los nombres ya en uso (por ejemplo,memset_0).
[!NOTE] Las funciones fortificadas (por ejemplo,
__strcpy_chk, usada en lugar destrcpyal compilar con_FORTIFY_SOURCE) deliberadamente no se comparan, ya que son las variantes verificadas de las funciones listadas. Para marcar también sus llamadas, añádelas explícitamente a una configuración personalizada (por ejemplo,"__strcpy_chk"con la misma prioridad questrcpy).
Artículos
- https://hex-rays.com/blog/streamlining-vulnerability-research-idalib-rust-bindings
- https://hnsecurity.it/blog/streamlining-vulnerability-research-with-ida-pro-and-rust
Véase también
- 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
Instalación
La forma más sencilla de obtener la última versión es a través de crates.io:
- Descargue, instale y configure IDA (consulte https://hex-rays.com/ida-pro).
- Instale LLVM/Clang (consulte https://rust-lang.github.io/rust-bindgen/requirements.html).
- En Linux/macOS, instale de la siguiente manera:
En Windows, en su lugar, utilice los siguientes comandos: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
Compilación
Alternativamente, puedes compilar desde el código fuente:
- Descarga, instala y configura IDA (consulta https://hex-rays.com/ida-pro).
- Instala LLVM/Clang (consulta https://rust-lang.github.io/rust-bindgen/requirements.html).
- En Linux/macOS, compila de la siguiente manera:
En Windows, en su lugar, utilice los siguientes comandos: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
Uso
- Asegúrate de que IDA esté configurado correctamente con una licencia válida.
- Opcionalmente, personaliza la lista de funciones API maliciosas conocidas: copia
conf/rhabdomancer.toml(elige la etiqueta que coincida con tu versión instalada para obtener su lista integrada exacta), edita la copia y establece la variable de entornoRHABDOMANCER_CONFIGcon su ruta. El archivo debe definir los arrayshigh,mediumylow, y ninguna otra clave. De lo contrario, se utiliza la lista integrada, que se incrusta en el binario en el momento de la compilación desdeconf/rhabdomancer.toml(editar ese archivo requiere recompilar). - Asegúrate de que la variable de entorno
IDADIResté establecida si tu instalación de IDA se encuentra en una ubicación no estándar. - Ejecútalo de la siguiente manera:
Cualquier archivo IDBrhabdomancer <binary_file>.i64existente se actualizará; de lo contrario, se creará un nuevo archivo IDB. - Abra el archivo IDB
.i64resultante con IDA. - Seleccione
View>Open subviews>Bookmarks - Disfrute de sus resultados convenientemente recopilados en una ventana de IDA.
[!NOTE] Rhabdomancer también añade comentarios en las ubicaciones de llamadas marcadas. Tanto los marcadores como los comentarios se etiquetan como
[BAD n] <function_name>, dondenes el nivel de prioridad (0 = alto, 1 = medio, 2 = bajo), de modo que los scripts puedan buscarlos en los IDB. Este formato es estable entre versiones.
Compatibilidad
Solo se admite oficialmente la última versión de IDA, pero las versiones anteriores también pueden funcionar. La siguiente tabla resume la última versión compatible para cada versión de IDA: