原文鏈接
這里介紹一下怎么用程序包里破解linux加密的 就寫一個程序來實現(xiàn)如何暴力破解它。當然,這個程序的前提是你能夠拿到對方的root權(quán)限并查看到/etc/shadow里面的內(nèi)容,linux當然不會讓你那么輕易地拿到的。所以這里只是出于興趣破解一下本機上的密碼而已。代碼如下:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
char letter[37] = "abcdefghijklmnopqrstuvwxyz0123456789"; // 存放所有可能的字符峡眶,不包含特殊字符以及大小寫
char result[10]; // 存放最終結(jié)果,假設不超過十個字符
int minlen = 1; // 密碼的最小長度
int maxlen = 10; // 密碼的最大長度
// 這是通過/etc/shadow所獲取的加密后的文本
char *encrypted = "$6$jMzjGK/$0QVw8FM87jd3yF0wvzgXPPe1l3FOfrIA7LhGPIVCbum9es5 /tQsGMJqmaQ78IY.Hv4h6UWnvTs4cLntrPMSfM/";
char *salt = "$6$jMzjGK//$"; // 由上面的文本所得到的值植锉,crypt函數(shù)的第二個參數(shù)
// 遞歸嘗試
void try_next(int index, int length)
{
int i;
if(index == length)
return ; // 遞歸結(jié)束條件
for(i = 0; i< 36; i++) // 把當前位置的所有情況試完
{
result[index] = letter[i]; // 給當前位置賦值
memset(result + index +1, letter[0], length – index -1); // index之后辫樱,length之前的字符都用character[0]即a來代替
if(i != 0) // i=0的情況已經(jīng)判斷過了
{
printf("嘗試:%s\n", result);
if(! strcmp(encrypted, crypt(result, salt)))
{
printf("發(fā)現(xiàn)密碼:%s\n", result);
exit (0);
}
}
try_next(index + 1, length); // 遞歸替換下一個位置的字符,直到找到密碼或者index==length為止
}
}
void try(int length, int begin, int end)
{
int i;
for(i = begin; i<= end; i++)
{
result[0] = letter[i]; // 這一步只確定第一個字符
memset(result + 1, letter[0], length-1); // 第一個字符后面length前面的字符就用character[0]即a來代替
printf("嘗試:%s\n", result);
if(!strcmp(encrypted, crypt(result, salt))) // 如果這時候就能夠匹配那么直接推出
{
printf("發(fā)現(xiàn)密碼:%s\n", result);
exit (0);
}
try_next(1, length); // 遞歸嘗試第一個字符之后的字符
}
}
int main()
{
int len;
for(len = minlen; len <= maxlen; len++){
printf("\n正在嘗試長度為%d的密碼\n", len);
memset(result, 0, 10); // 初始化result數(shù)組為全0,這里并不是指字符0
try(len, 0, 36);
}
return 0;
}
這是我第一次嘗試暴力破解俊庇,雖然沒有用多線程狮暑,但還是能明顯感覺到其效率之低鸡挠,以后得學學其他的方法。