Tengo un fragmento de código que contiene un obvio desbordamiento de búfer en strcpy(buf, x)
, ya que no comprueba si buf
es lo suficientemente grande como para ajustarse a la cadena x
. Me pregunto cómo explotar realmente este error.
void fun(char *x) {
char buf[10];
strcpy(buf, x);
printf("You gave me this: %s", buf);
exit(0);
}
Y así es como se llama la función desde main:
fun(argv[1]);
La técnica clásica para explotar un desbordamiento de búfer en la pila es sobrescribir la dirección de retorno con un puntero al código de shell. Esto ejecutará el código de shell una vez que ret
haga estallar la dirección de retorno de la pila y salte a ella. Pero esta técnica no funcionará aquí porque la función fun
no está regresando. En su lugar, se ejecuta exit(0)
.
Además, no puedo realizar un ataque de cadena de formato porque printf
se está usando de forma segura (creo). Al principio, pensé que esto no puede ser explotado. Luego hice una investigación y descubrí el código espeleología. Pero el problema es que el código espeleología requiere la modificación del binario.
Entonces, mi pregunta es ¿se puede explotar el desbordamiento de búfer en el código anterior? De lo contrario, ¿qué otras técnicas se pueden usar dado que no hay otro código vulnerable en main()
?
PS: Linux, 32 bits, Intel. Suponga que no hay activos como ASLR, etc. .
PS: Exploit debería dar como resultado que obtenga un shell de root .