Espero que este sea el foro correcto para hacer la pregunta que tengo: Actualmente estamos discutiendo las vulnerabilidades de doble libertad en nuestra clase de seguridad de software, por lo que sé que el código que se proporciona a continuación se supone que es un ejemplo de cómo se puede explotar una doble libertad. Ahora, estoy tratando de entender este ejemplo y espero que alguien aquí pueda ayudarme con esto.
Lo primero que se hace en este código es una definición de una autenticación de estructura. Usamos esta estructura definiendo un puntero a dicha estructura:
struct auth *auth;
Ok. Creo que una vulnerabilidad solo puede ser donde se han usado malloc
o free
. Pero, ¿qué podría ser explotado en este código específico? No lo veo Recuerdo de la clase que el problema de aplicar free
al mismo puntero dos veces es que ahora el puntero hacia adelante y hacia atrás del fragmento está apuntando a este mismo trozo en el que están almacenados. De eso se trata mi conocimiento.
¡Me encantaría encontrar a alguien aquí, que pueda ayudar!
struct auth {
char name[32];
int auth;
};
struct auth *auth;
char *service;
int main(int argc, char **argv)
{
char line[128];
while(1) {
printf("[ auth = %p, service = %p ]\n", auth, service);
if(fgets(line, sizeof(line), stdin) == NULL) break;
if(strncmp(line, "auth ", 5) == 0) {
auth = malloc(sizeof(struct auth));
memset(auth, 0, sizeof(struct auth));
if(strlen(line + 5) < 31) {
strcpy(auth->name, line + 5);
}
}
if(strncmp(line, "reset", 5) == 0) {
free(auth);
}
if(strncmp(line, "service ", 7) == 0) {
service = strdup(line + 8);
}
if(strncmp(line, "login", 5) == 0) {
if(auth->auth) {
printf("you have logged in already!\n");
} else {
printf("please enter your password\n");
}
}
}
}
Edición pequeña: con las respuestas dadas a la publicación, se me ocurrió una solución. Simplemente escriba las siguientes líneas:
auth me
reset
service AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
login
La entrada escrita después de service
es de 36 caracteres. Ahora, ¿qué está pasando en este programa? auth me
asigna 36 bytes de memoria en el montón. reset
libera esta memoria, sin embargo, no se establece en NULL. Ahora service
asigna nuevamente 36 bytes de memoria en el montón. Es muy probable que se asigne la misma memoria que fue asignada antes por auth
. En esta memoria todavía podemos encontrar el nombre me
. Esto está escrito en los últimos 4 bytes de esta área de memoria.