
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.
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:
!peb de WinDbg, !drvobj, !address, etc.)Los desensambladores y el análisis estático nos proporcionan:
Características clave:
ret-sync es un fork de qb-sync que desarrollé y mantuve durante mi estancia en Quarkslab.
Los plugins del depurador:
ext_windbg/sync: archivos fuente de la extensión WinDbg, una vez compilado: sync.dllext_gdb/sync.py: plugin de GDBext_lldb/sync.py: plugin de LLDBext_olly1: plugin de OllyDbg 1.10ext_olly2: plugin de OllyDbg v2ext_x64dbg: plugin de x64dbgLos plugins del desensamblador:
ext_ida/SyncPlugin.pyext_ghidra/dist/ghidra_*_retsync.zip: plugin de Ghidraext_bn/retsync: plugin de Binary NinjaY el plugin de librería:
ext_lib/sync.py: librería Python independienteLos plugins de IDA y GDB requieren una instalación válida de Python. Se soportan Python 2 (>=2.7) y Python 3.
Se ofrecen binarios precompilados para los depuradores WinDbg/OllyDbg/OllyDbg2/x64dbg a través de un pipeline de Azure DevOps:
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.
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:
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:
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.
[ALIASES] ntoskrnl_vuln.exe=ntkrnlmp.exe
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.
/proc/<pid>/mapsEn 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"] ]
}
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
Se requiere IDA 9.2+. Para versiones anteriores, por favor usa checkout del proyecto anterior a la etiqueta ida9.2 de las Tags disponibles.
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/pluginsAlt-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### 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 .
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.
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
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/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'
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.
Deberá copiar el archivo sync.dll resultante en la
ruta de extensión de Windbg adecuada.
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
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
.load)```
0:000> .load sync
[sync.dll] DebugExtensionInitialize, ExtensionApis loaded3. 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
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.
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.
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
## 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
El soporte de LLDB es experimental, sin embargo:
~/.lldbinit)```
lldb> command script import sync## 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:

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
* **!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
* **!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
currently connected idb(s): [0] target.exe
* **!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
current idb set to 0
En este ejemplo, el cliente IDB activo actual se habría establecido en:```
[0] target.exe.
Alt-F2), reubicar una dirección con respecto al nombre y desplazamiento de su módulo.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
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".
Utiliza comandos, sin el prefijo "!"``` (gdb) cmd x/i $pc [sync] command output: => 0x8049ca3: push edi
(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>
* **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)
## 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
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
## 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).
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()
# 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
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.
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.