HERRAMIENTAS
En este artículo repasaremos las herramientas más utilizadas para el ámbito del Buffer Overflow así como su configuración habitual.
COMPILADOR GCC
GCC es el compilador GNU para C por línea de comandos. Compila archivos en C y genera:
el archivo ejecutable:
gcc -o stack1 stack1.c(sin crear un archivo objeto intermedio)el archivo objeto intermedio, es decir el programa en assembler:
gcc -S -masm=intel -o stack1.s stack1.c.Utilizando ciertas Flags podemos eliminar las mitigaciones como hemos visto en el artículo Creando un laboratorio sin mitigaciones.
OBJDUMP
objdump es un desensamblador por línea de comandos que genera el código en assembler de un archivo ejecutable. Se usan desensambladores para generar el código en assembler y comprender el funcionamiento de un binario. Es decir, es necesario pasar de los ceros y unos almacenados en memoria a su representación simbólica legible para humanos. Aunque de acuerdo al código del binario del que se parta, el código en assembler resultante puede contener errores.
Un programa simple que hace una suma con el código fuente:
Al compilar con gcc -o generamos el ejecutable:
Si el programa fue compilado con información de debugging (gcc -g...) sería posible ver el código fuente intercalado con: objdump -M intel -S suma
La primer columna son las direcciones dentro del espacio de direcciones del programa. La segunda muestra el código máquina de cada instrucción y la última el código desensamblado del programa en assembler.
GDB
gdb es un debugger por línea de comandos que permite ejecutar un programa con “puntos de ruptura” o breakpoints para monitorear los contenidos de la memoria y de los registros del procesador en cualquier momento de la ejecución. Permite llevar a cabo el análisis dinámico de un binario para seguir o modificar el flujo de ejecución.
Para debuggear un programa se lo debe compilar con la opción -ggdb de debugging.
Un recurso muy útil para simplificar la tarea de debugging es usar herramientas como Pwndbg, Dashbord GDB, Voltron u otros similares.
Otro recurso valioso que condensa las directivas más útiles de gdb es esta hoja de referencias y también la guía de Exploit Database.
Incluir input por entrada estándar:
Frecuentemente vamos a necesitar debuggear un programa vulnerable que toma un input por entrada estándar (es decir, por stdin). Por ejemplo el programa stack 1 con gets(buf).
Generamos un archivo con el input y al debuggearlo con gdb es posible procesarlo como un input por stdin de la siguiente manera:
Incluir argumentos:
Si en cambio queremos debuggear un programa recibe un argumento. Por ejemplo el abo 3 con strcpy(buf,argc[1]) y fn(argc[2]) espera dos argumentos:
Desensamblar:
Al igual que con objdump, con gdb también es posible desensamblar un binario, intercalando el código fuente y el assembler con la directiva disas:
Simulación de valores:
Con gdb es posible modificar valores de variables durante la ejecución de un programa. Es un recurso muy útil para probar el funcionamiento de un exploit antes de comenzar a construirlo. Por ejemplo, si se quiere modificar el valor de una variable como cookie en el Stack 1 (o de una dirección de retorno ya identificada), es posible testear previamente el funcionamiento de esta estrategia con gdb:
STRACE
Con strace es posible interceptar las llamadas al sistema que realiza un programa. Por ejemplo, el siguiente programa es posible rastrear como printf() redunda en una llamada write:
Y con strace podemos ver la llamada a la syscall write.
CHECKSEC
Para verificar las tecnicas de mitigación habilitadas en un binario es de utilidad usar el script checksec
SECCIONES DE UN BINARIO
OBJDUMP
objdump permite ver las diferentes secciones de un archivo ejecutable.
Compilamos:
Desensamblamos con objdump y vemos las secciones.
Size: tamaño de la sección.
VMA: dirección de memoria virtual.
LMA: dirección lógica de memoria.
File off: offset de la sección desde el principio del archivo.
Algn: Alineación.
Y las flags: CONTENTS, ALLOC, LOAD, READONLY, DATA incluyen más información sobre las secciones.
También con objdump es posible ver el contenido de cada sección.
En la sección .rodata encontramos el string que imprime el programa. Y también podemos averiguar las direcciones de las entradas de la tabla GOT del binario.
READELF
También es posible obtener información relacionada a las secciones de un binario con:
OTRAS HERRAMIENTAS
FILE
Imprime el tipo de archivo del que se trata.
STRINGS
GNU strings imprime las secuencias de más de 4 caracteres imprimibles que encuentra dentro de un binario.
HEXDUMP
Muestra el contenido de un binario en hexadecimal.
NM
Lista los símbolos de un archivo objeto.
Última actualización
¿Te fue útil?