Solución a otro reto de la competición Sunshine CTF 2020, pero en este caso, en mi opinión, poco o nada tiene que ver con la categoría 'binary exploitation', sino más bien con las de 'criptografía' y 'reversing', etiquetas bajo las cuales lo he catalogado en este blog.
En esta entrada la solución al desafío que lleva por título "speedrun09", y que, en mi opinión, presenta un nivel de dificultad bajo (★★☆☆☆).
- Enunciado:
- Solución: Se proporciona un archivo ejecutable (chall_09) y lo primero que hago es ejecutarlo; incluyo una cadena larga ('AAA…A') y el programa finaliza:
Después, compruebo los mecanismos de seguridad del binario utilizando ‘checksec’:
Se trata de un binario de 64 bits, y como se ve en la figura anterior NX está habilitado, por lo que no podré inyectar ‘shellcode’ en la pila (en inglés, ‘stack’) para ejecutarlo, y PIE está habilitado, lo que aleatoriza la dirección base del binario para dificultar el uso por un atacante de sus funciones y de ‘gadgets’ del propio binario (en español dispositivos, y que, en este caso, son pequeños fragmentos de código ya presentes en el binario).
Como también se ve, entre las protecciones de este binario se ha detectado la existencia de un canario, que es un valor, generalmente aleatorio, que se coloca entre un ‘buffer’ y los datos de la pila adyacentes al mismo para detectar los desbordamientos del ‘buffer’, de tal forma que al final de una función se comprueba si se ha modificado su valor y, caso de que así sea, sería indicativo de que se ha producido un desbordamiento del ‘buffer’, ya que el valor del canario sería el primer dato en corromperse, y se podrían tomar las acciones oportunas, por ejemplo, advertir de esta circunstancia y dar por finalizado el programa.
Y, finalmente, se ve que se utiliza el modo ‘Full’ de la medida de seguridad RELRO (del inglés ‘Relocation Read-Only’), que hace que toda la sección GOT (del inglés ‘Global Offset Table’, y que contiene la tabla con las direcciones de funciones que se enlazan dinámicamente) sea de solo lectura, lo que evita la posibilidad de que se realice un ataque de sobrescritura GOT (en inglés, ‘GOT overwrite’), donde la dirección GOT de una función se sobrescribe con la ubicación de otra función o de un ‘gadget’ o dispositivo ROP que un atacante desee ejecutar.
Teniendo en cuenta que el formato de almacenamiento es 'little-endian', utilizo ‘CyberChef’ para realizar la XOR de la clave con ‘0x30’ y ver la cadena que debe introducir el usuario para que se abra la ‘shell’:
Ejecuto el programa en remoto e introduzco la cadena que se muestra en la figura anterior:
Se abre la ‘shell’, busco la flag en el servidor y veo que hay un fichero llamado flag.txt que contiene la solución a este reto: sun{coming-home-4202dcd54b230a00}
Comentarios
Publicar un comentario