1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB BOWDEN: Jestem Rob i niech się pęknięcia. 3 00:00:15,890 --> 00:00:19,390 Więc pamiętaj, od spec Pset że idziemy do konieczności użycia 4 00:00:19,390 --> 00:00:20,890 Funkcja crypt. 5 00:00:20,890 --> 00:00:26,330 Na stronie man, mamy dwa hash określić _xopensource. 6 00:00:26,330 --> 00:00:28,290 Nie martw się, dlaczego musimy zrobić. 7 00:00:28,290 --> 00:00:31,550 A także hash to unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Więc raz, że to z drogi, niech dostać się do aktualnego programu. 9 00:00:35,920 --> 00:00:39,570 Pierwszą rzeczą, którą musisz zrobić, to upewnić się, użytkownik wprowadził ważne szyfrowane 10 00:00:39,570 --> 00:00:41,520 hasło w wierszu polecenia. 11 00:00:41,520 --> 00:00:46,050 Pamiętaj, że program ma być prowadzone jak dot slash pęknięcia i 12 00:00:46,050 --> 00:00:48,120 następnie szyfrowane ciąg. 13 00:00:48,120 --> 00:00:52,990 >> Więc tutaj mamy do sprawdzenia, aby upewnić że argc do dwóch, jeśli chcemy 14 00:00:52,990 --> 00:00:54,380 kontynuowania działania. 15 00:00:54,380 --> 00:00:58,830 Jeśli nie jest argc dwóch, co oznacza, że ​​albo użytkownik nie wprowadzić zaszyfrowany 16 00:00:58,830 --> 00:01:02,560 hasła w linii poleceń, albo wszedł więcej niż tylko zaszyfrowana 17 00:01:02,560 --> 00:01:05,379 hasła w linii poleceń, w którym Sprawa nie wiemy, co zrobić z 18 00:01:05,379 --> 00:01:07,660 Argumenty wiersza poleceń. 19 00:01:07,660 --> 00:01:11,390 >> Więc jeśli argc był dwa, możemy kontynuować. 20 00:01:11,390 --> 00:01:14,160 A tutaj, mamy zamiar zadeklarować Zmienna szyfrowane. 21 00:01:14,160 --> 00:01:17,650 To po prostu się do aliasu oryginalnych argv1 tak, że przez ten 22 00:01:17,650 --> 00:01:20,690 Program, nie mamy go nazywać argv1, które następnie trzeba myśleć 23 00:01:20,690 --> 00:01:22,950 o tym, co to właściwie oznacza. 24 00:01:22,950 --> 00:01:27,180 >> Więc w końcu, chcemy, aby potwierdzić, że zaszyfrowane hasło użytkownika 25 00:01:27,180 --> 00:01:30,840 wprowadzone może być rzeczywiście zaszyfrowane hasło. 26 00:01:30,840 --> 00:01:35,120 Za stronę man krypcie, w zaszyfrowane hasło musi być 13 27 00:01:35,120 --> 00:01:36,440 znaków. 28 00:01:36,440 --> 00:01:41,500 Tutaj zauważyć, że mamy zdefiniowane hash szyfrowania długość jak 13. 29 00:01:41,500 --> 00:01:46,140 Więc jesteśmy po prostu upewnić się, że Długość ciąg zaszyfrowany 30 00:01:46,140 --> 00:01:49,090 Hasło jest 13. 31 00:01:49,090 --> 00:01:52,280 >> A jeśli to nie chcemy aby wyjść z programu. 32 00:01:52,280 --> 00:01:56,470 Więc raz, że to z drogi, możemy teraz rzeczywiście starają się znaleźć to, co 33 00:01:56,470 --> 00:02:00,410 hasło, które dał szyfrowane hasło było. 34 00:02:00,410 --> 00:02:04,870 Tutaj chcemy złapać soli z zaszyfrowanego hasła. 35 00:02:04,870 --> 00:02:08,930 Pamiętaj, że na tej stronie man, że dwa pierwsze znaki zaszyfrowane 36 00:02:08,930 --> 00:02:10,590 ciąg, jak tutaj - 37 00:02:10,590 --> 00:02:12,770 50ZPJ i tak dalej - 38 00:02:12,770 --> 00:02:16,170 dwa pierwsze znaki dają nas sól, że użyto 39 00:02:16,170 --> 00:02:18,080 w krypcie funkcji. 40 00:02:18,080 --> 00:02:21,740 >> I tutaj widzimy, że sól była ha. 41 00:02:21,740 --> 00:02:27,610 Dlatego chcemy, aby skopiować dwa pierwsze znaków, długość sól jest hash 42 00:02:27,610 --> 00:02:30,230 zdefiniowany jako dwa. 43 00:02:30,230 --> 00:02:35,970 Musimy skopiować dwóch pierwszych znaków do tej tablicy, sól. 44 00:02:35,970 --> 00:02:39,340 Zauważ, że potrzebujemy długość soli oraz jeden, ponieważ wciąż musimy wartość null 45 00:02:39,340 --> 00:02:42,440 Terminator na końcu solne. 46 00:02:42,440 --> 00:02:46,940 >> Następnie idziemy do ogłoszenia tej tablicy, gość, o długości max size plus 47 00:02:46,940 --> 00:02:51,930 jeden, gdzie maksymalna długość jest określona hash od ośmiu od maksymalnej Hasło 48 00:02:51,930 --> 00:02:55,090 jest osiem znaków. 49 00:02:55,090 --> 00:02:59,860 I mamy zamiar to wykorzystać do iteracji wszystkich możliwych ciągów znaków, które mogłyby 50 00:02:59,860 --> 00:03:01,430 być ważne hasła. 51 00:03:01,430 --> 00:03:07,720 Więc jeśli ważnych znaków w haśle były tak, B, i C, a następnie 52 00:03:07,720 --> 00:03:14,970 my iteracyjnego, B, C, AA, BA, CA, i tak dalej, aż do 53 00:03:14,970 --> 00:03:16,690 mamy zobaczyć cccccccc - 54 00:03:16,690 --> 00:03:19,600 osiem c-tych. 55 00:03:19,600 --> 00:03:23,620 >> A jeśli nie mamy w dół ważne hasło, to trzeba powiedzieć, że 56 00:03:23,620 --> 00:03:26,590 zaszyfrowany ciąg nie było ważne, aby rozpocząć. 57 00:03:26,590 --> 00:03:29,970 Więc teraz, gdy osiągniemy ten 1 pętla. 58 00:03:29,970 --> 00:03:33,100 Zauważ, że oznacza to nieskończonej pętli. 59 00:03:33,100 --> 00:03:36,430 >> Zauważ, że nie ma instrukcji break wewnątrz tej nieskończonej pętli. 60 00:03:36,430 --> 00:03:38,570 Nie tylko zwrócić oświadczenia. 61 00:03:38,570 --> 00:03:41,210 Więc nigdy tak naprawdę się spodziewać aby wyjść z pętli. 62 00:03:41,210 --> 00:03:44,750 My tylko oczekiwać, aby wyjść z programu. 63 00:03:44,750 --> 00:03:48,220 Dodałem to oświadczenie wydruku do Najwięcej z tej pętli po prostu wydrukować 64 00:03:48,220 --> 00:03:51,790 co nasz obecny domyślać jakie jest hasło. 65 00:03:51,790 --> 00:03:53,630 >> Teraz, co jest ta pętla robi? 66 00:03:53,630 --> 00:03:58,330 To pętli na wszystkie możliwe sznurki , które mogą być ważne hasła. 67 00:03:58,330 --> 00:04:02,700 Pierwszą rzeczą, którą zamierzamy zrobić, to wziąć naszą aktualną przypuszczenie co 68 00:04:02,700 --> 00:04:03,920 hasło. 69 00:04:03,920 --> 00:04:07,230 Weźmiemy soli, że pobrana z zaszyfrowany ciąg znaków, a my jesteśmy 70 00:04:07,230 --> 00:04:09,850 zamierza zaszyfrować domyślać. 71 00:04:09,850 --> 00:04:14,760 To da nam zaszyfrowany przypuszczenie, które mamy zamiar porównać z 72 00:04:14,760 --> 00:04:18,810 zaszyfrowany ciąg znaków, które użytkownik wpisane w linii poleceń. 73 00:04:18,810 --> 00:04:23,030 >> Jeśli są one takie same, w którym to przypadku Ciąg porównywalne zwróci zero, jeśli 74 00:04:23,030 --> 00:04:28,050 są takie same, to chyba było hasło wygenerowane szyfrowane 75 00:04:28,050 --> 00:04:33,520 ciąg, w tym przypadku możemy wydrukować że w naszym hasłem i powrotu. 76 00:04:33,520 --> 00:04:37,520 Jeśli jednak nie są takie same, to Oznacza to, nasze przypuszczenie było błędne. 77 00:04:37,520 --> 00:04:43,250 >> I chcemy iteracji do następna ważna przypuszczenie. 78 00:04:43,250 --> 00:04:46,410 Więc to, co ten czas pętla stara się zrobić. 79 00:04:46,410 --> 00:04:51,760 To będzie iteracyjne nasze przypuszczenie do kolejnego ważnego odgadnięcia. 80 00:04:51,760 --> 00:04:56,080 Zauważ, że gdy mówimy, że Szczególny charakter ma w naszej odgadnięcia 81 00:04:56,080 --> 00:05:01,770 osiągnął symbol max, co się tutaj jest zdefiniowana jako hash tyldy, ponieważ 82 00:05:01,770 --> 00:05:05,710 to największa wartość znaków ASCII które użytkownik może wprowadzić w 83 00:05:05,710 --> 00:05:11,210 klawiatury, gdy postać osiągnie max symbol, a następnie chcemy wysłać 84 00:05:11,210 --> 00:05:17,150 go do minimalnego symbolu, który jest miejsce, ponownie najniższy ASCII 85 00:05:17,150 --> 00:05:20,800 symbol wartości, które użytkownik może wprowadzić z klawiatury. 86 00:05:20,800 --> 00:05:22,940 >> Więc idziemy do ustawienia, które minimalnej symbolu. 87 00:05:22,940 --> 00:05:25,720 A potem mamy zamiar iść do następnego znaku. 88 00:05:25,720 --> 00:05:28,730 Więc jak to nasze domysły będzie iteracyjne? 89 00:05:28,730 --> 00:05:33,685 Cóż, jeśli ważne postacie są a, b, i c, a następnie, jeśli zaczęło się, 90 00:05:33,685 --> 00:05:36,630 będzie to powtarzać do b, to będziesz iteracji do c.. 91 00:05:36,630 --> 00:05:44,360 c max jest nasz symbol, więc możemy ustawić c powrotem, minimum symbol. 92 00:05:44,360 --> 00:05:48,100 A potem będziemy iteracji indeks do następnego znaku. 93 00:05:48,100 --> 00:05:53,920 >> Więc jeśli przy przypuszczenie było c, obok charakter będzie zerowy 94 00:05:53,920 --> 00:05:55,560 terminator. 95 00:05:55,560 --> 00:06:00,670 Tu zauważyć, że jeśli postać że teraz chcemy 96 00:06:00,670 --> 00:06:04,690 przyrost był zerowy, terminator Następnie jedziemy do ustaw go na 97 00:06:04,690 --> 00:06:06,260 minimum symbol. 98 00:06:06,260 --> 00:06:11,431 Więc jeśli przypuszczenie było c, to nasze nowe przypuszczenie będzie aa. 99 00:06:11,431 --> 00:06:16,050 A jeśli nasze oryginalne przypuszczenie było cccc, to nasz nowy przypuszczenie 100 00:06:16,050 --> 00:06:18,380 będzie aaaaa. 101 00:06:18,380 --> 00:06:24,430 >> Więc kiedy tylko osiągnięcia maksymalnej ciąg o określonej długości, a następnie jesteśmy 102 00:06:24,430 --> 00:06:29,090 zamierza wprowadzić do minimum ciąg następnej długości, co 103 00:06:29,090 --> 00:06:34,420 po prostu wszystkie znaki minimum symbol. 104 00:06:34,420 --> 00:06:36,970 Teraz, co to jest czek tu robisz? 105 00:06:36,970 --> 00:06:42,780 Cóż, jeśli indeks przeniesiony z ósmego postaci z dziewięciu znaków - 106 00:06:42,780 --> 00:06:46,460 więc dodać osiem C jest jako Nasz poprzedni przypuszczam - 107 00:06:46,460 --> 00:06:51,270 wtedy wskaźnik będzie koncentrować się na ostatnia wartość null terminator naszej odgadnięcia 108 00:06:51,270 --> 00:06:57,990 Tablica, która nie jest przeznaczona do rzeczywistości być stosowane w naszych hasło. 109 00:06:57,990 --> 00:07:03,530 >> Jeśli więc skupiają się na tej ostatniej nieważną terminator, to nie znalazłem 110 00:07:03,530 --> 00:07:07,750 hasło, które jest ważne przy użyciu tylko osiem znaków, co oznacza, że ​​nie jest 111 00:07:07,750 --> 00:07:10,550 poprawne hasło, które szyfruje do danego łańcucha. 112 00:07:10,550 --> 00:07:13,520 I mamy do drukowania, które, mówiąc nie mogliśmy znaleźć ważne 113 00:07:13,520 --> 00:07:16,100 hasło i powrót. 114 00:07:16,100 --> 00:07:20,280 A więc ta pętla będzie się powtarzać wszystkich możliwych ciągów. 115 00:07:20,280 --> 00:07:24,640 >> Jeśli je znajdzie, że szyfruje się Oczekuje szyfrowane ciąg, to będziesz 116 00:07:24,640 --> 00:07:26,190 powrót tego hasła. 117 00:07:26,190 --> 00:07:29,610 I to nie znajdziesz nic, to powróci, drukowanie, że 118 00:07:29,610 --> 00:07:31,910 nie był w stanie znaleźć niczego. 119 00:07:31,910 --> 00:07:39,220 Teraz zauważył, że iteracja wszystko możliwych ciągów prawdopodobnie będzie 120 00:07:39,220 --> 00:07:40,420 potrwać. 121 00:07:40,420 --> 00:07:43,590 Chcę zobaczyć, jak w rzeczywistości długo, że trwa. 122 00:07:43,590 --> 00:07:47,230 >> Zróbmy pęknięcia. 123 00:07:47,230 --> 00:07:51,050 Cóż, oops - mówi nieokreślony odwoływać się do krypty. 124 00:07:51,050 --> 00:07:55,330 Więc pamiętaj, dla p określa specyfikację i także na stronie man krypcie, że 125 00:07:55,330 --> 00:07:58,130 należy połączyć w krypcie. 126 00:07:58,130 --> 00:08:01,130 Teraz domyślne polecenia make nie wie, że 127 00:08:01,130 --> 00:08:03,010 chcesz używać tej funkcji. 128 00:08:03,010 --> 00:08:09,680 >> Więc skopiuj to polecenie klienta i po prostu dodać na koniec 129 00:08:09,680 --> 00:08:13,300 o tym, krypta powiązania. 130 00:08:13,300 --> 00:08:14,820 Teraz kompiluje. 131 00:08:14,820 --> 00:08:23,880 Warto więc uruchomić pęknięcia na dany zaszyfrowany string - 132 00:08:23,880 --> 00:08:25,130 tak Cezara. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Tak, że dość szybko. 135 00:08:30,790 --> 00:08:33,230 >> Zauważ, że to skończyło się na 13. 136 00:08:33,230 --> 00:08:38,240 Cóż, zaszyfrowane hasło Cezara dzieje się 13. 137 00:08:38,240 --> 00:08:41,650 Warto więc spróbować inne hasło. 138 00:08:41,650 --> 00:08:45,830 Weźmy Hirschhorn jest szyfrowany hasło i spróbuj pękanie, że. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Tak więc zauważyć, że już osiągnął trzy znaki. 141 00:08:55,110 --> 00:08:58,660 A my iterowanie wszystkie możliwe trzy ciągi znaków. 142 00:08:58,660 --> 00:09:01,420 To oznacza, że ​​już kończy iterowanie wszystkie możliwe jedno i 143 00:09:01,420 --> 00:09:04,660 znakowe. 144 00:09:04,660 --> 00:09:09,180 Teraz wygląda to tak będzie potrwać zanim dotrzemy 145 00:09:09,180 --> 00:09:10,580 cztery ciągi znaków. 146 00:09:10,580 --> 00:09:14,680 To może potrwać kilka minut. 147 00:09:14,680 --> 00:09:16,055 >> Nie trwało to kilka minut. 148 00:09:16,055 --> 00:09:18,450 Jesteśmy na czterech ciągów znaków. 149 00:09:18,450 --> 00:09:22,800 Ale teraz musimy iteracyjne nad wszystkie Możliwe cztery ciągi znaków, które 150 00:09:22,800 --> 00:09:26,000 że może wziąć może 10 minut. 151 00:09:26,000 --> 00:09:28,720 A potem, kiedy dojdziemy pięć charakter struny, musimy iterować wszystkie 152 00:09:28,720 --> 00:09:31,450 osób, które mogłyby potrwać kilka godzin. 153 00:09:31,450 --> 00:09:34,080 I musimy iterować wszystkie możliwe sześciu ciągów znaków, które 154 00:09:34,080 --> 00:09:36,560 może potrwać kilka dni i tak dalej. 155 00:09:36,560 --> 00:09:41,380 >> Więc to może potrwać bardzo długo, potencjalnie Czas iteracyjne nad wszystkie możliwe 156 00:09:41,380 --> 00:09:44,850 osiem znaków i mniej strun. 157 00:09:44,850 --> 00:09:50,600 Tak więc zauważyć, że nie jest to konieczne bardzo efektywny algorytm do znajdowania 158 00:09:50,600 --> 00:09:51,860 hasło. 159 00:09:51,860 --> 00:09:54,540 Można by pomyśleć, że nie Są lepsze sposoby. 160 00:09:54,540 --> 00:10:02,230 Na przykład, zyx hasło! 32ab chyba nie bardzo często hasło to, 161 00:10:02,230 --> 00:10:06,440 natomiast hasło 12345 jest prawdopodobnie dużo więcej wspólnego. 162 00:10:06,440 --> 00:10:13,570 >> Więc jeden sposób próbuje znaleźć hasło szybciej jest po prostu patrzeć 163 00:10:13,570 --> 00:10:15,560 na hasła, które są bardziej powszechne. 164 00:10:15,560 --> 00:10:20,480 Tak na przykład, możemy spróbować odczytać słowa ze słownika i spróbować wszystkich 165 00:10:20,480 --> 00:10:24,860 te słowa jak nasze domysły hasła. 166 00:10:24,860 --> 00:10:29,210 Teraz, być może hasło nie jest takie proste. 167 00:10:29,210 --> 00:10:32,600 Może użytkownik był nieco mądry i spróbuj dodanie numeru do 168 00:10:32,600 --> 00:10:34,220 koniec słowa. 169 00:10:34,220 --> 00:10:37,000 >> Więc może ich hasło było password1. 170 00:10:37,000 --> 00:10:41,520 Więc można spróbować iterowanie wszystkie słowa w słowniku, z jednej 171 00:10:41,520 --> 00:10:43,210 dołączony do końca. 172 00:10:43,210 --> 00:10:47,360 A potem być może po to robić, będziesz dodać dwa do końca. 173 00:10:47,360 --> 00:10:50,240 >> A może użytkownik stara się być jeszcze bardziej inteligentne i chcą ich 174 00:10:50,240 --> 00:10:54,980 hasło jest "haker", ale są one będzie zastąpić wszystkie wystąpienia E-tych 175 00:10:54,980 --> 00:10:56,600 z trójkami. 176 00:10:56,600 --> 00:10:58,440 Więc może to zrobić też. 177 00:10:58,440 --> 00:11:02,100 Iteracji po wszystkich słów w słowniku ale zastąpienie znaków, które 178 00:11:02,100 --> 00:11:04,790 wyglądać numerów z tych numerów. 179 00:11:04,790 --> 00:11:09,670 >> Więc ten sposób można złapać jeszcze więcej hasła, które są dość powszechne. 180 00:11:09,670 --> 00:11:14,690 Ale w końcu, tylko w ten sposób można przechwytywać wszystkie hasła jest brute 181 00:11:14,690 --> 00:11:17,340 zmusić iteracyjne nad wszystkie możliwych ciągów. 182 00:11:17,340 --> 00:11:22,100 Więc w końcu, trzeba zrobić, aby iteracyjne na wszystkich strunach od jednego znaku 183 00:11:22,100 --> 00:11:28,110 osiem znaków, które mogą podjąć bardzo długo, ale trzeba to zrobić. 184 00:11:28,110 --> 00:11:30,024 >> Nazywam się Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 I to jest crack. 186 00:11:31,425 --> 00:11:36,533