ROB BOWDEN: Jestem Rob i niech się pęknięcia. Więc pamiętaj, od spec Pset że idziemy do konieczności użycia Funkcja crypt. Na stronie man, mamy dwa hash określić _xopensource. Nie martw się, dlaczego musimy zrobić. A także hash to unistd.h. Więc raz, że to z drogi, niech dostać się do aktualnego programu. Pierwszą rzeczą, którą musisz zrobić, to upewnić się, użytkownik wprowadził ważne szyfrowane hasło w wierszu polecenia. Pamiętaj, że program ma być prowadzone jak dot slash pęknięcia i następnie szyfrowane ciąg. Więc tutaj mamy do sprawdzenia, aby upewnić że argc do dwóch, jeśli chcemy kontynuowania działania. Jeśli nie jest argc dwóch, co oznacza, że ​​albo użytkownik nie wprowadzić zaszyfrowany hasła w linii poleceń, albo wszedł więcej niż tylko zaszyfrowana hasła w linii poleceń, w którym Sprawa nie wiemy, co zrobić z Argumenty wiersza poleceń. Więc jeśli argc był dwa, możemy kontynuować. A tutaj, mamy zamiar zadeklarować Zmienna szyfrowane. To po prostu się do aliasu oryginalnych argv1 tak, że przez ten Program, nie mamy go nazywać argv1, które następnie trzeba myśleć o tym, co to właściwie oznacza. Więc w końcu, chcemy, aby potwierdzić, że zaszyfrowane hasło użytkownika wprowadzone może być rzeczywiście zaszyfrowane hasło. Za stronę man krypcie, w zaszyfrowane hasło musi być 13 znaków. Tutaj zauważyć, że mamy zdefiniowane hash szyfrowania długość jak 13. Więc jesteśmy po prostu upewnić się, że Długość ciąg zaszyfrowany Hasło jest 13. A jeśli to nie chcemy aby wyjść z programu. Więc raz, że to z drogi, możemy teraz rzeczywiście starają się znaleźć to, co hasło, które dał szyfrowane hasło było. Tutaj chcemy złapać soli z zaszyfrowanego hasła. Pamiętaj, że na tej stronie man, że dwa pierwsze znaki zaszyfrowane ciąg, jak tutaj - 50ZPJ i tak dalej - dwa pierwsze znaki dają nas sól, że użyto w krypcie funkcji. I tutaj widzimy, że sól była ha. Dlatego chcemy, aby skopiować dwa pierwsze znaków, długość sól jest hash zdefiniowany jako dwa. Musimy skopiować dwóch pierwszych znaków do tej tablicy, sól. Zauważ, że potrzebujemy długość soli oraz jeden, ponieważ wciąż musimy wartość null Terminator na końcu solne. Następnie idziemy do ogłoszenia tej tablicy, gość, o długości max size plus jeden, gdzie maksymalna długość jest określona hash od ośmiu od maksymalnej Hasło jest osiem znaków. I mamy zamiar to wykorzystać do iteracji wszystkich możliwych ciągów znaków, które mogłyby być ważne hasła. Więc jeśli ważnych znaków w haśle były tak, B, i C, a następnie my iteracyjnego, B, C, AA, BA, CA, i tak dalej, aż do mamy zobaczyć cccccccc - osiem c-tych. A jeśli nie mamy w dół ważne hasło, to trzeba powiedzieć, że zaszyfrowany ciąg nie było ważne, aby rozpocząć. Więc teraz, gdy osiągniemy ten 1 pętla. Zauważ, że oznacza to nieskończonej pętli. Zauważ, że nie ma instrukcji break wewnątrz tej nieskończonej pętli. Nie tylko zwrócić oświadczenia. Więc nigdy tak naprawdę się spodziewać aby wyjść z pętli. My tylko oczekiwać, aby wyjść z programu. Dodałem to oświadczenie wydruku do Najwięcej z tej pętli po prostu wydrukować co nasz obecny domyślać jakie jest hasło. Teraz, co jest ta pętla robi? To pętli na wszystkie możliwe sznurki , które mogą być ważne hasła. Pierwszą rzeczą, którą zamierzamy zrobić, to wziąć naszą aktualną przypuszczenie co hasło. Weźmiemy soli, że pobrana z zaszyfrowany ciąg znaków, a my jesteśmy zamierza zaszyfrować domyślać. To da nam zaszyfrowany przypuszczenie, które mamy zamiar porównać z zaszyfrowany ciąg znaków, które użytkownik wpisane w linii poleceń. Jeśli są one takie same, w którym to przypadku Ciąg porównywalne zwróci zero, jeśli są takie same, to chyba było hasło wygenerowane szyfrowane ciąg, w tym przypadku możemy wydrukować że w naszym hasłem i powrotu. Jeśli jednak nie są takie same, to Oznacza to, nasze przypuszczenie było błędne. I chcemy iteracji do następna ważna przypuszczenie. Więc to, co ten czas pętla stara się zrobić. To będzie iteracyjne nasze przypuszczenie do kolejnego ważnego odgadnięcia. Zauważ, że gdy mówimy, że Szczególny charakter ma w naszej odgadnięcia osiągnął symbol max, co się tutaj jest zdefiniowana jako hash tyldy, ponieważ to największa wartość znaków ASCII które użytkownik może wprowadzić w klawiatury, gdy postać osiągnie max symbol, a następnie chcemy wysłać go do minimalnego symbolu, który jest miejsce, ponownie najniższy ASCII symbol wartości, które użytkownik może wprowadzić z klawiatury. Więc idziemy do ustawienia, które minimalnej symbolu. A potem mamy zamiar iść do następnego znaku. Więc jak to nasze domysły będzie iteracyjne? Cóż, jeśli ważne postacie są a, b, i c, a następnie, jeśli zaczęło się, będzie to powtarzać do b, to będziesz iteracji do c.. c max jest nasz symbol, więc możemy ustawić c powrotem, minimum symbol. A potem będziemy iteracji indeks do następnego znaku. Więc jeśli przy przypuszczenie było c, obok charakter będzie zerowy terminator. Tu zauważyć, że jeśli postać że teraz chcemy przyrost był zerowy, terminator Następnie jedziemy do ustaw go na minimum symbol. Więc jeśli przypuszczenie było c, to nasze nowe przypuszczenie będzie aa. A jeśli nasze oryginalne przypuszczenie było cccc, to nasz nowy przypuszczenie będzie aaaaa. Więc kiedy tylko osiągnięcia maksymalnej ciąg o określonej długości, a następnie jesteśmy zamierza wprowadzić do minimum ciąg następnej długości, co po prostu wszystkie znaki minimum symbol. Teraz, co to jest czek tu robisz? Cóż, jeśli indeks przeniesiony z ósmego postaci z dziewięciu znaków - więc dodać osiem C jest jako Nasz poprzedni przypuszczam - wtedy wskaźnik będzie koncentrować się na ostatnia wartość null terminator naszej odgadnięcia Tablica, która nie jest przeznaczona do rzeczywistości być stosowane w naszych hasło. Jeśli więc skupiają się na tej ostatniej nieważną terminator, to nie znalazłem hasło, które jest ważne przy użyciu tylko osiem znaków, co oznacza, że ​​nie jest poprawne hasło, które szyfruje do danego łańcucha. I mamy do drukowania, które, mówiąc nie mogliśmy znaleźć ważne hasło i powrót. A więc ta pętla będzie się powtarzać wszystkich możliwych ciągów. Jeśli je znajdzie, że szyfruje się Oczekuje szyfrowane ciąg, to będziesz powrót tego hasła. I to nie znajdziesz nic, to powróci, drukowanie, że nie był w stanie znaleźć niczego. Teraz zauważył, że iteracja wszystko możliwych ciągów prawdopodobnie będzie potrwać. Chcę zobaczyć, jak w rzeczywistości długo, że trwa. Zróbmy pęknięcia. Cóż, oops - mówi nieokreślony odwoływać się do krypty. Więc pamiętaj, dla p określa specyfikację i także na stronie man krypcie, że należy połączyć w krypcie. Teraz domyślne polecenia make nie wie, że chcesz używać tej funkcji. Więc skopiuj to polecenie klienta i po prostu dodać na koniec o tym, krypta powiązania. Teraz kompiluje. Warto więc uruchomić pęknięcia na dany zaszyfrowany string - tak Cezara. Tak, że dość szybko. Zauważ, że to skończyło się na 13. Cóż, zaszyfrowane hasło Cezara dzieje się 13. Warto więc spróbować inne hasło. Weźmy Hirschhorn jest szyfrowany hasło i spróbuj pękanie, że. Tak więc zauważyć, że już osiągnął trzy znaki. A my iterowanie wszystkie możliwe trzy ciągi znaków. To oznacza, że ​​już kończy iterowanie wszystkie możliwe jedno i znakowe. Teraz wygląda to tak będzie potrwać zanim dotrzemy cztery ciągi znaków. To może potrwać kilka minut. Nie trwało to kilka minut. Jesteśmy na czterech ciągów znaków. Ale teraz musimy iteracyjne nad wszystkie Możliwe cztery ciągi znaków, które że może wziąć może 10 minut. A potem, kiedy dojdziemy pięć charakter struny, musimy iterować wszystkie osób, które mogłyby potrwać kilka godzin. I musimy iterować wszystkie możliwe sześciu ciągów znaków, które może potrwać kilka dni i tak dalej. Więc to może potrwać bardzo długo, potencjalnie Czas iteracyjne nad wszystkie możliwe osiem znaków i mniej strun. Tak więc zauważyć, że nie jest to konieczne bardzo efektywny algorytm do znajdowania hasło. Można by pomyśleć, że nie Są lepsze sposoby. Na przykład, zyx hasło! 32ab chyba nie bardzo często hasło to, natomiast hasło 12345 jest prawdopodobnie dużo więcej wspólnego. Więc jeden sposób próbuje znaleźć hasło szybciej jest po prostu patrzeć na hasła, które są bardziej powszechne. Tak na przykład, możemy spróbować odczytać słowa ze słownika i spróbować wszystkich te słowa jak nasze domysły hasła. Teraz, być może hasło nie jest takie proste. Może użytkownik był nieco mądry i spróbuj dodanie numeru do koniec słowa. Więc może ich hasło było password1. Więc można spróbować iterowanie wszystkie słowa w słowniku, z jednej dołączony do końca. A potem być może po to robić, będziesz dodać dwa do końca. A może użytkownik stara się być jeszcze bardziej inteligentne i chcą ich hasło jest "haker", ale są one będzie zastąpić wszystkie wystąpienia E-tych z trójkami. Więc może to zrobić też. Iteracji po wszystkich słów w słowniku ale zastąpienie znaków, które wyglądać numerów z tych numerów. Więc ten sposób można złapać jeszcze więcej hasła, które są dość powszechne. Ale w końcu, tylko w ten sposób można przechwytywać wszystkie hasła jest brute zmusić iteracyjne nad wszystkie możliwych ciągów. Więc w końcu, trzeba zrobić, aby iteracyjne na wszystkich strunach od jednego znaku osiem znaków, które mogą podjąć bardzo długo, ale trzeba to zrobić. Nazywam się Rob Bowden. I to jest crack.