Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
ret-sync — ret-sync es un conjunto de plugins que ayuda a sincronizar una sesión de depuración (WinDbg/GDB/LLDB/OllyDbg2/x64dbg) con los desensambladores IDA/Ghidra/Binary Ninja. | Kitploit
Herramientas/GitHubGitHub/bootleg/ret-sync
Análisis Dinámico (Sandboxing)Ingeniería InversaDepuradoresUtilidades y FrameworksAnálisis de Binarios
GitHubbootleg/ret-sync

ret-sync

ret-sync es un conjunto de plugins que ayuda a sincronizar una sesión de depuración (WinDbg/GDB/LLDB/OllyDbg2/x64dbg) con los desensambladores IDA/Ghidra/Binary Ninja.

Ver Repositorio
2.4k30716hace 6 mesesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

ret-sync

ret-sync significa Synchronization de Herramientas de Ingeniería Inversa. Es un conjunto de plugins que ayudan a sincronizar una sesión de depuración (WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg) con un desensamblador (IDA/Ghidra/Binary Ninja). La idea subyacente es simple: tomar lo mejor de ambos mundos (análisis estático y dinámico).

Los depuradores y el análisis dinámico nos proporcionan:

  • vista local, con contexto dinámico en vivo (registros, memoria, etc.)
  • características/API especializadas integradas (ej.: !peb de WinDbg, !drvobj, !address, etc.)

Los desensambladores y el análisis estático nos proporcionan:

  • vista macro sobre módulos
  • análisis de código, firmas, tipos, etc.
  • vista de gráficos elegante
  • descompilación
  • almacenamiento persistente de conocimiento dentro de IDBs/GPRs

Características clave:

  • sincronizar vistas de gráfico y descompilación con el estado del depurador
  • no es necesario lidiar con ASLR, las direcciones se reubican sobre la marcha
  • pasar datos (comentarios, salida de comandos) del depurador al desensamblador
  • múltiples IDBs/GPRs pueden sincronizarse al mismo tiempo permitiendo rastrear fácilmente a través de múltiples módulos
  • el desensamblador y el depurador pueden estar en diferentes hosts/VMs

ret-sync es un fork de qb-sync que desarrollé y mantuve durante mi estancia en Quarkslab.


Tabla de contenidos

  • Contenido del repositorio
  • Requisitos previos generales
  • Versión binaria
  • Configuración de ret-sync
  • Instalación
    • Extensión para IDA
    • Extensión para Ghidra
    • Extensión para Binary Ninja
    • Extensión para WinDbg
    • Instalación de GNU gdb (GDB)
    • Instalación de LLDB
    • Instalación de OllyDbg 1.10
    • Instalación de OllyDbg2
    • Instalación de x64dbg
  • Uso
    • Comandos del depurador ret-sync
    • Uso de IDA
    • Uso de Ghidra
    • Uso de Binary Ninja
    • Uso de WinDbg
    • Uso de GNU gdb (GDB)
    • Uso de LLDB
    • Uso de OllyDbg 1.10
    • Uso de OllyDbg2
    • Uso de x64dbg
    • Uso de la librería Python
  • Extender
  • TODO
  • Errores/Limitaciones conocidos
  • Licencia
  • Agradecimientos

Contenido del repositorio

Los plugins del depurador:

  • ext_windbg/sync: archivos fuente de la extensión WinDbg, una vez compilado: sync.dll
  • ext_gdb/sync.py: plugin de GDB
  • ext_lldb/sync.py: plugin de LLDB
  • ext_olly1: plugin de OllyDbg 1.10
  • ext_olly2: plugin de OllyDbg v2
  • ext_x64dbg: plugin de x64dbg

Los plugins del desensamblador:

  • ext_ida/SyncPlugin.py
  • ext_ghidra/dist/ghidra_*_retsync.zip: plugin de Ghidra
  • ext_bn/retsync: plugin de Binary Ninja

Y el plugin de librería:

  • ext_lib/sync.py: librería Python independiente

Requisitos previos generales

Los plugins de IDA y GDB requieren una instalación válida de Python. Se soportan Python 2 (>=2.7) y Python 3.

Versión binaria

Se ofrecen binarios precompilados para los depuradores WinDbg/OllyDbg/OllyDbg2/x64dbg a través de un pipeline de Azure DevOps: Build Status

Seleccione la última compilación y verifique los artefactos en la sección Related: 6 published.

Se proporciona un archivo de plugin precompilado del plugin de Ghidra en ext_ghidra/dist.

Configuración de ret-sync

ret-sync debería funcionar sin configuración previa para la mayoría de los usuarios con una configuración típica: depurador y desensamblador(es) en el mismo host, nombres de módulos coincidentes.

Aún así, en algunos escenarios se puede utilizar una configuración específica. Para ello, las extensiones y plugins buscan un archivo de configuración global opcional llamado .sync en el directorio personal del usuario. Debe ser un archivo .INI válido.

Adicionalmente, los plugins de IDA y Ghidra también buscan el archivo de configuración primero en el directorio del IDB o del proyecto (<project>.rep) para permitir configuraciones locales por IDB/proyecto. Si hay un archivo de configuración local, se ignora el archivo de configuración global.

Los valores declarados en estos archivos de configuración anulan los valores predeterminados. Tenga en cuenta que no se crea ningún archivo .sync de forma predeterminada.

A continuación detallamos tres escenarios comunes donde un archivo de configuración es útil/necesario:

  • Depuración remota
  • Discrepancia en nombres de módulos
  • PID faltante

