2017-06-12 81 views
1

爲了神聖的代碼的愛,我想比較哈希找到正確的密碼。我給出一個哈希作爲命令行參數,我再從「一」到「ZZZZ」湊字,直到哈希對比賽之一。C:比較哈希值似乎消失

void decipher(string hash) 
{ 
    //Set the password, and the salt. 
    char pass[4] = "a"; 
    char salt[] ="50"; 

    //Compare the crypted pass againts the hash until found. 
    while (strcmp(hash,crypt(pass, salt)) != 0) 
    { 
     //Use int i to hold position, and return next char 
      int i = 0; 
      pass[i] = get_next(pass[i]); 
      tick_over (pass, i); 

      //Hardcode in a fail safe max length: exit. 
      if (strlen(pass) > 4) 
      { 
       break; 
      } 
    } 
    printf("%s\n", pass); 
} 

的問題是,它不會「抓」了正確的密碼/比較,當密碼爲4個字母。它適用於1,2和3個字母的單詞。

//Tick over casino style 
string tick_over (string pass, int i) 
{ 
    //Once a char reaches 'Z', move the next char in line up one value. 
    char a[] = "a"; 
    if (pass[i] == 'Z') 
    { 
     if (strlen(pass) < i+2) 
     { 
     strncat (pass, &a[0], 1); 
     return pass; 
     } 
     pass[i+1] = get_next(pass[i+1]); 
     //Recursively run again, moving along the string as necessary 
     tick_over (pass, i+1); 
    } 
    return pass; 
} 

//Give the next character in the sequence of available characters 
char get_next (char y) 
{ 
    if (y == 'z') 
    { 
     return 'A'; 
    } 
    else if (y == 'Z') 
    { 
     return 'a'; 
    } 
    else 
    { 
     return y + 1; 
    } 
} 

它遍歷正確的單詞,正如我在調試中發現的那樣。我試圖將

strcmp(hash, crypt(pass, salt)) == 0 

變成一個嵌套的if語句等,但它似乎不是問題。 c以某種方式'忘記'命令行值?在調試散列值時似乎已經消失:/請幫忙!

回答

2

char pass[4] = "a";你定義一個字符數組,其最多可包含3個字符+空終止符。

,這不是連貫與「安全」的測試:if (strlen(pass) > 4)

strlen 4的陣列已經被覆蓋在內存中,因爲null終止字符的東西:未定義行爲

的QuickFix:char pass[5] ...

+0

謝謝這個工作。但是,較早創建tick_over方法和「安全性」測試前,通過[4]做的工作 - 在密碼哈希將匹配,並從迴路斷線。我很好奇 - 你會知道爲什麼會發生這種情況,是否導致覆蓋的安全測試? – sena

+1

但你確實有不確定的行爲,因爲你寫出界。這就像俄羅斯輪盤賭一樣。在某個時候你輸了。安全測試只讀取這樣的數字。這是任何超出界限的寫入操作。 RAM很便宜。放大緩衝區,你很好走。 –

0

下面是函數strncat的說明:

從字符串 追加字符追加源到目的地,加上終止空字符的第一NUM個字符。

大小爲4,您不考慮四個字符數組的終止空字符。