El objetivo de la prueba es sobreescribir parte de la memoria (stack), en este caso, la variable buffer puede sobreescribirse pasando la cantidad de bytes permitidos.



Esta prueba tiene algo diferente, ahora es saved return pointer overwrite y al parecer cada vez nos van complicando más las cosas, vamos a revisar el código con GDB.



Voy a explicar en que consiste el return overwrite.




Bueno, después de esa explicación, vamos a desamblar la función que nos aparece ahí... "start_level".


Metemos un break ahí para ver que esta haciendo realmente.




Podemos ver como hay un printf que nos menciona sobre un return y al continuar la ejecución nos muestra una dirección (0x0804855c), que va hacia main nuevamente, seguro está protegido.




Vamos a poner a prueba lo anterior mencionado sobre modificar ret, esta vez hay un cambio en ebp, ahora es (ebp-0x4), y (ebp-0x4c) lo que da 72, pero no olvidemos que hay que sobreescribir la variable ret y ebp, entonces ahora serían 80 bytes + 1 para overflow.


Borremos los breaks.




Coloquemos los bytes para ver si funciona el overflow.




Bueno, hagamos una segunda prueba, escribamos "BBBB" para ver si recibimos 0x42424242.




Hagamos una tercera prueba, escribamos "CCCC" para ver si recibimos 0x43434343, ya que si funcionó y se sobreescribe el primer ret, entonces el segundo ret tiene que sobreescribirse, pero hay que recordar que tenemos que colocar un ret que no esté protegido, y el programa nos mostró el ret de main (0x08048568).




Perfecto, busquemos la dirección de la función.




LLevemoslo a la práctica.




Listo.