Pre-requisito: GDB (Introducción Paso a Paso)
Un desbordamiento de búfer a menudo ocurre cuando el contenido dentro de la variable definida se copia a otra variable sin realizar comprobaciones vinculadas o sin considerar el tamaño del búfer. Analicemos el desbordamiento del búfer con la ayuda del depurador GNU (GDB) que está incorporado en todos los sistemas Linux.
El motivo de este ejercicio es familiarizarse con la depuración de código y comprender cómo funciona el desbordamiento de búfer en acción.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char** argv) { volatile int cantoverflowme; char buffer[64]; cantoverflowme = 0; gets(buffer); if (cantoverflowme != 0) { printf("You OVERFLOW'ed Me\n"); } else { printf("Can't Overflow Me\n"); } }
- Paso 1
Vamos a compilar este código con las siguientes banderas:
gcc overflow.c -o overflow -fno-stack-protector -z execstack -no-pie
El código anterior va a crear un binario compilado que deshabilita varias protecciones de pila
-z execstack : Disables Executable Stack -fno-stack-protector : Disables Stack Canaries -no-pie : Disables Position Independent Executables
- Paso 2
Ahora que las protecciones de pila están deshabilitadas, podemos cargar el código en GDB escribiendo
gdb ./overflow
- Paso 3
Una vez que el código está abierto, podemos ver las funciones que están dentro del binario escribiendo
info functions
Podemos ver que se está utilizando una llamada gets que es vulnerable por naturaleza ya que no realiza comprobaciones vinculadas.
- Paso 4
escribamos
disas main
- Paso 5
Pongamos un punto de interrupción escribiendo
b * main+39
para que podamos analizar el contenido de la pila cuando el programa llega al punto de interrupción.
- Paso 6
Escribe
r
para ejecutar el código e ingresar cualquier número de A como ya sabemos del código anterior.
Ingresemos 63 A y 78 A y veamos el cambio en el resultado. - Paso 7
Puede usar el código python para imprimir A al escribir después de salir del GDB.
python -c "print 'A' * 63"
- Paso 8
Ahora que tenemos 63 A, ejecutemos el código y péguelo cuando nos solicite la entrada.
Intentemos todo el proceso nuevamente y esta vez ingresemos cualquier número de A, digamos 78.
Una buena manera de hacer esto puede ser
python -c "print 'A' * 78" | ./overflow
Como podemos ver, una vez que ocurre el desbordamiento , cambia la variable debido a que la memoria se pierde en la pila y cambia los valores de las variables.
- Paso 9
Verifiquemos la pila sobre la que escribe, por lo que debemos establecer un punto de interrupción en
main+39
luego escribe
r
y luego podemos escribir
x/20s $rsp
x : eXamine 20s : 20 values in string $rsp : for register RSP (Stack Pointer)
De ahí que podamos ver como 78 A’s están escritas en la pila y van desbordando la memoria .
Publicación traducida automáticamente
Artículo escrito por Coding_Karma y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA