Citar
Mirando el código, veo que el buffer es local, por lo que estará en el stack.
Es verdad. En el ejemplo dado es local,, yo tampoco me habia dado cuenta porque en el programa que depuro no es local, lo cual me deja en jaque, porque no va a ser lo mismo.. igualmente el tema de integer overflow es interesante tanto en el heap como en el stack.
Citar
Luego, al desbordarlo podrías pisar el return address y saltar a tu código; o bien, pisar el SEH chain y ROPear.
Bueno, ahi es donde empieza el juego.. Lo que yo no veo es la logica.. memcpy va a terminar copiando hasta donde sea necesario para que se de el integer overflow.
Es decir, la meta es desbordar el buffer, pero hay que tener en cuenta que el valor ingresado no puede ser "cualquiera", sino el valor justo para que tambien se saltee la condicion (la que trata de controlar que no se desborde, justamente). Eso nos deja con muy poco margen para operar.
Esto que trato de aclarar es lo mismo para este ejemplo que para casi cualquier integer overflow que luego provoque un buffer overflow:
Si ponemos un valor muy grande con la intencion de desbordar un integer, no vamos a poder controlar luego hasta donde va a pisar memcpy. Probablemente va a pisar la funcion, el return address y todo lo que se tope en su camino hasta el final del stack ¬¬
Me equivoco? Los integer overflows que dan paso a buffer overflow, son casi imposibles de explotar?
Saludos!!!
PD: Ademas, si desbordamos el buffer tiene que ser por muy poco, (por obvias razones), lo cual nos deja con mucho menos margen aun!