Ci si riferisce all’esercizio precedente:

int main (void) {
	char pw[8];
	sprintf (pw, "root-pw");
	if (authenticate(pw) > 0) {
		printf ("[root]$ ...\\n);
	}
	else {
		printf ("Root: incorrect password\\n");
	}
	return 0;
}
#include <stdio.h>

int authenticate (char* pw) {
	int result = 0;
	char buf[8];
	printf ("Root Password: ");
	
	if (gets(buf) != 0) {
		if (strcmp (buf, pw) == 0) {
			result = 1;
		}
	}
	return result;
}

Non problemi:

Problema:

Esempio: password lunga

Untitled

⇒ in realtà i buffer overflow sono più complicati.

Ci potrebbe essere un spazio tra buf e result oppure se input è troppo lungo potrebbe addirittura intaccare ebp o return.

Difesa: ripristinare le variabili

Ma non basta per scampare anche gli altri pericoli!

#include <stdio.h>

int authenticate (char* pw) {
	int result = 0;
	char buf[8];
	printf ("Root Password: ");
	
	if (gets(buf) != 0) {
		if (strcmp (buf, pw) == 0) {
			result = 1;
		} else {
			result=0;
		}
	}
	return result;
}

Esempio: password molto lunga

Untitled

Codici di exploit - dove i malitenzionati fanno saltare il programma

I malintenzionati posizionano il loro codice exploit (dannoso) nella memoria durante attacchi di overflow di buffer. Alcuni punti chiave includono: