El Static Data Overflow es un tipo de buffer overflow que se produce con datos estáticos. Estos pueden ser sobreescritos de forma similar a la estudiada en los los buffer overflow o en los heap overflow, es decir, en situaciones en las que el programador no verifica correctamente el tamaño de los datos que copia. Veamos un ejemplo sencillo de Static Data Overflow.
Esta es la ejecución normal del programa:
Ahora intentemos sobrepasar el tamaño máximo de la variable user:
int main(int argc, char *argv[]) { static int login_ok = 0; static char user[64]; static char pass[64]; strncpy(user, argv[1], strlen(argv[1])); strncpy(pass, argv[2], strlen(argv[2])); printf("User: %s\n", user); printf("Pass: %s\n", pass); printf("Login: %d\n", login_ok); if(login_ok) { printf("Access Accept\n"); } else { printf("Access Denied\n"); } return 0; }Como podemos observar en el ejemplo anterior, el programa copia los datos introducidos por el usuario en dos buffers sin verificar correctamente el tamaño de los mismos. Veamos qué ocurre si sobrepasamos los 64 bytes de memoria assignada para las variables user y pass
Esta es la ejecución normal del programa:
$ ./a.out myusername mypass User: myusername Pass: mypass Login: 0 Access Denied
Ahora intentemos sobrepasar el tamaño máximo de la variable user:
$ ./a.out `perl -e 'print "A"x100'` mypass User: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Pass: mypass Login: 1094795585 Access Accept
Como vemos el programa nos da acceso sin necesidad de introducir una contraseña correcta. Pero, ¿Qué ha ocurrido? Los datos asignados a las variables user, pass y login_ok están en un espacio contiguo de memoria. Por lo que al sobrepasar el limite de espacio asignado a una de ellas, se sobreescribe el contenido de las demás. Así, si sobrepasamos los 64 bytes de user, sobreescribimos login_ok.
El valor que hemos assignado a login_ok es una cadena de As que ha dado como resultado el valor 1094795585. Aunque cualquier valor diferente de 0 nos hubiese servido igualmente para poder entrar en la sentencia if.
Este tipo de bug está muy relacionado con el heap overflow y/o el buffer overflow, sobre los que ya se ha escrito en este blog. Consultalos para ampliar información.
El valor que hemos assignado a login_ok es una cadena de As que ha dado como resultado el valor 1094795585. Aunque cualquier valor diferente de 0 nos hubiese servido igualmente para poder entrar en la sentencia if.
Este tipo de bug está muy relacionado con el heap overflow y/o el buffer overflow, sobre los que ya se ha escrito en este blog. Consultalos para ampliar información.
No hay comentarios:
Publicar un comentario