sábado, 17 de enero de 2015

Resolviendo el segundo reto de Amateria


Segundo reto relacionado con el wargame Amateria. En este caso se nos presenta un código en C (que divertidos son los segmentation fault :D).



El archivo del ejercicio luce así:


En el código podemos ver el método principal (main) y una función llamada flapmud. Para llegar a la función tenemos la siguiente línea:
signal(SIGSEGV, flapmud);
 Signal captura una señal SIGSEGV y entonces lanza la función antes mentada. Ésta ejecutará un GDB con los permisos propios del usuario 2 y entonces se podrá leer el archivo del password.

¿Qué es SIGSEGV?
Es un fallo de segmentación de toda la vida, esos que cuando empezabas a programar en C/C++ has visto miles, ¡ESOS!.

¿Cómo hacemos que salte?
Habiendo varias formas para lograrlo, en un principio pensé en lanzarlo con algún depurador, poner un breakpoint y lanzarle una señal (kill -11 pid) para que saltase, pero GDB por seguridad no permite el cambio de usuario sin ser root, así que descarté dicha forma.

Siendo, como he dicho antes, C/C++ los lenguajes con los que he visto cientos de segmentation fault, mediante uno de los diversos métodos de ejecución de otros programas que tiene, busqué como ejecutar este para que lanzase la señal buscada. Al final llegué a execve. Con una pequeña modificación del ejemplo que se proporciona en el enlace, es posible, pasando parámetros nulos ejecutar un fallo de segmentación y que se lance un GDB perteneciente al usuario del siguiente nivel:


Basta con pasarle el ejecutable (lolgdb) al programa y se lanzará una terminal del GDB. Aquí, mediante el comando shell es posible hacer un cat del fichero con el password:




Como siempre, los códigos se encuentran disponibles en el GitHub de 0verl0ad (directorio PornAetsuWargames):
https://github.com/0verl0ad/PornAetsuWarGames/tree/master/amateria


Un saludo y "nos leemos en breve",


5 0verl0ad Labs: Resolviendo el segundo reto de Amateria Segundo reto relacionado con el wargame Amateria . En este caso se nos presenta un código en C ( que divertidos son los segmentation fault...

No hay comentarios:

< >