Spero che questo sia il forum corretto per chiedere la domanda che ho: Al momento stiamo discutendo di vulnerabilità double-free nella nostra classe di sicurezza del software, motivo per cui so che il codice riportato di seguito viene considerato come un esempio di come un double-free può essere sfruttato. Ora, sto cercando di capire questo esempio e spero che qualcuno qui possa aiutarmi con questo.
La prima cosa fatta in questo codice è una definizione di una struct auth. Usiamo questa struttura definendo un puntatore a tale struttura:
struct auth *auth;
Ok. Penso che una vulnerabilità possa essere solo dove sono stati usati malloc
o free
. Ma cosa potrebbe essere sfruttato in questo specifico codice? Io non lo vedo Ricordo dalla classe che il problema con l'applicazione di free
allo stesso puntatore due volte è che ora il puntatore avanti e indietro del chunk punta a questo stesso pezzo in cui sono memorizzati. Ciò riguarda il punto in cui finisce la mia conoscenza.
Sarei così felice di trovare qualcuno qui, che potrebbe aiutarti!
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");
}
}
}
}
Piccola modifica: con le risposte date al post, ho trovato una soluzione. Digita semplicemente le seguenti righe:
auth me
reset
service AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
login
L'input scritto dopo service
è di 36 caratteri. Ora, cosa sta succedendo in questo programma? auth me
alloca 36 byte di memoria sull'heap. reset
libera questa memoria, tuttavia non è impostata su NULL. Ora service
alloca ancora 36 byte di memoria sull'heap. È molto probabile che venga allocata la stessa memoria allocata in precedenza da auth
. In questa memoria possiamo ancora trovare il nome me
. Questo è scritto negli ultimi 4 byte di questa area di memoria.