Depuración remota: el depurador y el desensamblador están en diferentes hosts

La sección [INTERFACE] se utiliza para personalizar la configuración relacionada con la red. Supongamos que uno quiere sincronizar IDA con un depurador ejecutándose dentro de una máquina virtual (o simplemente otro host), escenario común de depuración remota del kernel.

Simplemente cree dos archivos .sync:

  • uno en la máquina donde está instalado IDA, en el directorio IDB:
  • Para Ghidra, colóquelo en el directorio home, ej. "/home/user" o "C:\Users\user".``` [INTERFACE] host=192.168.128.1 port=9234
root@kitploit:~
Le dice al complemento **ret-sync** ``IDA`` que escuche en la interfaz ``192.168.128.1`` con el puerto ``9234``. No hace falta decir que esta interfaz debe ser accesible desde el host remoto o la máquina virtual.

* uno en la máquina donde se ejecuta el depurador, en el directorio home del usuario:```
[INTERFACE]
host=192.168.128.1
port=9234

Le indica al complemento de depurador ret-sync que se conecte al complemento ret-sync IDA configurado previamente para escuchar en esta interfaz.

NOTA: Debes especificar una IP real aquí y no usar 0.0.0.0. Esto se debe a que la variable es utilizada por múltiples fuentes tanto para enlazar como para conectar, por lo que usar 0.0.0.0 resultará en errores extraños.

Los nombres de los módulos de IDB y del depurador son diferentes```

[ALIASES] ntoskrnl_vuln.exe=ntkrnlmp.exe

root@kitploit:~
La sección ``[ALIASES]`` se utiliza para personalizar el nombre que emplea un desensamblador (IDA/Ghidra) para registrar un módulo en su despachador/administrador de programas.

Por defecto, los complementos del desensamblador usan el nombre del archivo de entrada. Sin embargo, es posible que se haya renombrado el archivo previamente y que ya no coincida con el nombre del proceso real o del módulo cargado según lo ve el depurador.

Aquí simplemente le decimos al despachador que coincida con el nombre `ntkrnlmp.exe` (nombre real) en lugar de `ntoskrnl_vuln.exe` (nombre IDB).

## gdb con frontend de depuración de Qt Creator

El frontend de depuración de Qt Creator cambia la forma en que se registra la salida de comandos de gdb. Dado que esto interferiría con la sincronización, existe una opción para usar la salida cruda de gdb para la sincronización en lugar de un archivo temporal. En el archivo de configuración .sync use```
[GENERAL]
use_tmp_logging_file=false

si desea utilizar el frontend de depuración Qt para el objetivo.

Dispositivos embebidos y falta de /proc/<pid>/maps

En algunos escenarios, como depurar dispositivos embebidos a través de serie o firmware sin procesar en QEMU, gdb no conoce el PID y no puede acceder a /proc/<pid>/maps.

En estos casos, la sección [INIT] se utiliza para pasar un contexto personalizado al plugin. Permite sobrescribir algunos campos como el PID y los mapeos de memoria.

.sync extracto de contenido:``` [INIT] context = { "pid": 200, "mappings": [ [0x400000, 0x7A81158, 0x7681158, "asav941-200.qcow2|lina"] ] }

root@kitploit:~
Cada entrada en los mappings es: ``mem_base``, ``mem_end``, ``mem_size``, ``mem_name``.


## Evitando el reajuste automático de direcciones

En algunos escenarios, como al depurar dispositivos embebidos o conectarse a
interfaces de depuración minimalistas, puede ser más conveniente evitar la
funcionalidad de reajuste automático de direcciones implementada en los plugins del desensamblador.

La opción `use_raw_addr` actualmente solo es compatible con Ghidra. En
el archivo de configuración .sync utilice:```
[GENERAL]
use_raw_addr=true

Instalación

Extensión para IDA

Requisitos previos de IDA

Se requiere IDA 9.2+. Para versiones anteriores, por favor usa checkout del proyecto anterior a la etiqueta ida9.2 de las Tags disponibles.

Instalar la extensión para IDA

Para la instalación en IDA, copia Syncplugin.py y la carpeta retsync de ext_ida al directorio de plugins de IDA, por ejemplo:

  • C:\Program Files\IDA Pro 7.4\plugins
  • %APPDATA%\Hex-Rays\IDA Pro\plugins
  • ~/.idapro/plugins

Ejecutar la extensión para IDA

  1. Abrir IDB
  2. Ejecutar el plugin en IDA (Alt-Shift-S) o Editar -> Plugins -> ``ret-sync````` [sync] default idb name: ld.exe [sync] sync enabled [sync] cmdline: "C:\Program Files\Python38\python.exe" -u "C:\Users\user\AppData\Roaming\Hex-Rays\IDA Pro\plugins\retsync\broker.py" --idb "target.exe" [sync] module base 0x100400000 [sync] hexrays #7.3.0.190614 found [sync] broker started [sync] plugin loaded [sync] << broker << dispatcher not found, trying to run it [sync] << broker << dispatcher now runs with pid: 6544 [sync] << broker << connected to dispatcher [sync] << broker << listening on port 63107
root@kitploit:~
### Solución de problemas del complemento IDA

Para solucionar problemas con la extensión IDA, hay dos opciones disponibles en el archivo `retsync/rsconfig.py`:```
LOG_LEVEL = logging.INFO
LOG_TO_FILE_ENABLE = False

