Depurar un Programa utilizando GDB

  • Posted on: 1 April 2015
  • By: ReYDeS

GDB permite visualizar lo aconteciendo en el interior de otro programa mientras se ejecuta, o lo aconteciendo en otro programa al momento de caerse. GDB puede realizar cuatro tipos principales de cosas (además de otras cosas en apoyo de estas) para ayudar a atrapar fallas en el acto.

  • Iniciar un programa, especificando algo lo cual podría afectar su comportamiento.
  • Hacer detener a un programa sobre condiciones especificadas.
  • Examinar lo ocurrido, cuando un programa se detuvo.
  • Cambiar cosas en el programa, así se puede experimentar corrigiendo los efecto de una falla y seguir aprendiendo sobre otra.

El programa en depuración puede estar escrito en Ada, C, C++, Objetive-C, Pascal (y muchos otros lenguajes). Estos programas podrían ser ejecutados en la misma máquina de GDB (nativo) o en otra máquina (remoto). GDB se ejecuta en las variantes más populares de UNIX y Microsoft Windows.

Para la siguiente demostración se utiliza un archivo binario de nombre “prbuffer”, el cual ha sido compilado con la información de depuración (opción -g), lo cual se almacena en un archivo objeto. Este describe los tipos de datos de cada variable o función y la correspondencia ente los números de línea fuente y direcciones en el código ejecutable.

# cc -g -o prbuffer prbuffer.c

A continuación se realizar una demostración de ejemplo utilizando GDB y este programa. Se ejecuta gdb indicando el nombre del archivo a utilizar.

# gdb prbuffer

Ejecutar el programa bajo el control de GDB.

(gdb) run

El programa solicita el ingreso de una contraseña. Luego de ingresarla el programa finaliza normalmente.

Para la siguiente demostración se vuelve a ejecutar GDB y el programa. Luego se define un Punto de quiebre (Breakpoint), el cual hace al programa detenerse cuando se alcanza un cierto punto dentro del mismo. Se definirá un punto de quiebre en la línea 11; tomando como referencia el código fuente del programa; línea en la cual se solicita la contraseña. Luego se ejecuta el programa utilizando el comando “run”

(gdb) break 11
(gdb) run

GDB muestra como la contraseña ingresada almacenada en la variable de nombre “buff” se compara con la contraseña correcta. Esto se detalla en la línea número 12.

El valor de la variable “buff” puede ser visualizada utilizando el comando “print” de GDB.

(gdb) print buff

GDB también permite visualizar los nombres y valores de todos los registros, excepto los registros de punto flotante o vectores (en la trama de pila seleccionada).

(gdb) info registers

Para continuar con la ejecución del programa se utiliza el comando “next” de GDB.

(gdb) next

Se procede a deshabilitar el breakpoint definido. Para luego continuar con la ejecución normal del programa. El cual finaliza normalmente.

(gdb) continue

GDB incluye una gran cantidad de opciones. Sugiero revisar la documentación oficial de la herramienta, la cual es bastante copiosa y detallada.

Fuentes:

https://www.gnu.org/software/gdb/
https://sourceware.org/gdb/current/onlinedocs/gdb/
http://www.thegeekstuff.com/2013/06/buffer-overflow/

Sobre el Autor


Alonso Eduardo Caballero Quezada - ReYDeS
Instructor y Consultor Independiente en Ciberseguridad
Correo Electrónico: ReYDeS@gmail.com
Twitter: https://twitter.com/Alonso_ReYDeS
LinkedIn: https://pe.linkedin.com/in/alonsocaballeroquezada/
Facebook: https://www.facebook.com/alonsoreydes
Youtube: https://www.youtube.com/c/AlonsoCaballero


Curso de Informática Forense