2017-05-03 2 views
-1

Je me suis souvent gratté la tête ici et je n'ai pas trouvé de solution. J'ai écrit ce code afin de casser des mots de passe simples à 4 caractères (voir le code ci-dessous). Je peux voir que les mots de passe sont correctement générés et que chaque possibilité est testée avec chaque combinaison de lettres de A à z mais la boucle est sans fin. Quelqu'un pourrait-il me dire pourquoi?crypte force brute boucle sans fin

#include <cs50.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <crypt.h> 


int main(int argc, string argv[]) 
{ 
//check number of arguments 
if(argc != 2) 
{ 
    printf("Usage: ./crack hash\n"); 
} 

char str[5]; 
char salt[] = ".."; 
strncpy(salt, argv[1], 2); 
string hash = argv[1]; 
string password = "...."; 
char pass[5]; 


//brute force loop 
for(int i = 65; i < 123; i++) 
{ 
    str[0] = i; 
    for(int j = 65; j < 123; j++) 
    { 
     str[1] = j; 
     for(int k = 65; k < 123; k++) 
     { 
      str[2] = k; 
      for(int l = 65; l < 123; l++) 
      { 
       str[3] = l; 
       str[4] = '\0'; 

       strcpy(pass, str); 

       password = crypt(pass, salt); 
       if (hash == password) 
       { 
        printf("%s\n", password); 
        break; 
       } 

       printf("\r%s", pass); 
       fflush(stdout); 
      } 
     } 
    } 
} 
} 
+2

Vous cassez que la boucle 4. Les autres continuent –

+0

Il devrait toujours se terminer après avoir essayé toutes les combinaisons et ne pas être sans fin. Peut-être que la question est mal formulée. – AlastairG

+0

Qu'est-ce que le type "chaîne"? – AlastairG

Répondre

2

Modifier le break dans le cas dans un return pour quitter toutes les boucles.

En outre, comme l'a souligné dans les commentaires:

if (hash == password) devrait être if(!strcmp(hash,password)) parce que vous voulez comparer deux chaînes en C.

+0

Fonctionne parfaitement, merci! Juste une question, pourquoi hash == mot de passe ne fonctionne pas? Il est encore en train de comparer les deux chaînes non? Est-ce que la chaîne compare seulement avec une fonction strcmp? – Tripduc

+0

@Tripduc parce que le démon qui a créé 'cs50.h' et typdef-ed' char * 'comme' chaîne' n'a pas du tout de faveurs. Tout ce qui est 'hash == motdepasse 'est C compare deux' pointeurs '(c'est-à-dire les adresses contenues dans chacun), pas le * contenu * vers lequel ils pointent * vers *. De simples mots ne peuvent exprimer la frustration que le caractère caché 'char *' caché dans ce fichier d'en-tête a causé aux gens dans la langue. La bonne façon de comparer les chaînes terminées est C pour l'équivalence est est via une fonction comme 'strcmp'. – WhozCraig

+0

Lire cette question [ici] (http://stackoverflow.com/q/3933614/4532326) – granmirupa