Establecer el valor de LOG_LEVEL en logging.DEBUG hace que el plugin sea más verboso.

Establecer el valor de LOG_TO_FILE_ENABLE en True activa el registro de información de excepción de broker.py y dispatcher.py en archivos dedicados. Los archivos de registro se generan en la carpeta %TMP% con un patrón de nombre retsync.%s.err .

Extensión de Ghidra

Construir la extensión de Ghidra

Puede usar la versión precompilada de la carpeta ext_ghidra/dist o seguir las instrucciones para compilarla. Cada compilación de la extensión solo es compatible con la versión de Ghidra especificada en el nombre del archivo del plugin. Por ejemplo, ghidra_9.1_PUBLIC_20191104_retsync.zip es para Ghidra 9.1 Public.

  1. Instalar Ghidra
  2. Instalar gradle```bash apt install gradle
root@kitploit:~
3. Construye la extensión para tu instalación de Ghidra (reemplaza `$GHIDRA_DIR` con tu directorio de instalación)```bash
cd ext_ghidra
gradle -PGHIDRA_INSTALL_DIR=$GHIDRA_DIR

Instalar la extensión de Ghidra

  1. Desde el administrador de proyectos de Ghidra: File -> Install Extensions..., haga clic en el signo + y seleccione el archivo ext_ghidra/dist/ghidra_*_retsync.zip y haga clic en Aceptar. Esto extraerá la carpeta retsync del zip en $GHIDRA_DIR/Extensions/Ghidra/
  2. Reinicie Ghidra como se solicita
  3. Después de recargar Ghidra, abra un módulo en CodeBrowser. Debería indicarle que se ha detectado un nuevo plugin de extensión. Seleccione "sí" para configurarlo. Luego marque "RetSyncPlugin" y haga clic en Aceptar. La consola debería mostrar algo como:``` [*] retsync init [>] programOpened: tm.sys imageBase: 0x1c0000000
root@kitploit:~
4. Desde la herramienta CodeBrowser de Ghidra: use iconos de la barra de herramientas o atajos para habilitar (``Alt+s``)/deshabilitar (``Alt+Shift+s``)/reiniciar (``Alt+r``)
   la sincronización.

También está disponible una ventana de estado desde ``Windows`` -> ``RetSyncPlugin``. Generalmente
se desea colocarla en un lateral para integrarla con las ventanas del entorno de Ghidra.


## Extensión de Binary Ninja

El soporte para Binary Ninja es experimental, asegúrese de hacer una copia de seguridad de sus bases de datos de análisis.

### Requisitos previos de Binary Ninja

**ret-sync** requiere como mínimo la versión 2.2 de Binary Ninja, así como Python 3
(no se admite Python 2).


### Instalar la extensión de Binary Ninja

**ret-sync** aún no se distribuye a través del Administrador de complementos de Binary Ninja;
se requiere una instalación manual. Simplemente copie el contenido de la carpeta `ext_bn`
en la carpeta de complementos de Binary Ninja, por ejemplo:

`%APPDATA%\Binary Ninja\plugins`

Después de reiniciar Binary Ninja, debería aparecer el siguiente resultado en la
ventana de consola:```
[sync] commands added
Loaded python3 plugin 'retsync'

Extensión de WinDbg

Compilar la extensión de WinDbg

Use la solución de Visual Studio 2017 proporcionada en ext_windbg. Visual Studio Community Edition 2017 y 2026 se probaron con éxito (las versiones intermedias también deberían funcionar).

Esto compilará el archivo x64\release\sync.dll.

Instalar la extensión de WinDbg

Deberá copiar el archivo sync.dll resultante en la ruta de extensión de Windbg adecuada.

  • WinDbg Classic:

Para versiones anteriores de Windbg, esto es algo así (tenga cuidado con los sabores x86/x64), por ejemplo

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\sync.dll

  • WinDbg Preview

La carpeta para almacenar la extensión parece basarse en la ruta PATH, por lo que debe colocarla en una de las ubicaciones consultadas.

Un ejemplo es colocarla aquí:

C:\Users\user\AppData\Local\Microsoft\WindowsApps\sync.dll

Ejecutar la extensión de WinDbg

  1. Inicie WinDbg en el objetivo
  2. Cargue la extensión (comando .load)``` 0:000> .load sync [sync.dll] DebugExtensionInitialize, ExtensionApis loaded
root@kitploit:~
3. Sincronizar WinDbg```
      0:000> !sync
      [sync] No argument found, using default host (127.0.0.1:9100)
      [sync] sync success, sock 0x5a8
      [sync] probing sync
      [sync] sync is now enabled with host 127.0.0.1

Por ejemplo, en la ventana de salida de IDA``` [] << broker << dispatcher msg: add new client (listening on port 63898), nb client(s): 1 [] << broker << dispatcher msg: new debugger client: dbg connect - HostMachine\HostUser [sync] set debugger dialect to windbg, enabling hotkeys

root@kitploit:~
Si el módulo actual de Windbg coincide con el nombre de archivo de IDA```
      [sync] idb is enabled with the idb client matching the module name.

Solución de problemas de instalación de WinDbg

Nota: Si obtienes el siguiente error, es porque no has copiado el archivo a la carpeta correcta en los pasos anteriores.``` 0: kd> .load sync The call to LoadLibrary(sync) failed, Win32 error 0n2 "The system cannot find the file specified." Please check your debugger configuration and/or network access.

root@kitploit:~
El error a continuación generalmente significa que Windbg intentó cargar la variante incorrecta de la extensión, ej: ``x64`` en lugar de la ``x86`` `sync.dll`.```
0:000> .load sync
The call to LoadLibrary(sync) failed, Win32 error 0n193
    "%1 is not a valid Win32 application."
