El objetivo de la prueba es modificar un format string no definido para lograr sobreescribir la pila.



Esta prueba muestra la vulnerabilidad que puede haber en cadenas de caracteres que no estan bien definidas y como se pueden modificar.

Nota importante: Cada vez que hago esto, coloco intrucciones a gdb que creo son muy necesarios, ya que cada que el debugger abre una aplicación, lo hace en un espacio de memoria relativa y al colocarle, unset env LINES y unset env COLUMNS, GDB muestra el uso de memoria real o muy cercano al que usa realmente la aplicación, facilitando la explotación de la vulnerabilidad.

Hay una vulnerabilidad en el código, se puede modificar un printf que no esta definido con el tipo de formato cadena (format string).

Ejecutamos la aplicación para ver que hace.



Vamos mostrando los push de los printf y encontramos los mensajes de cada uno, y encontramos algo de interes.






Como se puede ver hay una comparativa de test eax, eax, seguido de un jump if equal, lo que significa que saltara a una instrucción diferente, que sería que no se logro el objetivo, pero si no es igual entonces llegara al mensaje de exito, vamos a intentarlo, pongamos un break, justo antes de la comparativa y modifiquemos eax, a ver que pasa.



Veamos como se ve antes de modificarlo y como se ve después eax.





Pero, ¿cómo logramos hacer eso, modificando el formato de cadena?, probemos colocando un formato %s.



Funcionó y no, al parecer si se puede usar de esa manera pero es necesario usar otro formato, el básico, %x (hexadecimal). Esto puede variar, a veces se necesitan muchos, pero esta vez solo se necesitaron 7, a diferencia de los 64bits que se pueden usar 4, eso pasa por la diferencia de bytes, en 32bits son registros de 4 bytes y en 64bits son registros de 8 bytes.



Ahora veamoslo de manera interna, vamos colocando poco a poco hasta ver como se sobreescribe eax, haciendo que el je, sea obsoleto y continue la ejecución.

Listo.