Programa anti overflows?

Iniciado por Fastolfe, 7 Marzo 2012, 00:23 AM

0 Miembros y 1 Visitante están viendo este tema.

Fastolfe

Buenas! hace poco me he bajado el DVL y me he hecho un par de exploimes, lo que me ha hecho pensar: ¿cómo puedo evitar los buffer overflows usando funciones de la libreria standard de C?

Y probando un poco he llegado a este programita:

#include <stdio.h>

char var[10];

void leer(){
int i = 0;
for (i = 0; i < 10; i++){
scanf("%c", &var[i]);
}
}

int clong(char a[]){
int i = 0;
while(a[i] != '\0'){
i++;
}
return i;
}

int compare(char a[], char b[]){
int i = 0;
int ret = 1;
int max;
if (clong(a) >= clong(b)){
max = clong(b);
}else{
max = clong(a);
}
for (i = 0; i < max; i++){
ret = ret&&(a[i] == b[i]);
}
return ret;
}

int main(){
printf("\n Introduce la clave y pulsa intro repetidas veces: ");
char a[10];
char cadena[] = "hola";
leer();
if (compare(var, cadena)){
printf("\n Enhorabuena!\n");
}else{
printf("\n Pringao\n");
return 0;
}
return 0;
}


He probado a meterle casi un millon de 'A's y no he conseguido nada, ni siquiera un segment fault ni el tipico mensaje de linux de "detected stack smash" (o algo parecido), alguien puede decirme como hacer un buffer overflow con este programa?

Muchas gracias!!

Sagrini

#1
1. Buffer overfllow en variable "var". No se puede sobreescribir nada excesivamente importante, pero está ahí y si le das unas cuantas vueltas puedes conseguir algo ;)
2. La función de comparación no funciona como debería. Ahí se podría tal vez explotar el punto 1, pero habría que pensarlo.
3. La variable "a [10]" sobra.

Dándole vueltas creo que se puede saltar la comparación y que te devuelva OK, tendré que pensarlo.
Corrijo un poco el código:

#include <stdio.h>

int lenght (char *s)
{ int i;
for (i=0; s [i] != '\0'; i++);
return i;
}

int compare(char a[], char b[])
{ int i;
if (lenght (a) != lenght (b)) return 1;
for (i=0; i<lenght (a); i++) if (a[i] != b[i]) return 1;
return 0;
}

int main()
{ printf("Introduce la clave: ");
char var [32]; char ok [] = "hola"; int i;
fgets (var, 32, stdin); for (i=0; var [i]!='\n' && i<32; i++); var [i]='\0';
if (compare(var, ok) == 0) printf("Enhorabuena!\n");
else printf("Pringao\n");
return 0;
}

Y si lo prefieres sin siquiera usar stdio.h:

int lenght (char *s)
{ int i;
for (i=0; s [i] != '\0'; i++);
return i;
}

int compare(char a[], char b[])
{ int i;
if (lenght (a) != lenght (b)) return 1;
for (i=0; i<lenght (a); i++) if (a[i] != b[i]) return 1;
return 0;
}

int main()
{ write (1, "Password: ", 10);
char var [32]; char ok [] = "hola"; int i;
read (1, var, 32); for (i=0; var [i]!='\n' && i<32; i++); var [i]='\0';
if (compare(var, ok) == 0) write (1, "OK!\n\n", 5);
else write (1, "BAD\n\n", 5);
return 0;
}