Please check your debugger configuration and/or network access.

Como WinDbg Preview carga ambos complementos (x86 y x64) desde el mismo directorio, se puede renombrar el archivo x86 como sync32.dll.``` 0:000> .load sync32

root@kitploit:~
## Instalación de GNU gdb (GDB)

1. Copie `ext_gdb/sync.py` al directorio de su elección
2. Cargue la extensión (consulte los scripts de carga automática)```
    gdb> source sync.py
    [sync] configuration file loaded 192.168.52.1:9100
    [sync] commands added

Instalación de LLDB

El soporte de LLDB es experimental, sin embargo:

  1. Cargar la extensión (también se puede agregar en ~/.lldbinit)``` lldb> command script import sync
root@kitploit:~
## Instalación de OllyDbg 1.10

El soporte para OllyDbg 1.10 es experimental, sin embargo:

1. Compila el plugin usando la solución de VS (opcional, consulta los binarios precompilados)
2. Copia la dll en el directorio de plugins de OllyDbg

## Instalación de OllyDbg2

El soporte para OllyDbg2 es experimental, sin embargo:

1. Compila el plugin usando la solución de VS (opcional, consulta los binarios precompilados)
2. Copia la dll en el directorio de plugins de OllyDbg2

## Instalación de x64dbg

Basado en testplugin,  https://github.com/x64dbg/testplugin. El soporte para x64dbg es experimental, sin embargo:

1. Compila el plugin usando la solución de VS (opcional, consulta los binarios precompilados).
   Puede que necesites una versión diferente del SDK del plugin,
   se puede encontrar una copia en cada versión de x64dbg.
   Pega el directorio "``pluginsdk``" dentro de "``ext_x64dbg\x64dbg_sync``"
2. Copia la dll (la extensión es ``.d32`` o ``.dp64``) en el directorio de plugins de x64dbg.

# Uso

## **ret-sync** comandos del depurador

Para depuradores orientados a línea de comandos (principalmente Windbg y GDB) un conjunto de comandos
es expuesto por **ret-sync** para ayudar en la tarea de ingeniería inversa.

Los comandos siguientes son genéricos (Windbg y GDB), ten en cuenta que se necesita un prefijo `!`
en WinDbg (ej.: `sync`  en GDB, `!sync` en WinDbg).

| Comando del depurador           | Descripción                                                                               |
|----------------------------|-------------------------------------------------------------------------------------------|
| `synchelp`                   | Muestra la lista de comandos disponibles con breve explicación                             |
| `sync`                       | Inicia la sincronización                                                                     |
| `syncoff`                    | Detiene la sincronización                                                                      |
| `cmt [-a address] <string>`  | Añade un comentario en la ip actual en el desensamblador                                               |
| `rcmt [-a address]`          | Restablece el comentario en la ip actual en el desensamblador                                               |
| `fcmt [-a address] <string>` | Añade un comentario de función para la función en la que se encuentra la ip actual                        |
| `raddr <expression>`         | Añade un comentario con la dirección reubicada evaluada a partir de la expresión                              |
| `rln <expression>`           | Obtiene el símbolo del desensamblador para la dirección dada                                    |
| `lbl [-a address] <string>`  | Añade un nombre de etiqueta en la ip actual en el desensamblador                                            |
| `cmd <string>`               | Ejecuta un comando en el depurador y añade su salida como comentario en la ip actual en el desensamblador |
| `bc <\|\|on\|off\|set 0xBBGGRR>` | Habilita/deshabilita el coloreado de rutas en el desensamblador                                              |
| `idblist`                    | Obtiene la lista de todos los clientes IDB conectados al despachador                                   |
| `syncmodauto <on\|off>`       | Habilita/deshabilita el cambio automático del desensamblador basado en el nombre del módulo                              |
| `idbn <n>`                   | Establece el IDB activo en el enésimo cliente                                                          |
| `jmpto <expression>`         |                                                                                           |
| `jmpraw <expression>` | Si un IDB está habilitado, la vista del desensamblador se sincroniza con la dirección resultante.    |
| `translate <base> <addr> <mod>` | reubica una dirección con respecto al nombre y desplazamiento de su módulo   |


Comandos específicos de WinDbg:

| Comando del depurador           | Descripción                                                                               |
|----------------------------|-------------------------------------------------------------------------------------------|
| `curmod`  |  Muestra información del módulo para el desplazamiento de instrucción actual (para depuración de problemas) |
| `modlist`  |  Lista de módulos mejorada con Lenguaje de Marcado del Depurador (DML) diseñada para un cambio más fluido de idb activo  |
| `idb <nombre del módulo>`  |  Establece el módulo dado como el idb activo (consulta `modlist` versión mejorada de `lm`) |
| `modmap <base> <tamaño> <nombre>` |  Se añade un módulo sintético ("falso") (definido usando su dirección base y tamaño) a la lista interna del depurador  |
| `modunmap <base>` |  Elimina un módulo sintético previamente mapeado en la dirección base  |
| `modcheck <\|\|md5>`  |  Se usa para comprobar si el módulo actual realmente coincide con el archivo del IDB (ej: el módulo ha sido actualizado)  |
| `bpcmds <\|\|save\|load\|>` | Envoltorio de **bpcmds**, guarda y recarga la salida de **.bpcmds** (lista de comandos de puntos de interrupción) en el IDB actual  |
| `ks` | Salida mejorada con Lenguaje de Marcado del Depurador (DML) del comando **kv**   |


Comandos específicos de GDB:

| Comando del depurador           | Descripción                                                                               |
|----------------------------|-------------------------------------------------------------------------------------------|
|`bbt` |  Hermoso backtrace. Similar a **bt** en GDB pero solicita símbolos del desensamblador  |
| `patch`  | Parchea bytes en el desensamblador basado en el contexto en vivo   |
| `bx` | Similar a **x** de GDB pero usando un símbolo. El símbolo será resuelto por el desensamblador   |
| `cc` | Continúa hasta el cursor en el desensamblador  |


## Uso de IDA

### GUI del plugin de IDA

El campo de entrada ``Overwrite idb name`` está destinado a cambiar el nombre predeterminado del IDB.
Es el nombre que utiliza el plugin para registrarse con el despachador. El cambio automático de IDB se basa en la coincidencia de nombres de módulos. En caso de nombres conflictivos (como un ``foo.exe`` y ``foo.dll``), esto puede usarse para facilitar la coincidencia.
Ten en cuenta que si modificas el campo de entrada mientras la sincronización está activa, debes volver a registrarte con el despachador; esto se puede hacer simplemente usando el botón "``Restart``".

Como recordatorio, es posible crear alias por defecto usando el archivo de configuración ``.sync``.



### Atajos globales de IDA

**ret-sync** define estos atajos globales en IDA:

* ``Alt-Shift-S``  - Ejecuta el plugin **ret-sync**
* ``Ctrl-Shift-S``  - Alterna la sincronización global
* ``Ctrl-H``  - Alterna la sincronización de Hex-Rays

También hay dos botones disponibles en la barra de herramientas de Depuración para alternar la sincronización global y de Hex-Rays.

### Enlaces de IDA para comandos del depurador

``Syncplugin.py`` también registra teclas de acceso rápido envolventes de comandos del depurador.

* ``F2`` - Establece punto de interrupción en la dirección del cursor
* ``F3`` - Establece punto de interrupción de un solo disparo en la dirección del cursor
* ``Ctrl-F2`` - Establece punto de interrupción de hardware en la dirección del cursor
* ``Ctrl-F3`` - Establece punto de interrupción de hardware de un solo disparo en la dirección del cursor
* ``Alt-F2`` - Traduce (reubica en el depurador) la dirección actual del cursor
* ``Alt-F5`` - Ir
* ``Ctrl-Alt-F5`` - Ejecutar (solo GDB)
* ``F10`` - Paso a paso
* ``F11`` - Traza simple

Estos comandos solo están disponibles cuando el IDB actual está activo. Cuando es posible, también se han implementado para otros depuradores.

## Uso de Ghidra

### GUI del plugin de Ghidra

Una vez abierto el RetSyncPlugin, puedes añadirlo a la ventana CodeBrowser simplemente arrastrándolo y soltándolo:

![](https://assets.kitploit.com/production/public/readmes/3693/c6d122e27a256e4f99d0f760d2d6febb89648881dbdee9d6ffd84092bb0d9931.png)

Si deseas ver varios módulos, los archivos deben estar abiertos en el mismo visor CodeBrowser, simplemente arrastra y suelta los adicionales en la ventana CodeBrowser para obtener el resultado como el anterior.

### Atajos globales de Ghidra

**ret-sync** define estos atajos globales en Ghidra:

* ``Alt-S``  - Habilita la sincronización
* ``Alt-Shift-S``  - Deshabilita la sincronización
* ``Alt-R``  - Reinicia la sincronización
* ``Alt-Shift-R``  - Recarga la configuración

### Enlaces de Ghidra para comandos del depurador

También se implementan enlaces para comandos del depurador. Son similares a los de la extensión de IDA (excepto el comando "Ir").

* ``F2``  - Establece punto de interrupción en la dirección del cursor
* ``Ctrl-F2`` - Establece punto de interrupción de hardware en la dirección del cursor
* ``Alt-F3`` - Establece punto de interrupción de un solo disparo en la dirección del cursor
* ``Ctrl-F3`` - Establece punto de interrupción de hardware de un solo disparo en la dirección del cursor
* ``Alt-F2`` - Traduce (reubica en el depurador) la dirección actual del cursor
* ``F5`` - Ir
* ``Alt-F5`` - Ejecutar (solo GDB)
* ``F10`` - Paso a paso
* ``F11`` - Traza simple


## Uso de Binary Ninja

### Atajos globales de Binary Ninja

**ret-sync** define estos atajos globales en Binary Ninja:

* ``Alt-S``  - Habilita la sincronización
* ``Alt-Shift-S``  - Deshabilita la sincronización


### Atajos de Binary Ninja

También se implementan enlaces para comandos del depurador. Son similares a los de la extensión de IDA.

* ``F2``  - Establece punto de interrupción en la dirección del cursor
* ``Ctrl-F2`` - Establece punto de interrupción de hardware en la dirección del cursor
* ``Alt-F3`` - Establece punto de interrupción de un solo disparo en la dirección del cursor
* ``Ctrl-F3`` - Establece punto de interrupción de hardware de un solo disparo en la dirección del cursor
* ``Alt-F2`` - Traduce (reubica en el depurador) la dirección actual del cursor
* ``Alt-F5`` - Ir
* ``F10`` - Paso a paso
* ``F11`` - Traza simple


## Uso de WinDbg

### Comandos del plugin de WinDbg

* **!sync**: Inicia la sincronización
* **!syncoff**: Detiene la sincronización
* **!synchelp**: Muestra la lista de comandos disponibles con breve explicación.
* **!cmt [-a address] <string>**: Añade comentario en la ip actual en IDA```
    [WinDbg]
    0:000:x86> pr
    eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
    eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0         nv up ei pl nz na po nc
    cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
    image00000000_00400000+0x30db1:
    00430db1 57    push    edi

    0:000:x86> dd esp 8
    0028ed94  00000000 00433845 0028eebc 00000032
    0028eda4  0028f88c 00000064 002b049e 00000110

    0:000:x86> !cmt 0028ed94  00000000 00433845 0028eebc 00000032
    [sync.dll]  !cmt called

    [IDA]
    .text:00430DB1    push    edi             ; 0028ed94  00000000 00433845 0028eebc 00000032
  • !rcmt [-a address]: Restablecer comentario en la IP actual en IDA``` [WinDbg] 0:000:x86> !rcmt [sync] !rcmt called

    [IDA] .text:00430DB1 push edi

root@kitploit:~
* **!fcmt [-a address] <string>**: Añadir un comentario de función para la función en la que se encuentra la ip actual```
    [WinDbg]
    0:000:x86> !fcmt decodes buffer with key
    [sync] !fcmt called

    [IDA]
    .text:004012E0 ; decodes buffer with key
    .text:004012E0                 public decrypt_func
    .text:004012E0 decrypt_func    proc near
    .text:004012E0                 push    ebp

