Depurar un Programa en Lenguaje C con GDB

Cuando se trabaja con programas escritos en el lenguaje C en sistemas Linux, el depurador a elegir es “gdb”. GDB Proporciona una robusta interfaz en línea de comando, permitiendo ejecutar un programa mientras se mantiene un completo control. Por ejemplo, se pueden ajustar puntos de interrupción en la ejecución de un programa, y vigilar los contenidos en memoria o los registros en cualquier punto requerido. Por esta razón, depuradores como GDB son valiosos para los programadores y “Hackers”.

En programa a utilizar como ejemplo, está escrito en lenguaje C, y su propósito es solicitar un nombre, para luego imprimir un saludo utilizando el nombre escrito por el usuario. Se procede a compilar y ejecutar el programa para verificar su correcto funcionamiento.

# cat hola.c
# gcc -o hola hola.c
# ./hola

Lo Básico de GDB

A continuación se presenta un listado de los comandos más utilizados en GDB.

  • b (función) Define una interrupción en “función”
  • b *mm Define una interrupción como una localización absoluta de memoria
  • info b Muestra información sobre puntos de interrupción
  • delete b Elimina un punto de interrupción
  • run (args) Inicia la depuración de un programa desde dentro de GDB con argumentos definidos
  • info reg Muestra información sobre el estado actual de los registros
  • stepi o si Ejecuta una instrucción máquina
  • next o n Ejecuta una función
  • bt Comando de traza hacia atrás, el cual muestra los nombres de la estructura de pila
  • up/down Mueve hacia arriba o abajo en la estructura de pila
  • print var / print/x $(reg) Imprime el valor de la variable; imprime el valor de un registro
  • x /NT A Examina la memoria, donde N = número de unidades a mostrar, T = tipo de dato a mostrar (x:hex, d:dec, c:char, s:string, i:instruction); A = dirección absoluta o nombre simbólico como “main”.
  • quit Sale de GDB

Para iniciar la depuración, se ejecuta GDB con el nombre del programa.

# gdb hola
(gdb) run

Se inicia nuevamente GDB con el nombre del programa, pero esta vez se define una interrupción en la función de nombre “main”, para interactuar con esta.

(gdb) b main
(gdb) n
(gdb) n

Se utiliza el comando "info" para mostrar el estado actual de los registros.

(gdb) info b
(gdb) quit

Desensamblar con GDB

Para desensamblar con GDB se necesitan utilizar dos comandos. El comando “set disassembly-flavor” conmuta entre el formato Intel (NASM) y AT&T. Por defecto GDB utiliza el formato At&T. El segundo comando “disassemble (nombre función)” desensambla la función definida. Por ejemplo para desensamblar

# gdb hola
(gdb) disassemble main


(gdb) set disassembly-flavor intel
(gdb) disassemble main
(gdb) quit

Fuentes:

https://www.gnu.org/software/gdb/
https://www.csee.umbc.edu/portal/help/nasm/nasm.shtml

Sobre el Autor


Alonso Eduardo Caballero Quezada - ReYDeS
Instructor y Consultor en Hacking Ético, Forense Digital & GNU/Linux
Correo Electrónico: ReYDeS@gmail.com
Twitter: @Alonso_ReYDeS
LinkedIn: pe.linkedin.com/in/alonsocaballeroquezada
Facebook: https://www.facebook.com/alonsoreydes
Resumen de mi CV: http://www.reydes.com/d/?q=node/1