2017-05-03 1 views
-1

Ich habe mir hier ziemlich viel den Kopf gekratzt und konnte keine Lösung finden. Ich habe diesen Code geschrieben, um einfache 4 Zeichen Passwörter zu knacken (siehe Code unten). Ich kann sehen, dass die Passwörter korrekt generiert werden und dass jede Möglichkeit mit jeder Kombination von Buchstaben von A bis Z getestet wird, aber die Schleife endet nie. Kann mir jemand sagen warum?Krypta Brute Force nie endende Schleife

#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

Sie brechen nur die vierte Schleife. Die anderen setzen fort –

+0

Es sollte immer noch nach dem Ausprobieren aller Kombinationen enden und nicht endlos sein. Vielleicht ist die Frage schlecht formuliert. – AlastairG

+0

Was ist der "String" -Typ? – AlastairG

Antwort

2

Ändern der break in der, wenn in einem return alle Schleifen zu verlassen.

Außerdem ist, wie in den Kommentaren darauf hingewiesen:

if (hash == password) sollte if(!strcmp(hash,password)) sein, weil Sie zwei Strings in C vergleichen wollen

+0

Funktioniert perfekt, danke! Nur eine Frage, warum würde Hash == Passwort nicht funktionieren? Es vergleicht immer noch beide Zeichenfolgen Nein? Vergleiche String nur mit einer strcmp-Funktion? – Tripduc

+0

@Tripduc, weil der Teufel, der 'cs50.h' und typdef-ed' char * 'als' string' kreiert hat, dir überhaupt keinen Gefallen getan hat. Alles "hash == password" bedeutet, dass C zwei "Zeiger" (d. H. Die Adressen, die in jedem Wort enthalten sind) vergleicht, nicht den * Inhalt *, auf den sie * zeigen *. Bloße Worte können nicht ausdrücken, wie viel Frustration dieser verborgene 'char *' - Typ in dieser Header-Datei Leute verursacht hat, die in der Sprache neu sind. Der richtige Weg, um terminierte Strings zu vergleichen, ist C, da die Äquivalenz über eine Funktion wie "strcmp" erfolgt. – WhozCraig

+0

Lesen Sie diese Frage [hier] (http://stackoverflow.com/q/3933614/4532326) – granmirupa