Tema destacado:
Autor
|
Tema: [propuesta]practicas de overflows & Otros (Leído 2,064 veces)
|
Ilorev
Desconectado
Mensajes: 473
???
|
hola ha todos , k tal si publicamos en un post ejecicios para explotar ciertas vulnerabilidades, simplemente para `practicar?? a quien le interesa? en caso de que les interes voy a empezar yo este es un login objetivo : que digas login existoso sin escribir el user ni el pass correcto #include <stdio.h> #include <stdlib.h> #include <winsock.h> #include <windows.h> #include <string.h> #include <stdarg.h> int ok(); int bad(); main() { int ok() { printf("login existos"); } int bad() { printf("login incorrecto"); } char user[8],pass[8]; printf("user:"); scanf("%s",&user); printf("\npass:"); scanf("%s",&pass); if(!strcmp(user,"admin") && !strcmp(pass,"1234")){ ok(); } else{ bad(); } }
---------- modificado el 8 de diciembre del 2006 a las 6:05 otro ejercicios #include <stdio.h> #include <stdlib.h> #include <winsock.h> #include <windows.h> #include <string.h> #include <stdarg.h> main() { int num[10]; char nombre[20]; printf("formulario para sacar promedios del colegios .......");
printf("Nombre del estudiante:"); scanf("%s",&nombre); printf("literatura:"); scanf("%d",&num[1]); printf("biologia:"); scanf("%d",&num[2]); printf("fisica:"); scanf("%d",&num[3]); printf("deporte:"); scanf("%d",&num[4]); printf("informatica:"); scanf("%d",&num[5]); printf("ingles:"); scanf("%d",&num[6]); printf(" frances:"); scanf("%d",&num[7]); num[10]=num[1]+num[2]+num[3]+num[4]+num[5]+num[6]+num[7]; num[10] = num[10] / 7; printf(nombre); printf(", su promedio es :%d",num[10]);
fflush(stdin); getchar(); }
|
|
|
|
« Última modificación: 8 Diciembre 2006, 23:06 por mr.deep »
|
En línea
|
EOF
|
|
|
transit
Desconectado
Mensajes: 74
|
me parece una gran idea mr.deep, la practica es muy importante, por que por muxa teoria q se sepa si no se sabe ponerla en practica....
la solucion creo q es q ay como se declara primero la variable user y despues la varia pass, abra q pasar al programa primero la pass 1234 en texto plano o en hex, llenar con nulls asta llenar los 8 bytes y despues meter admin como texto plano o en hex, por lo menos yo creo q esa es una posibilidad ya q al desbordarse pass con 1234 y nulls sobreescribe user con admin.
saludos y animo con esta propuesta q nos puede ayudar muxo a todos.
|
|
|
|
|
En línea
|
|
|
|
Ivanchuk
Desconectado
Mensajes: 466
LLVM
|
jeje ta bueno el problema  . mmm transit si le pasas caracteres nulos el scanf te va a cortar la cadena. Copia hasta el primer caracter nulo :S. Me parece que si se desborda user y como ret se lo pone la dir de la funcion ok() deberia andar. Aunque se va a llamar primero a bad(), pero aun asi va a decir login exitoso XD.
|
|
|
|
|
En línea
|
|
|
|
transit
Desconectado
Mensajes: 74
|
ups ya te digo menuda xorrada dije, cierto la solucion es sobreescribir pass y user y como despues de user esta la direccion de retorno solo abria q sobreescribirla con la direccion de la funcion ok, lo unico seria buscar donde se carga esa funcion con el odbg.
|
|
|
|
« Última modificación: 8 Diciembre 2006, 17:10 por transit »
|
En línea
|
|
|
|
Ilorev
Desconectado
Mensajes: 473
???
|
aqui le traigo otro... #include <stdio.h> #include <winsock.h> int send2() { printf("bug explotado con exito"); }
main() { WSADATA ws; if(WSAStartup(MAKEWORD(1,1),&ws)!=0){ fprintf(stderr,"Error en WSAStarup"); exit(1); } struct sockaddr_in my_addr; struct sockaddr_in their_addr; int sin_size,byte; char buffer[8]; int sn,s= socket(AF_INET,SOCK_STREAM,0); my_addr.sin_family = AF_INET; my_addr.sin_port =htons(6000); my_addr.sin_addr.s_addr=INADDR_ANY; memset(&( my_addr.sin_zero),'\0',8); if(bind(s,(struct sockaddr *)&my_addr,sizeof(struct sockaddr_in))==-1) { perror("Bind"); } if(listen(s,10)==-1) { perror("listen"); } char msg[]="hash:"; sin_size = sizeof(struct sockaddr_in); if((sn=accept(s, (struct sockaddr *)&their_addr,&sin_size))==-1) { perror("accept"); } if (send(sn,msg, strlen(msg), 0) == -1){ perror("err:send"); }
if((byte=recv(sn,buffer,256,0))==-1){ fprintf(stderr,"Error:recv\n"); exit(0); } buffer[byte]='\0'; printf("%s",buffer);
getchar(); close(s);
}
vamos animense a postear !!! codigo!! cualkier error me lo hacen saber!
|
|
|
|
« Última modificación: 9 Diciembre 2006, 21:48 por mr.deep »
|
En línea
|
EOF
|
|
|
duhastengel
Desconectado
Mensajes: 4
|
saludos.... Buenisima la iniciativa.....  en estos dias me hajo un exploit para esto y lo posteo.... 
|
|
|
|
|
En línea
|
|
|
|
Ilorev
Desconectado
Mensajes: 473
???
|
aqui hay otro , jeje es muyy facil incluso analizen los codigos , pero no se lleven tanto por las funciones k vean OBjetivo: visualizar & poner la licencia correcta #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> main(int argc,char *argv[]) { if(argc < 2) { fprintf(stderr,"register.exe <usuario> <clave>"); exit(1); } int dif; char *nombre = (char *) malloc(16); char *licencia= (char *) malloc(16); dif = (int)licencia - (int) nombre; strcpy(nombre,argv[1]); sprintf(licencia,"%c-%X-%d",nombre[1],nombre[2],nombre[4]); if(strcmp(licencia,argv[2])!=NULL) { printf("licencia incorrecta\n"); } else{ printf("licencia correcta\n"); }
printf("%s\n",nombre);
....en serio esta muy facil Saludos
|
|
|
|
« Última modificación: 12 Diciembre 2006, 00:41 por Sirdarckcat »
|
En línea
|
EOF
|
|
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
Bueno, Esta muy bien la Iniciativa.  Estuve viendo algunos codigos y probando. el ultimo lo deje asi.. #include<stdio.h> int main(int argc,char *argv[]) { if(argc < 2) { fprintf(stderr,"./register <usuario> <clave>\n"); exit(1); } int dif; char *nombre = (char *) malloc(16); char *licencia= (char *) malloc(16); dif = (int)licencia - (int) nombre; strcpy(nombre,argv[1]); sprintf(licencia,"%c-%X-%d",nombre[1],nombre[2],nombre[4]); if(strcmp(licencia,argv[2])!=NULL) { printf("licencia incorrecta\n"); } else{ printf("licencia correcta\n"); } printf("%s\n",nombre); printf("Diferencia :%d\n",dif); return 0; } La Diferenia con migo es 16 no se con ustedes.. Yes Master? : gcc -o register register.c -lc Yes Master? : ./register ./register <usuario> <clave> Yes Master? : ./register Luis 1223 licencia incorrecta Luis Diferencia :16
|
|
|
|
|
En línea
|
|
|
|
|
|