1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB BOWDEN: Io sono Rob, e cerchiamo di ottenere cracking. 3 00:00:15,890 --> 00:00:19,390 Quindi ricorda dalla spec pset che stiamo andando a essere la necessità di utilizzare il 4 00:00:19,390 --> 00:00:20,890 funzione crypt. 5 00:00:20,890 --> 00:00:26,330 Per la pagina man, abbiamo due hash definire _xopensource. 6 00:00:26,330 --> 00:00:28,290 Non ti preoccupare perché abbiamo bisogno di fare questo. 7 00:00:28,290 --> 00:00:31,550 E anche hash includono unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Quindi, una volta che è fuori del modo, cerchiamo di raggiungere il vero programma. 9 00:00:35,920 --> 00:00:39,570 La prima cosa che dobbiamo fare è fare in modo l'utente ha immesso un valido criptato 10 00:00:39,570 --> 00:00:41,520 la password nella riga di comando. 11 00:00:41,520 --> 00:00:46,050 Ricordate che il programma dovrebbe per essere eseguito come dot barra crepa, e 12 00:00:46,050 --> 00:00:48,120 allora stringa crittografata. 13 00:00:48,120 --> 00:00:52,990 >> Quindi qui stiamo controllando per assicurarsi che argc a due, se vogliamo 14 00:00:52,990 --> 00:00:54,380 proseguire con il programma. 15 00:00:54,380 --> 00:00:58,830 Se argc non è due, che significa o l'utente non ha inserito un messaggio crittografato 16 00:00:58,830 --> 00:01:02,560 la password nella riga di comando, oppure entrato più di una semplice criptato 17 00:01:02,560 --> 00:01:05,379 la password nella riga di comando, in cui caso non sappiamo cosa fare con il 18 00:01:05,379 --> 00:01:07,660 gli argomenti della riga di comando. 19 00:01:07,660 --> 00:01:11,390 >> Quindi, se argc aveva due anni, siamo in grado di continuare. 20 00:01:11,390 --> 00:01:14,160 E qui, stiamo andando a dichiarare una variabile criptato. 21 00:01:14,160 --> 00:01:17,650 Questo è solo andando a alias l'originale argv1 in modo che tutto questo 22 00:01:17,650 --> 00:01:20,690 programma, non abbiamo chiamarlo argv1, che poi si deve pensare 23 00:01:20,690 --> 00:01:22,950 su ciò che in realtà voleva dire. 24 00:01:22,950 --> 00:01:27,180 >> Così alla fine, vogliamo confermare che la password cifrata dell'utente 25 00:01:27,180 --> 00:01:30,840 entrato avrebbe potuto essere effettivamente una password cifrata. 26 00:01:30,840 --> 00:01:35,120 Per la pagina man della cripta, il password crittografata deve essere 13 27 00:01:35,120 --> 00:01:36,440 caratteri. 28 00:01:36,440 --> 00:01:41,500 Fino qui, notiamo che abbiamo hash definito cifrare lunghezza 13. 29 00:01:41,500 --> 00:01:46,140 Quindi, stiamo solo facendo in modo che il lunghezza della stringa del crittografata 30 00:01:46,140 --> 00:01:49,090 parola d'ordine è 13. 31 00:01:49,090 --> 00:01:52,280 >> E se non lo è, vogliamo per uscire dal programma. 32 00:01:52,280 --> 00:01:56,470 Quindi, una volta che è fuori del modo, possiamo ora effettivamente cercare di trovare ciò che il 33 00:01:56,470 --> 00:02:00,410 password che ha dato il crittografata parola d'ordine era. 34 00:02:00,410 --> 00:02:04,870 Qui, vogliamo prendere il sale dalla password crittografata. 35 00:02:04,870 --> 00:02:08,930 Ricordate, per la pagina man, che la primi due caratteri di un messaggio crittografato 36 00:02:08,930 --> 00:02:10,590 stringa, come qui - 37 00:02:10,590 --> 00:02:12,770 50ZPJ e così via - 38 00:02:12,770 --> 00:02:16,170 le prime due cifre indicano noi il sale utilizzato 39 00:02:16,170 --> 00:02:18,080 nella funzione cripta. 40 00:02:18,080 --> 00:02:21,740 >> E qui, vediamo che il sale era ettari. 41 00:02:21,740 --> 00:02:27,610 Quindi vogliamo copiare i primi due caratteri, lunghezza sale essendo hash 42 00:02:27,610 --> 00:02:30,230 definita come due. 43 00:02:30,230 --> 00:02:35,970 Dobbiamo copiare i primi due caratteri in questo array, sale. 44 00:02:35,970 --> 00:02:39,340 Si noti che abbiamo bisogno di lunghezza sale più uno, dal momento che abbiamo ancora bisogno di un cavo null 45 00:02:39,340 --> 00:02:42,440 terminatore all'estremità del nostro sale. 46 00:02:42,440 --> 00:02:46,940 >> Poi andremo a dichiarare questa matrice, ospite, di dimensioni lunghezza Max Plus 47 00:02:46,940 --> 00:02:51,930 uno, in cui lunghezza massima è di hash definito come otto, dato che la password massima 48 00:02:51,930 --> 00:02:55,090 è lungo otto caratteri. 49 00:02:55,090 --> 00:02:59,860 E abbiamo intenzione di usare questo per iterare su tutte le possibili stringhe che potrebbero 50 00:02:59,860 --> 00:03:01,430 essere password valide. 51 00:03:01,430 --> 00:03:07,720 Quindi, se i caratteri validi in una password erano semplicemente a, b, e c, 52 00:03:07,720 --> 00:03:14,970 avremmo iterare su a, b, c, aa, BA, CA, e così via, fino 53 00:03:14,970 --> 00:03:16,690 si arriva a vedere cccccccc - 54 00:03:16,690 --> 00:03:19,600 otto di c. 55 00:03:19,600 --> 00:03:23,620 >> E se non abbiamo giù un valido password, quindi abbiamo bisogno di dire che la 56 00:03:23,620 --> 00:03:26,590 stringa cifrata non era valida per cominciare. 57 00:03:26,590 --> 00:03:29,970 Così ora, raggiungiamo questo mentre 1 loop. 58 00:03:29,970 --> 00:03:33,100 Si noti che significa che è un ciclo infinito. 59 00:03:33,100 --> 00:03:36,430 >> Si noti non ci sono istruzione break all'interno di tale ciclo infinito. 60 00:03:36,430 --> 00:03:38,570 Ci sono solo tornare dichiarazioni. 61 00:03:38,570 --> 00:03:41,210 Quindi non abbiamo mai realmente aspettiamo per uscire dal ciclo. 62 00:03:41,210 --> 00:03:44,750 Ci aspettiamo che solo per uscire dal programma. 63 00:03:44,750 --> 00:03:48,220 Ho aggiunto questa dichiarazione di stampa alla cima di questo ciclo per stampare solo fuori 64 00:03:48,220 --> 00:03:51,790 quello che la nostra ipotesi di corrente a ciò che la password è. 65 00:03:51,790 --> 00:03:53,630 >> Ora, che cosa sta facendo questo ciclo? 66 00:03:53,630 --> 00:03:58,330 E 'un ciclo su tutte le possibili stringhe che potrebbe essere password valide. 67 00:03:58,330 --> 00:04:02,700 La prima cosa che andremo a fare è prendere la nostra ipotesi attuale per ciò che il 68 00:04:02,700 --> 00:04:03,920 password è. 69 00:04:03,920 --> 00:04:07,230 Prenderemo il sale che abbiamo preso da la stringa cifrata, e siamo 70 00:04:07,230 --> 00:04:09,850 andando a crittografare la congettura. 71 00:04:09,850 --> 00:04:14,760 Questo ci darà una congettura cifrato, che andremo a confrontare con 72 00:04:14,760 --> 00:04:18,810 la stringa cifrata che l'utente inserito nella riga di comando. 73 00:04:18,810 --> 00:04:23,030 >> Se sono uguali, nel qual caso stringa paragonabile tornerà a zero, se 74 00:04:23,030 --> 00:04:28,050 sono la stessa cosa, quindi indovinare era la password che ha generato il crittografata 75 00:04:28,050 --> 00:04:33,520 stringa, nel qual caso possiamo stampare che, come la nostra password e ritorno. 76 00:04:33,520 --> 00:04:37,520 Ma se non fossero gli stessi, che significa che la nostra ipotesi era corretta. 77 00:04:37,520 --> 00:04:43,250 >> E vogliamo iterare a il successivo indovinare valido. 78 00:04:43,250 --> 00:04:46,410 Quindi questo è ciò che questo mentre ciclo sta cercando di fare. 79 00:04:46,410 --> 00:04:51,760 E 'intenzione di iterare la nostra ipotesi al successivo indovinare valido. 80 00:04:51,760 --> 00:04:56,080 Si noti che quando si dice che un particolare carattere nella nostra ipotesi ha 81 00:04:56,080 --> 00:05:01,770 raggiunto il massimo simbolo, che qui hash viene definita come una tilde, poiché 82 00:05:01,770 --> 00:05:05,710 questo è il più grande personaggio valore ASCII che un utente può immettere nella 83 00:05:05,710 --> 00:05:11,210 tastiera, quando il personaggio raggiunge l' simbolo max, allora vogliamo inviare 84 00:05:11,210 --> 00:05:17,150 di nuovo il simbolo minimo, che è uno spazio, ancora il più basso ASCII 85 00:05:17,150 --> 00:05:20,800 simbolo valore che un utente può inserire la tastiera. 86 00:05:20,800 --> 00:05:22,940 >> Quindi stiamo andando a impostare che al simbolo minimo. 87 00:05:22,940 --> 00:05:25,720 E poi stiamo per andare al carattere successivo. 88 00:05:25,720 --> 00:05:28,730 Così come sono le nostre supposizioni andando a iterare? 89 00:05:28,730 --> 00:05:33,685 Beh, se i caratteri validi sono A, B, e C, quindi se abbiamo iniziato con una, 90 00:05:33,685 --> 00:05:36,630 sara iterare per b, sarà iterare a c. 91 00:05:36,630 --> 00:05:44,360 c è il nostro simbolo massimo, quindi dovremo impostare c di nuovo ad un, il simbolo minimo. 92 00:05:44,360 --> 00:05:48,100 E poi ci iterare indice al carattere successivo. 93 00:05:48,100 --> 00:05:53,920 >> Quindi se la congettura originale era C, il successivo personaggio sarà il nulla 94 00:05:53,920 --> 00:05:55,560 terminatore. 95 00:05:55,560 --> 00:06:00,670 Quaggiù, notare che se il personaggio che ora vogliamo 96 00:06:00,670 --> 00:06:04,690 incremento è stato il terminatore null, poi andremo a impostarla sul 97 00:06:04,690 --> 00:06:06,260 simbolo minimo. 98 00:06:06,260 --> 00:06:11,431 Quindi, se l'ipotesi era c, allora il nostro nuova ipotesi sarà aa. 99 00:06:11,431 --> 00:06:16,050 E se la nostra ipotesi iniziale era cccc, allora la nostra nuova ipotesi 100 00:06:16,050 --> 00:06:18,380 sta per essere aaaaa. 101 00:06:18,380 --> 00:06:24,430 >> Così ogni volta che si raggiunge la stringa di massimo di una data lunghezza, allora siamo 102 00:06:24,430 --> 00:06:29,090 andando a implementare la stringa minima della lunghezza successivo, che sarà 103 00:06:29,090 --> 00:06:34,420 basta essere tutti i caratteri di il simbolo minimo. 104 00:06:34,420 --> 00:06:36,970 Ora, che cosa è questo controllo fa qui? 105 00:06:36,970 --> 00:06:42,780 Beh, se l'indice spostato dalla ottava carattere a carattere nove - 106 00:06:42,780 --> 00:06:46,460 in modo da aggiungiamo otto c di come nostro precedente indovinare - 107 00:06:46,460 --> 00:06:51,270 allora indice si concentrerà sulla ultimo terminatore null della nostra ipotesi 108 00:06:51,270 --> 00:06:57,990 array, che non è destinato a realtà essere utilizzato in nostra password. 109 00:06:57,990 --> 00:07:03,530 >> Quindi, se siamo concentrati su quest'ultimo nullo terminator, quindi non abbiamo trovato un 110 00:07:03,530 --> 00:07:07,750 la password che è valida utilizzando solo otto personaggi, il che significa che non c'è 111 00:07:07,750 --> 00:07:10,550 password valida che crittografa alla stringa data. 112 00:07:10,550 --> 00:07:13,520 E dobbiamo stampare che, dicendo Non siamo riusciti a trovare un valido 113 00:07:13,520 --> 00:07:16,100 password e ritorno. 114 00:07:16,100 --> 00:07:20,280 Quindi questo ciclo while sta per iterare su tutte le possibili stringhe. 115 00:07:20,280 --> 00:07:24,640 >> Se ne trova una che crittografa la stringa crittografata previsto, sarà 116 00:07:24,640 --> 00:07:26,190 restituire quella password. 117 00:07:26,190 --> 00:07:29,610 E non trova nulla, allora tornerà, la stampa che 118 00:07:29,610 --> 00:07:31,910 non è stato in grado di trovare qualsiasi cosa. 119 00:07:31,910 --> 00:07:39,220 Ora, si noti che iterare su tutti possibili stringhe è probabilmente andando a 120 00:07:39,220 --> 00:07:40,420 prendere un po '. 121 00:07:40,420 --> 00:07:43,590 Diamo effettivamente vedere come lungo che prende. 122 00:07:43,590 --> 00:07:47,230 >> Facciamo crepa. 123 00:07:47,230 --> 00:07:51,050 Beh, oops - dice undefined riferimento alla cripta. 124 00:07:51,050 --> 00:07:55,330 Quindi ricorda, per il p imposta specifica e anche la pagina di manuale per crypt che abbiamo 125 00:07:55,330 --> 00:07:58,130 necessità di collegare in cripta. 126 00:07:58,130 --> 00:08:01,130 Ora, il default rendono comando non sa che 127 00:08:01,130 --> 00:08:03,010 voler utilizzare tale funzione. 128 00:08:03,010 --> 00:08:09,680 >> Quindi cerchiamo di copiare questo comando del client e basta aggiungere alla fine 129 00:08:09,680 --> 00:08:13,300 di esso, che collega cripta. 130 00:08:13,300 --> 00:08:14,820 Ora, si compila. 131 00:08:14,820 --> 00:08:23,880 Quindi Corriamo crepa su un dato stringa crittografata - 132 00:08:23,880 --> 00:08:25,130 così Cesare. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Così che era piuttosto veloce. 135 00:08:30,790 --> 00:08:33,230 >> Si noti che questo è conclusa il 13. 136 00:08:33,230 --> 00:08:38,240 Beh, la password criptata di Cesare sembra essere 13. 137 00:08:38,240 --> 00:08:41,650 Quindi cerchiamo di un'altra password. 138 00:08:41,650 --> 00:08:45,830 Prendiamo cifrato di Hirschhorn password e cercare di cracking che. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Quindi notare abbiamo già raggiunto tre personaggi. 141 00:08:55,110 --> 00:08:58,660 E stiamo iterare su tutti i possibili stringhe di tre caratteri. 142 00:08:58,660 --> 00:09:01,420 Questo significa che abbiamo già finito l'iterazione di tutti i possibili uno e 143 00:09:01,420 --> 00:09:04,660 due stringhe di caratteri. 144 00:09:04,660 --> 00:09:09,180 Ora, sembra che questo sta per prendere un po 'prima di raggiungere la 145 00:09:09,180 --> 00:09:10,580 stringhe di quattro caratteri. 146 00:09:10,580 --> 00:09:14,680 Si potrebbe prendere un paio di minuti. 147 00:09:14,680 --> 00:09:16,055 >> Non ci è voluto un paio di minuti. 148 00:09:16,055 --> 00:09:18,450 Siamo sulle corde di quattro caratteri. 149 00:09:18,450 --> 00:09:22,800 Ma ora, abbiamo bisogno di iterare su tutti possibili stringhe di quattro caratteri, che 150 00:09:22,800 --> 00:09:26,000 che potrebbe prendere forse 10 minuti. 151 00:09:26,000 --> 00:09:28,720 E poi, quando si arriva a cinque caratteri stringhe, abbiamo bisogno di iterare tutti 152 00:09:28,720 --> 00:09:31,450 di quelli, che potrebbe prendere un paio d'ore. 153 00:09:31,450 --> 00:09:34,080 E abbiamo bisogno di iterare su tutti i possibili sei caratteri corde, che 154 00:09:34,080 --> 00:09:36,560 potrebbe richiedere un paio di giorni e così via. 155 00:09:36,560 --> 00:09:41,380 >> Quindi potrebbe richiedere potenzialmente molto lungo tempo per scorrere tutte le possibili 156 00:09:41,380 --> 00:09:44,850 otto caratteri e un minor numero di stringhe. 157 00:09:44,850 --> 00:09:50,600 Quindi, si noti che questo non è necessariamente un algoritmo molto efficiente per trovare 158 00:09:50,600 --> 00:09:51,860 una password. 159 00:09:51,860 --> 00:09:54,540 Si potrebbe pensare che non ci sono modi migliori. 160 00:09:54,540 --> 00:10:02,230 Per esempio, la ZYX Password 32AB Probabilmente non è una password molto comune, 161 00:10:02,230 --> 00:10:06,440 mentre la password è 12345 probabilmente molto più comune. 162 00:10:06,440 --> 00:10:13,570 >> Quindi un modo di cercare di trovare una password in modo più rapido è quello di guardare solo 163 00:10:13,570 --> 00:10:15,560 presso le password che sono più comuni. 164 00:10:15,560 --> 00:10:20,480 Così, per esempio, possiamo provare a leggere le parole da un dizionario e provare tutti 165 00:10:20,480 --> 00:10:24,860 quelle parole come le nostre supposizioni password. 166 00:10:24,860 --> 00:10:29,210 Ora, forse una password non è così semplice. 167 00:10:29,210 --> 00:10:32,600 Forse l'utente era in qualche modo intelligente e provare aggiungendo un numero al 168 00:10:32,600 --> 00:10:34,220 alla fine di una parola. 169 00:10:34,220 --> 00:10:37,000 >> Così forse la loro parola d'ordine era password1. 170 00:10:37,000 --> 00:10:41,520 Così si può provare iterare su tutte le parole nel dizionario con un one 171 00:10:41,520 --> 00:10:43,210 aggiunto alla fine di esso. 172 00:10:43,210 --> 00:10:47,360 E poi magari dopo aver fatto questo, dovrai aggiungere una due alla fine di esso. 173 00:10:47,360 --> 00:10:50,240 >> O forse l'utente sta cercando di essere ancora più intelligente, e vogliono che il loro 174 00:10:50,240 --> 00:10:54,980 la password per essere "hacker", ma sono andando a sostituire tutte le istanze e di 175 00:10:54,980 --> 00:10:56,600 con coppia di tre. 176 00:10:56,600 --> 00:10:58,440 Così si potrebbe fare anche questo. 177 00:10:58,440 --> 00:11:02,100 Iterare su tutte le parole nel dizionario ma sostituire i caratteri che 178 00:11:02,100 --> 00:11:04,790 guardare come numeri con quei numeri. 179 00:11:04,790 --> 00:11:09,670 >> Quindi, in questo modo, si potrebbe prendere ancora di più le password che sono abbastanza comuni. 180 00:11:09,670 --> 00:11:14,690 Ma alla fine, l'unico modo è possibile catturare tutte le password è quello di bruto 181 00:11:14,690 --> 00:11:17,340 forzare iterare su tutti stringhe possibili. 182 00:11:17,340 --> 00:11:22,100 Così, alla fine, si ha bisogno di iterare su tutte le stringhe da un personaggio 183 00:11:22,100 --> 00:11:28,110 otto caratteri, che potrebbero richiedere un tempo molto lungo, ma è necessario farlo. 184 00:11:28,110 --> 00:11:30,024 >> Il mio nome è Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 E questo è Crack. 186 00:11:31,425 --> 00:11:36,533