Voltron + tmux == GDB Sexy

paneles3.png

Cuando hablamos de desensamblar un binario en sistemas Linux, BSD o Macs, el depurador de facto es GDB o GNU Debugger. Sí, tenemos otras opciones como IDA Pro o Hopper, pero ambas son comerciales, la primera te cuesta un riñón y a menos que te ganes la vida con ello no la veo muy rentable y la segunda, aunque apunta alto y es barata, todavía está un poco inmadura.

Si usas GDB de vez en cuando, ya conocerás el famoso fichero de configuración (.gdbinit) de reverse.put.as, que hace la interfaz del depurador mucha más amena, pero se echa de menos una interfaz un poco más completa, algo así como Ollygdb o ImmunityDebugger, algo que nos permita ver el código que estamos ejecutando, la pila, los registros, memoria, etc. Todo en a la vez en la misma pantalla.

Aquí es donde entra en juego Voltron, es un plugin o modulo escrito en Python (GDB provee una interfaz para Python) que nos permite exportar/compartir los datos de distintas vistas de GDB a través de sockets. Por lo que podemos en distintos terminales, ver distintas perspectivas del programa que estamos ejecutando dentro de GDB, como la memoria, la pila o los registros por ejemplo. Pero para agrupar toda esta información dentro de la misma ventana, usaremos tmux y la funcionalidad de dividir la ventana principal en distintos paneles.

paneles.png

Lo primero que tenemos que hacer es instalar las herramientas que necesitamos. Si usas un sistema basado en Debian (yo actualmente uso Mint 15), puedes instalar GDB y tmux a través de apt-get cualquiera que sea el gestor de paquetes que uses o prefieras.

Voltron se encuentra en github, así que o bien clonas el repositorio o te bajas el zip desde el sitio web. Si vas a clonar el repositorio, también tendrás que instalarte git si no lo tienes ya. Para clonar el repositorio:

git clone https://github.com/snarez/voltron.git

Voltron requiere la librería termcolor. Si no la tienes instalada (mi sistema no la tenía), el proceso de instalación es muy sencillo. Bájate el archivo tar.gz, lo descomprimes y dentro del mismo:

sudo python setup.py install

Una vez lo tenemos todo listo. Ahora tenemos que irnos al directorio voltron, dónde podemos encontrar un fichero setup.py. Lo instalamos de la misma forma que la librería anterior:

python setup.py install

En el mismo directorio voltron, también vemos un fichero de configuración llamado voltron.cfg, éste es un fichero pre-configurado con el que puedes jugar para hacer cambios en la interfaz. Dicho fichero debes copiarlo a tu directorio home como .voltron:

cp voltron.cfg ~/.voltron

Cuando carguemos GDB le tenemos que indicar que cargue nuestra libreria voltron (desde GDB):

source /path/to/voltron/gdbcmd.py

Si prefieres que Voltron se cargue automáticamente cada vez que cargues GDB, puede poner el comando anterior en el ~/.gdbinit. Si usas y quieres seguir usando el .gdbinit de reverse.put.as, puedes cargar Voltron desde un fichero llamado ~/.gdbinit.local.

Si todo ha ido bien, cuando carguemos gdb, veremos algo como:

tuxotron@tuxotron-T530 ~ $ gdb GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type “show copying” and “show warranty” for details. This GDB was configured as “x86_64-linux-gnu”. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Voltron loaded. (gdb)

Ahora vamos cargar los distintos panales. En el panel de arriba cargaremos el código desensamblado, en el central es donde ejecutaremos los comandos GDB (next, continue, breakpoint, etc), en el panel inferior pondremos la pila y en el de la derecha los registros.

Para ello una vez hemos cargado GDB, lo primero que tenemos que hacer es arrancar voltron. Desde GDB ejecutamos:

voltron start

En los paneles:

./voltron.py view disasm ./voltron.py view stack ./voltron.py view reg -v

Tal y como vemos en la siguiente imagen:

paneles2.png

Los paneles se refrescan cada vez que el depurador se para (llega a un breakpoint). Si queremos actualizar los paneles de forma manual en cualquier momento, podemos ejecutar:

voltron update (desde GDB)

El resultado lo podemos en el encabezado de esta entrada.

Voltron requiere GDB v7 o LLDB. También soporta la versión 6 de GDB, pero de forma limitada.

Además de los paneles que hemos visto, nos permite personalizar la vista de registros, podemos tener un panel ejecutando un comando concreto o el backtrace.

Para ver las opciones disponibles ejecuta:

./voltron.py -h

Nota: antes de salir del depurados (gdb) debes de parar voltron, sino los sockets se quedan abiertos.

voltron stop

Yo lo he usado por un par de días y me ha dado algún problemilla. Esperemos que lo mejoren porque a mi la idea personalmente me gusta bastante.

Si usas MacOS y tmuxinator, parece que alguien ha creado un script para hacer todo el trabajo por ti. Puedes encontrar el srcript en el fichero README.