
Un plugin para introducir símbolos interactivos en tu depurador desde tu descompilador
La ingeniería inversa implica análisis tanto estático (descompilador) como dinámico (depurador), pero a menudo usamos estos análisis sin compartir conocimiento entre ellos. En el caso de hacer ingeniería inversa de binarios estáticos, el cambio de contexto entre el ensamblador del depurador y los símbolos que has recuperado en la descompilación puede ser ineficiente.
decomp2dbg busca acortar la brecha del cambio de contexto entre descompilador y depurador al introducir una API genérica para la sincronización de símbolos entre descompilador y depurador. En efecto, le da al ingeniero inverso el poder de su depurador con los símbolos y las líneas de descompilación que recupera en su descompilador.

¿Interesado en ver cómo se ve decomp2dbg en la práctica? Mira la charla grabada en CactusCon 2023, donde se depura un binario arm32 remoto desde una máquina x64 con símbolos de Ghidra.
Para ayuda activa, únete al Discord de BinSync a continuación, donde respondemos preguntas sobre decomp2dbg:
Instala a través de pip, luego usa el instalador integrado para los descompiladores:
pip3 install decomp2dbg && decomp2dbg --install
Esto abrirá un mensaje donde se te pedirá ingresar la ruta a tu descompilador y depurador de elección. Para Ghidra, necesitarás iniciar en modo PyGhidra y habilitar el plugin (d2d_client.py), como se muestra aquí. Si instalaste la parte del descompilador a través del Administrador de Plugins de Binja, aún necesitas instalar la parte del depurador con lo anterior. Nota: debes instalar decomp2dbg en el mismo entorno de Python que tu descompilador y depurador.
Nota: Puede que necesites permitir conexiones entrantes en el puerto 3662, o el puerto que uses, para que decomp2dbg se conecte al descompilador. Si estás instalando decomp2dbg con GEF o pwndbg, es importante que en tu ~/.gdbinit el archivo d2d.py se cargue después de GEF o pwndbg.
Omite esto si pudiste usar la instalación anterior sin errores. Si no puedes usar el script integrado (instalación de Windows sin WSL para el descompilador), sigue los pasos a continuación:
Si solo necesitas la parte del descompilador, copia el plugin de descompilador asociado a la carpeta de plugins del descompilador. Así es como se hace en IDA:
Primero, clona el repositorio:
git clone https://github.com/mahaloz/decomp2dbg.git
Instala:
pip install .
Copia el archivo del servidor:
cp ./decomp2dbg/d2d_server.py /ruta/a/plugins/ida/
Si también necesitas instalar la parte de gdb, usa la siguiente línea:
cp ./decomp2dbg/d2d_client.py ~/.d2d.py && echo "source ~/.d2d.py" >> ~/.gdbinit
Primero, inicia el servidor de descompilación en tu descompilador. Puede que desees esperar hasta que tu descompilador termine su análisis normal antes de iniciarlo. Después del análisis normal, esto se puede hacer usando la tecla de acceso rápido Ctrl-Shift-D, o seleccionando la pestaña decomp2dbg: configure en la pestaña de plugins asociada. Después de iniciar el servidor, deberías ver un mensaje en tu descompilador:
[+] Starting XMLRPC server: localhost:3662
[+] Registered decompilation server!
A continuación, en tu depurador, ejecuta:
decompiler connect <nombre_del_descompilador>
Si estás ejecutando el descompilador en una máquina virtual o en otra máquina, puedes proporcionar opcionalmente el host y el puerto para conectarte. Aquí hay un ejemplo:
decompiler connect ida --host 10.211.55.2 --port 3662
Puedes descubrir cómo usar todos los comandos ejecutando el comando del descompilador con la bandera --help.
La primera conexión puede tardar hasta 30 segundos en registrarse, dependiendo de la cantidad de globales en el binario. Si todo está bien, deberías ver:
[+] Connected to decompiler!
Si estás usando decomp2dbg para una librería, es decir, el binario principal al que tu depurador se adjuntó no es el binario del que quieres el código fuente, entonces deberías echar un vistazo a la sección Advanced Usage - Shared Libs del readme.
En cada evento de punto de interrupción, ahora verás la descompilación impresa y la línea en la que te encuentras asociada con la dirección de interrupción.
Las funciones y variables globales de tu descompilación ahora están mapeadas en tu GDB como símbolos normales a nivel de código fuente. Esto significa que los comandos normales de GDB como imprimir y examinar son nativos:
b sub_46340
x/10i sub_46340
p dword_267A2C
x dword_267A2C
Algunas variables que se almacenan localmente en una función son variables de pila. Para las variables que se pueden mapear a la pila o los registros, las importamos como variables de conveniencia. Puedes ver su contenido como una variable de conveniencia normal de GDB:
p $v4
Las variables de pila siempre almacenarán su dirección en la pila. Para ver qué valor hay realmente en esa variable de pila, simplemente desreferencia la variable:
x $v4
Esto también funciona con los argumentos de función si corresponde (los resultados pueden variar):
p $a1
Nota: $v4 en este caso solo se mapeará mientras estés en la misma función. Una vez que salgas de la función, puede desmapearse o reasignarse a otro valor.
Cuando quieras que se muestre la descompilación (y los símbolos) para una sección de memoria que no es el binario principal, como al depurar una biblioteca compartida, necesitas seguir algunos pasos adicionales. Actualmente, d2d solo admite 1 descompilador conectado a la vez, lo que significa que si tienes algún descompilador conectado que no sea la biblioteca, debes desconectarlo.
Después de seguir la configuración normal para que tu descompilador ejecute el servidor d2d para tu biblioteca compartida, debes establecer manualmente la dirección base de esta biblioteca y su dirección final:
decompiler connect ida --base-addr-start 0x00007ffff7452000 --base-addr-end 0x00007ffff766d000
Para encontrar la dirección base en la que tu biblioteca está cargada en memoria, se recomienda usar algo como el comando vmmap de GEF para buscar el nombre de la biblioteca en el espacio de memoria. Después de conectarte con esta dirección establecida manualmente, los símbolos funcionarán como en d2d normal. La descompilación solo se imprimirá en la pantalla cuando estés en el rango de este espacio de direcciones.