Nota: llamar a este comando sin argumento reinicia el comentario de la función.

  • !raddr <expresión>: Agrega un comentario con la dirección reubicada evaluada a partir de la expresión

  • !rln <expresión>: Obtiene el símbolo del desensamblador para la dirección dada

  • !lbl [-a dirección] : Agrega un nombre de etiqueta en la IP actual en el desensamblador``` [WinDbg] 0:000:x86> !lbl meaningful_label [sync] !lbl called

    [IDA] .text:000000000040271E meaningful_label: .text:000000000040271E mov rdx, rsp

root@kitploit:~
* **!cmd <string>**: Ejecuta un comando en WinDbg y añade su salida como comentario en la IP actual en el desensamblador```
    [WinDbg]
    0:000:x86> pr
    eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
    eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0         nv up ei pl nz na po nc
    cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
    image00000000_00400000+0x30db1:
    00430db1 57     push    edi
    [sync.dll]  !cmd r edi

    [IDA]
    .text:00430DB1    push    edi             ; edi=00000064
  • !bc <||on|off|set 0xBBGGRR> : Habilitar/deshabilitar coloración de ruta en el desensamblador. Esto NO es una herramienta de rastreo de código, existen herramientas eficientes para eso. Cada instrucción ejecutada manualmente se colorea en el grafo. Colorea una sola instrucción en la ip actual si se llama sin argumento. El argumento "set" se utiliza para establecer el color de ruta con un nuevo código hex rgb (restablece el color si se llama con un valor > 0xFFFFFF).
  • !idblist: Obtener lista de todos los clientes IDB conectados al despachador:``` [WinDbg] 0:000> !idblist

    currently connected idb(s): [0] target.exe

root@kitploit:~
* **!syncmodauto <on|off>**: Habilitar/deshabilitar el cambio automático del desensamblador basado en el nombre del módulo:```
    [WinDbg]
    0:000> !syncmodauto off

    [IDA]
    [*] << broker << dispatcher msg: sync mode auto set to off
  • !idbn : Establece la IDB activa al n-ésimo cliente. n debe ser un valor decimal válido. Este es un modo semiautomático (tributo personal al tremendo jj).``` [WinDbg] 0:000:> !idbn 0

    current idb set to 0

root@kitploit:~
En este ejemplo, el cliente IDB activo actual se habría establecido en:```
	[0] target.exe.
  • !jmpto : La expresión dada como argumento se evalúa en el contexto del estado actual del depurador. La vista del desensamblador se sincroniza entonces con la dirección resultante si un módulo coincidente está registrado. Puede considerarse como una sincronización manual; la reubicación se realiza automáticamente, sobre la marcha. Especialmente útil para binarios reubicados aleatoriamente.
  • !jmpraw : La expresión dada como argumento se evalúa en el contexto del estado actual del depurador. Si IDB está habilitado, la vista del desensamblador se sincroniza con la dirección resultante. La dirección no se reubica y no hay cambio de IDB. Especialmente útil para código asignado/generado dinámicamente.
  • !modmap : Se añade un módulo sintético ("falsificado") (definido por su dirección base y tamaño) a la lista interna del depurador. Según msdn: "Si todos los módulos se recargan -por ejemplo, llamando a Reload con el parámetro Module establecido a una cadena vacía- todos los módulos sintéticos se descartarán." Puede usarse para depurar más fácilmente código asignado/generado dinámicamente.
  • !modunmap : Eliminar un módulo sintético previamente asignado en la dirección base.
  • !modcheck <||md5>: Se usa para comprobar si el módulo actual realmente coincide con el archivo de IDB (ej: el módulo ha sido actualizado). Cuando se llama sin argumento, se utiliza el GUID del pdb del Directorio de Depuración. Alternativamente puede usar md5, pero solo con un depurado local (no en depuración remota del kernel).
  • !bpcmds <||save|load|>: Envoltorio de bpcmds, guarda y recarga la salida de .bpcmds (lista de comandos de puntos de interrupción) en el IDB actual. Muestra (pero no ejecuta) los datos guardados si se llama sin argumento. El almacenamiento persistente se logra usando la característica netnode de IDA.
  • !ks: Salida mejorada del comando kv con Debugger Markup Language (DML). Las direcciones de código son clicables (!jmpto) al igual que las direcciones de datos (dc).
  • !translate : Diseñado para usarse desde IDA (acceso directo Alt-F2), reubicar una dirección con respecto al nombre y desplazamiento de su módulo.

