Documentos de Académico
Documentos de Profesional
Documentos de Cultura
OVERFLOW
Resolución de ejercicios propuestos.
Contenido
Ejercicio 1. ..................................................................................................................................... 2
Ejercicio 2. .................................................................................................................................... 2
Ejercicio 3. ..................................................................................................................................... 3
Ejercicio 4. ..................................................................................................................................... 3
Ejercicio 5. ..................................................................................................................................... 3
Ejercicio 6. ..................................................................................................................................... 4
Ejercicio 7. ..................................................................................................................................... 4
Ejercicio 8. ..................................................................................................................................... 4
Ejercicio 9. ..................................................................................................................................... 4
Ejercicio 10. ................................................................................................................................... 5
Ejercicio 11. ................................................................................................................................... 5
Ejercicio 13. ................................................................................................................................... 6
1
Ejercicio 1.
Compruebe el resultado que se obtiene cuando se llama directamente a ./deseos-alt y se
le pasa los mismos caracteres de entrada.
No sale “AA” porque “runbin.sh” es quien se encarga de formatear la entrada para que
reciba los caracteres ASCII asociados a los caracteres hexadecimales de la entrada.
Ejercicio 2.
El script runbin.sh tiene el siguiente código:
while read -r line; do echo -e $line; done | ./deseos-alt
1. Lee líneas de entrada de algún origen desconocido y las almacena en la variable "line"
usando el comando "read". El modificador "-r" se utiliza para evitar que se interpreten
caracteres de escape en las líneas leídas, lo que permite leer las líneas tal y como están
(lo cual explica el suceso del apartado anterior).
2. Ejecuta el comando "echo -e $line" para imprimir en la salida estándar las líneas
leídas. El modificador "-e" se utiliza para interpretar caracteres de escape en las líneas,
lo que permite imprimir caracteres especiales como tabulaciones o saltos de línea de
manera adecuada.
3. Pasa la salida del comando "echo -e $line" como entrada al programa compilado
"deseos-alt" mediante el operador de tubería "|" en la línea siguiente.
En resumidas cuentas, este script está leyendo líneas de entrada, imprimiéndolas con caracteres
de escape interpretados, y pasando la salida al programa "deseos-alt" compilado.
2
Ejercicio 3.
Realice un resumen de cómo funciona la aplicación: qué se hace en la función principal del
programa, que hace cada una de las funciones que están definidas en el programa, cuando
son llamadas cada una de ellas. Describa también los diferentes punteros que se definen en el
programa y qué utilidad tienen dentro de la aplicación.
El programa "deseos-alt.c" es una aplicación que implementa un sistema para manejar una lista
de deseos. Se desglosa en las siguientes funciones:
Ejercicio 4.
En el programa hay una overflow de la pila. ¿Cuál es el nombre de la variable que referencia
el buffer afectado?
Ejercicio 5.
Considere el buffer que ha identificado en el ejercicio anterior. ¿Cuál es la línea de código que
puede provocar el desbordamiento del buffer?.
3
Ejercicio 6.
Hay otra vulnerabilidad, no relacionada con la anterior, que afecta a una tabla, que no está
en la pila, y que se puede indexar fuera de sus límites (lo cual, entendiéndolo en sentido
amplio, es una clase de buffer overflow). ¿Qué variable contiene esta tabla o buffer?
Ejercicio 7.
Considere el buffer que acaba de identificar. ¿qué línea de código puede provocar ese
desbordamiento de buffer?
En la línea 70, con la función “strcpy()”, que es otra de las funciones no seguras ya que no estás
limitándole el tamaño del buffer. Si los datos de origen exceden el tamaño del array de destino,
podría causar un desbordamiento de buffer y afectar a la tabla.
Ejercicio 8.
Determine la dirección de los siguientes elementos (la dirección que ocupan en memoria, no
el valor que contienen) que se definen en el programa (muestra las direcciones en
hexadecimal):
• buf
• ptrs
• write_secret
• p (la variable local definida dentro del main)
buf 0xbfffef30
ptrs 0x4040d8
write_secret 0x401209
p 0xbffff32c
Ejercicio 9.
¿Qué entrada debemos proporcionar al programa de forma que prtr[s] lea (y entonces intente
ejecutar) el contenido de la variable local p en vez del puntero a función almacenado en el
buffer apuntado por ptrs? Puede determinar la respuesta realizando una pequeña operación
matemática con las direcciones que ha obtenido en el ejercicio anterior (tenga cuidado que
tiene en cuenta el tamaño del puntero cuando haga la aritmética de punteros). Si lo calcula
correctamente, terminará ejecutando la función pat_on_back. Dé la respuesta como un entero
sin signo.
4
Ejercicio 10.
¿Qué valor debemos escribir de forma que prts[s] lea (e intente ejecutar) comenzando desde
el byte número 65 en buf, esto es buf[64]? Responda a la cuestión suministrando un valor
entero.
804252578
Ejercicio 11.
La cadena que nos vas a permitir explotar la vulnerabilidad de inyección de código comentada
anteriormente tendrá la siguiente forma:
NUMEJER10\x00CARACTERESDERELLENO\xEE\xEE\xEE\xEE
Donde:
5
- x: comando el cual realiza un volcado hexadecimal de los bytes que se le indiquen a partir de
una determinada dirección. Por ejemplo si escribimos: x/48xw $esp se imprimirían 48 palabras
(por la w), en formato hexadecimal (por la x), comenzando en la dirección de memoria
almacenada en el registro $esp.
A continuación, probamos por fuerza bruta el número de Bytes para saltar a esa zona de
memoria.
804252578\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x09\x12\x40
Ejercicio 13.
Modifique el programa de forma que las vulnerabilidades que hemos explotado se solucionen.
Para ello utilice las funciones seguras que se han visto en la introducción teórica. A
continuación, verifique que todas las operaciones que hemos realizado con anterioridad ya no
conllevan ningún problema de seguridad.
6
Se han solventado todos los problemas relativos al uso de funciones inseguras, ya no podemos
acceder a la llamada secreta de la función con la clave, directamente se detiene la ejecución del
hilo principal.