>> 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.