Argumento opcional de dirección

Los comandos !cmt, !rcmt y !fcmt admiten una opción de dirección opcional: -a o --address. La dirección debe pasarse como un valor hexadecimal. El análisis de comandos se basa en el módulo argparse de Python. Para detener el análisis de línea use --.``` [WinDbg] 0:000:x86> !cmt -a 0x430DB2 comment

root@kitploit:~
La dirección debe ser una dirección de instrucción válida.

## Uso de GNU gdb (GDB)

Sincronizar con el host:```
    gdb> sync
    [sync] sync is now enabled with host 192.168.52.1
    <not running>

    gdb> r
    Starting program: /bin/ls
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib/libthread_db.so.1".

Comandos del plugin GDB

Utiliza comandos, sin el prefijo "!"``` (gdb) cmd x/i $pc [sync] command output: => 0x8049ca3: push edi

root@kitploit:~
(gdb) synchelp
[sync] extension commands help:
 > sync <host>
 > syncoff
 > cmt [-a address] <string>
 > rcmt [-a address] <string>
 > fcmt [-a address] <string>
 > cmd <string>
 > bc <on|off|>
 > rln <address>
 > bbt <symbol>
 > patch <addr> <count> <size>
 > bx /i <symbol>
 > cc
 > translate <base> <addr> <mod>
root@kitploit:~
* **rln**: Obtener el símbolo del IDB para la dirección dada
* **bbt**: Hermoso backtrace. Similar a **bt** pero solicita símbolos del desensamblador```
    (gdb) bt
    #0  0x0000000000a91a73 in ?? ()
    #1  0x0000000000a6d994 in ?? ()
    #2  0x0000000000a89125 in ?? ()
    #3  0x0000000000a8a574 in ?? ()
    #4  0x000000000044f83b in ?? ()
    #5  0x0000000000000000 in ?? ()
    (gdb) bbt
    #0 0x0000000000a91a73 in IKE_GetAssembledPkt ()
    #1 0x0000000000a6d994 in catcher ()
    #2 0x0000000000a89125 in IKEProcessMsg ()
    #3 0x0000000000a8a574 in IkeDaemon ()
    #4 0x000000000044f83b in sub_44F7D0 ()
    #5 0x0000000000000000 in  ()
  • patch: Parchea bytes en el desensamblador basado en el contexto en vivo

  • bx: Visualización hermosa. Similar a x pero usando un símbolo. El símbolo será resuelto por el desensamblador.

  • cc: Continuar hasta el cursor en el desensamblador. Esto es una alternativa a usar F3 para establecer un punto de interrupción de un solo disparo y F5 para continuar. Esto es útil si prefieres hacerlo desde gdb.``` (gdb) b* 0xA91A73 Breakpoint 1 at 0xa91a73 (gdb) c Continuing.

    Breakpoint 1, 0x0000000000a91a73 in ?? () (gdb) cc [sync] current cursor: 0xa91a7f [sync] reached successfully (gdb)

root@kitploit:~
## Uso de LLDB

1. Sincronizar con el host```
    lldb> process launch -s
    lldb> sync
    [sync] connecting to localhost
    [sync] sync is now enabled with host localhost
    [sync] event handler started
  1. Usa comandos``` lldb> synchelp [sync] extension commands help:

    sync = synchronize with or the default value syncoff = stop synchronization cmt = add comment at current eip in IDA rcmt = reset comments at current eip in IDA fcmt = add a function comment for 'f = get_func(eip)' in IDA cmd = execute command and add its output as comment at current eip in IDA bc <on|off|> = enable/disable path coloring in IDA color a single instruction at current eip if called without argument lldb> cmt mooo

root@kitploit:~
## Uso de OllyDbg 1.10

1. Use el menú Plugins o los atajos para habilitar (``Alt+s``)/deshabilitar (``Alt+u``)
   la sincronización.


## Uso de OllyDbg2

1. Use el menú Plugins o los atajos para habilitar (``Ctrl+s``)/deshabilitar (``Ctrl+u``)
   la sincronización.

Debido al estado beta de la API de OllyDbg2, solo se han implementado las siguientes características:

- Sincronización de gráfico [use ``F7``; ``F8`` para avanzar paso a paso]
- Comentario   [use ``CTRL+;``]
- Etiqueta     [use ``CTRL+:``]


## Uso de x64dbg

1. Use el menú Plugins o los comandos para habilitar ("``!sync"``) o deshabilitar ("``!syncoff``") la sincronización.

2. Use comandos```
[sync] synchelp command!
[sync] extension commands help:
 > !sync                          = synchronize with <host from conf> or the default value
 > !syncoff                       = stop synchronization
 > !syncmodauto <on | off>        = enable / disable idb auto switch based on module name
 > !synchelp                      = display this help
 > !cmt <string>                  = add comment at current eip in IDA
 > !rcmt <string>                 = reset comments at current eip in IDA
 > !idblist                       = display list of all IDB clients connected to the dispatcher
 > !idb <module name>             = set given module as the active idb (see !idblist)
 > !idbn <n>                      = set active idb to the n_th client. n should be a valid decimal value
 > !translate <base> <addr> <mod> = rebase an address with respect to local module's base
 > !insync                        = synchronize the selected instruction block in the disassembly window.

Nota: usar el comando !translate desde un desensamblador (IDA/Ghidra, atajo Alt-F2), hará que la ventana del desensamblador "salte" a la dirección específica (equivalente a ejecutar disasm en la línea de comandos de x64dbg).

Uso de la librería Python

Es posible que se quieran usar las funciones principales de ret-sync (sincronización de posición con un desensamblador, resolución de símbolos) aunque no se disponga de un entorno de depuración completo o con una herramienta personalizada. Para ello, se ha extraído una biblioteca Python minimalista.

El siguiente ejemplo ilustra el uso de la biblioteca Python con un script que recorre la salida de una herramienta de registro/trazado basada en eventos.```python from sync import *

HOST = '127.0.0.1'

MAPPINGS = [ [0x555555400000, 0x555555402000, 0x2000, " /bin/tempfile"], [0x7ffff7dd3000, 0x7ffff7dfc000, 0x29000, " /lib/x86_64-linux-gnu/ld-2.27.so"], [0x7ffff7ff7000, 0x7ffff7ffb000, 0x4000, " [vvar]"], [0x7ffff7ffb000, 0x7ffff7ffc000, 0x1000, " [vdso]"], [0x7ffffffde000, 0x7ffffffff000, 0x21000, " [stack]"], ]

EVENTS = [ [0x0000555555400e74, "malloc"], [0x0000555555400eb3, "open"], [0x0000555555400ee8, "exit"] ]

synctool = Sync(HOST, MAPPINGS)

for e in EVENTS: offset, name = e synctool.invoke(offset) print(" 0x%08x - %s" % (offset, name)) print("[>] press enter for next event") input()

root@kitploit:~
# Extender

Aunque inicialmente centrado en análisis dinámico (depuradores), por supuesto es posible extender el conjunto de plugins e integrarse con otras herramientas.

- Integración con **REVEN** Plataforma de Análisis y Depuración Atemporal de [Tetrane](https://www.tetrane.com/):
  - http://blog.tetrane.com/2015/02/reven-in-your-toolkit.html
  - https://twitter.com/tetrane/status/1374768014193799175
- Integración con **Emulador EFI DXE** de Assaf Carlsbad ([@assaf_carlsbad](https://twitter.com/assaf_carlsbad)):
  - https://twitter.com/assaf_carlsbad/status/1242114356881641474
  - https://github.com/assafcarlsbad/efi_dxe_emulator

Otros recursos:

- "*Combinando análisis binario estático y dinámico - ret-sync*" por Jean-Christophe Delaunay
  - https://www.synacktiv.com/ressources/bieresecu1_ret-sync_en.pdf

# TODO

- Seguro.

# Errores conocidos/Limitaciones

- Probado con Python 2.7/3.7, IDA 7.7 (Windows, Linux y Mac OS X), Ghidra 10.1.1, Binary Ninja 3.0.3225-dev, GNU gdb (GDB) 8.1.0 (Debian), lldb 310.2.37.
- **NO HAY AUTENTICACIÓN/CIFRADO** alguno entre las partes; estás por tu cuenta.
- El código automodificante está fuera del alcance.

Con GDB:

- parece que el evento de parada no se llama al usar el comando 'return'.
- la depuración multi-hilo tiene problemas con las señales.

Con WinDbg:

- El plugin cliente de IDA se notifica aunque el punto de interrupción encontrado use una cadena de comando que lo hace continuar ('``g``'). Esto puede causar una gran ralentización si hay demasiados de estos eventos. Se ha implementado una solución limitada, la mejor solución sigue siendo desactivar la sincronización temporalmente.
- Posible condición de carrera

Con Ghidra:

- Los atajos no funcionan como se espera en el widget del descompilador.

Con IDA:

- El redibujado de la ventana de grafos es bastante lento para grafos grandes.
- Los atajos de **ret-sync** entran en conflicto en entornos Linux.

Conflicto(s):

- El software Logitech Updater es conocido por usar el mismo puerto predeterminado (9100). Una solución es usar un archivo de configuración global `.sync` para definir un puerto diferente.```
[INTERFACE]
host=127.0.0.1
port=9234

Licencia

ret-sync es software libre: puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia, o (a su elección) cualquier versión posterior.

Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la Licencia Pública General de GNU para obtener más detalles.

Debería haber recibido una copia de la Licencia Pública General de GNU junto con este programa. Si no es así, consulte http://www.gnu.org/licenses/.

El plugin de Binary Ninja se publica bajo la licencia MIT.

Agradecimientos

Un saludo a Bruce Dang, StalkR, @Ivanlef0u, Damien Aumaître, Sébastien Renaud y Kévin Szkudlapski, @m00dy, @saidelike, Xavier Mehrenberger, ben64, Raphaël Rigo, Jiss por su amabilidad, ayuda, comentarios y aportes. Ilfak Guilfanov, Igor Skochinsky y Arnaud Diederen por su ayuda con los internals de IDA y su excelente soporte. Gracias a Jordan Wiens y Vector 35. Finalmente, gracias también a todos los contribuyentes y a todos los que reportaron problemas/errores.

Descargar herramienta