1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB BOWDEN: Ik ben Rob, en laten we kraken. 3 00:00:15,890 --> 00:00:19,390 Dus onthoud uit de pset spec dat gaan we nodig hebben om het te gebruiken 4 00:00:19,390 --> 00:00:20,890 crypt functie. 5 00:00:20,890 --> 00:00:26,330 Voor de man-pagina, hebben we twee hash definiëren _xopensource. 6 00:00:26,330 --> 00:00:28,290 Maak je geen zorgen over waarom moeten we dat doen. 7 00:00:28,290 --> 00:00:31,550 En ook hash bevatten unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Dus zodra dat is uit de weg, laten we krijgen om het eigenlijke programma. 9 00:00:35,920 --> 00:00:39,570 Het eerste wat we moeten doen is ervoor zorgen dat de gebruiker ingevoerde een geldige versleutelde 10 00:00:39,570 --> 00:00:41,520 wachtwoord op de opdrachtregel. 11 00:00:41,520 --> 00:00:46,050 Vergeet niet dat het programma wordt verondersteld te lopen als dot slash crack, en 12 00:00:46,050 --> 00:00:48,120 vervolgens gecodeerd string. 13 00:00:48,120 --> 00:00:52,990 >> Dus hier zijn we controleren om ervoor te zorgen dat dat argc tot twee als we willen 14 00:00:52,990 --> 00:00:54,380 verder met het programma. 15 00:00:54,380 --> 00:00:58,830 Als argc is niet twee, die ofwel betekent de gebruiker niet invoeren van een gecodeerde 16 00:00:58,830 --> 00:01:02,560 wachtwoord op de opdrachtregel, of ze ingevoerd meer dan alleen de gecodeerde 17 00:01:02,560 --> 00:01:05,379 wachtwoord op de opdrachtregel, waarbij geval dat we niet weten wat te doen met de 18 00:01:05,379 --> 00:01:07,660 command line argumenten. 19 00:01:07,660 --> 00:01:11,390 >> Dus als argc was twee, kunnen we verder. 20 00:01:11,390 --> 00:01:14,160 En hier, we gaan verklaren een variabele versleuteld. 21 00:01:14,160 --> 00:01:17,650 Dat zal alleen maar alias de oorspronkelijke argv1 zodat gedurende deze 22 00:01:17,650 --> 00:01:20,690 programma, hoeven we niet te argv1 noemen, die dan moet je denken 23 00:01:20,690 --> 00:01:22,950 over wat dat eigenlijk betekende. 24 00:01:22,950 --> 00:01:27,180 >> Dus eindelijk, we willen valideren dat het gecodeerde wachtwoord van de gebruiker 25 00:01:27,180 --> 00:01:30,840 ingevoerd kon eigenlijk zijn geweest een versleuteld wachtwoord. 26 00:01:30,840 --> 00:01:35,120 Per de man pagina van crypte, de gecodeerd wachtwoord moet minimaal 13 27 00:01:35,120 --> 00:01:36,440 tekens lang zijn. 28 00:01:36,440 --> 00:01:41,500 Hier, merken dat we hash gedefinieerd coderen lengte 13. 29 00:01:41,500 --> 00:01:46,140 Dus we zijn gewoon om ervoor te zorgen dat de koord lengte van de gecodeerde 30 00:01:46,140 --> 00:01:49,090 wachtwoord is 13. 31 00:01:49,090 --> 00:01:52,280 >> En als het niet, we willen om het programma af te sluiten. 32 00:01:52,280 --> 00:01:56,470 Dus zodra dat is uit de weg, we kunnen nu eigenlijk proberen uit te vinden wat de 33 00:01:56,470 --> 00:02:00,410 wachtwoord dat de versleutelde gaf wachtwoord was. 34 00:02:00,410 --> 00:02:04,870 Hier willen we het zout te grijpen uit het versleutelde wachtwoord. 35 00:02:04,870 --> 00:02:08,930 Vergeet niet, per de man page, dat de eerste twee letters van een versleutelde 36 00:02:08,930 --> 00:02:10,590 snaar, zoals hier - 37 00:02:10,590 --> 00:02:12,770 50ZPJ en ga zo maar door - 38 00:02:12,770 --> 00:02:16,170 de eerste twee tekens geven ons het zout dat werd gebruikt 39 00:02:16,170 --> 00:02:18,080 in de crypte functie. 40 00:02:18,080 --> 00:02:21,740 >> En hier zien we dat het zout was ha. 41 00:02:21,740 --> 00:02:27,610 Dus we willen de eerste twee kopiëren karakters, zout lengte zijnde hash 42 00:02:27,610 --> 00:02:30,230 gedefinieerd als twee. 43 00:02:30,230 --> 00:02:35,970 We moeten de eerste twee tekens kopiëren in deze array, zout. 44 00:02:35,970 --> 00:02:39,340 Merk op dat we moeten zout lengte plus men, omdat we nog steeds een null nodig 45 00:02:39,340 --> 00:02:42,440 terminator aan het einde van onze zout. 46 00:02:42,440 --> 00:02:46,940 >> Dan gaan we deze array te verklaren, gast, van grootte max. lengte plus 47 00:02:46,940 --> 00:02:51,930 een, het max. lengte is hash gedefinieerd acht, aangezien de maximum wachtwoord 48 00:02:51,930 --> 00:02:55,090 is acht tekens lang zijn. 49 00:02:55,090 --> 00:02:59,860 En we gaan dit gebruiken om te schakelen over alle mogelijke strings die konden 50 00:02:59,860 --> 00:03:01,430 geldig wachtwoorden. 51 00:03:01,430 --> 00:03:07,720 Dus als de geldige tekens in een wachtwoord waren net a, b en c, wordt 52 00:03:07,720 --> 00:03:14,970 we itereren over a, b, c, aa, ba, ca, enzovoort, totdat 53 00:03:14,970 --> 00:03:16,690 we krijgen om cccccccc zien - 54 00:03:16,690 --> 00:03:19,600 acht c's. 55 00:03:19,600 --> 00:03:23,620 >> En als we niet naar beneden een geldige wachtwoord, dan moeten we zeggen dat de 56 00:03:23,620 --> 00:03:26,590 versleutelde tekenreeks niet geldig om mee te beginnen. 57 00:03:26,590 --> 00:03:29,970 Dus nu, dit bereiken we tijdens 1 lus. 58 00:03:29,970 --> 00:03:33,100 Merk op dat betekent dat het een oneindige lus. 59 00:03:33,100 --> 00:03:36,430 >> Merk op dat er geen break statement binnenkant van deze oneindige lus. 60 00:03:36,430 --> 00:03:38,570 Er zijn slechts uitspraken terug. 61 00:03:38,570 --> 00:03:41,210 Dus we eigenlijk nooit verwacht om de lus te verlaten. 62 00:03:41,210 --> 00:03:44,750 We verwachten alleen om het programma te verlaten. 63 00:03:44,750 --> 00:03:48,220 Ik heb deze print-statement om de toegevoegde bovenkant van deze lus om gewoon uit te printen 64 00:03:48,220 --> 00:03:51,790 wat onze huidige gok op wat het wachtwoord is. 65 00:03:51,790 --> 00:03:53,630 >> Nu, wat is deze lus aan het doen? 66 00:03:53,630 --> 00:03:58,330 Het is een lus over alle mogelijke strings dat zou geldig wachtwoorden. 67 00:03:58,330 --> 00:04:02,700 Het eerste wat we gaan doen, is nemen onze huidige schatting van wat de 68 00:04:02,700 --> 00:04:03,920 wachtwoord is. 69 00:04:03,920 --> 00:04:07,230 We zullen het zout dat we pakten uit te nemen de gecodeerde tekenreeks, en we zijn 70 00:04:07,230 --> 00:04:09,850 gaat de gok te versleutelen. 71 00:04:09,850 --> 00:04:14,760 Dit geeft ons een gecodeerde gok, die we gaan vergelijken 72 00:04:14,760 --> 00:04:18,810 de versleutelde tekenreeks die de gebruiker ingevoerd op de opdrachtregel. 73 00:04:18,810 --> 00:04:23,030 >> Als ze gelijk zijn, waarbij snaar vergelijkbaar zal nul terugkeren, indien 74 00:04:23,030 --> 00:04:28,050 ze zijn hetzelfde, dan denk was de wachtwoord dat de versleutelde gegenereerde 75 00:04:28,050 --> 00:04:33,520 tekenreeks, waarbij we afdrukken dat als onze paswoord en terugkeer. 76 00:04:33,520 --> 00:04:37,520 Maar als ze niet hetzelfde, dat betekent dat onze gok onjuist was. 77 00:04:37,520 --> 00:04:43,250 >> En we willen herhalen om de volgende geldige gok. 78 00:04:43,250 --> 00:04:46,410 Dus dat is wat dit terwijl lus probeert te doen. 79 00:04:46,410 --> 00:04:51,760 Het gaat om onze gok herhalen de volgende geldige gok. 80 00:04:51,760 --> 00:04:56,080 Merk op dat wanneer we zeggen dat een bijzonder karakter in onze gok heeft 81 00:04:56,080 --> 00:05:01,770 bereikte de max symbool, dat hier hash wordt gedefinieerd als een tilde, aangezien 82 00:05:01,770 --> 00:05:05,710 dat is de grootste ASCII-waarde karakter die een gebruiker kan invoeren op de 83 00:05:05,710 --> 00:05:11,210 toetsenbord, wanneer het teken bereikt het max symbool, dan willen we sturen 84 00:05:11,210 --> 00:05:17,150 het terug naar de minimum symbool, dat is een ruimte, opnieuw de laagste ASCII 85 00:05:17,150 --> 00:05:20,800 waarde symbool dat een gebruiker kan betreden op het toetsenbord. 86 00:05:20,800 --> 00:05:22,940 >> Dus we gaan naar die set de minimum symbool. 87 00:05:22,940 --> 00:05:25,720 En dan gaan we om te gaan Op naar het volgende teken. 88 00:05:25,720 --> 00:05:28,730 Dus hoe zijn onze gissingen gaat herhalen? 89 00:05:28,730 --> 00:05:33,685 Goed, als de geldige tekens a, b, en c, dan als we begonnen met een, 90 00:05:33,685 --> 00:05:36,630 het zal herhalen om b, het zal herhalen tot c. 91 00:05:36,630 --> 00:05:44,360 c is onze max symbool, dus we stellen c terug naar een, de minimum-symbool. 92 00:05:44,360 --> 00:05:48,100 En dan gaan we index herhalen naar het volgende teken. 93 00:05:48,100 --> 00:05:53,920 >> Als het oorspronkelijke gissing c, de volgende karakter gaat het null 94 00:05:53,920 --> 00:05:55,560 terminator. 95 00:05:55,560 --> 00:06:00,670 Hier beneden, merken dat indien het karakter dat we nu willen 96 00:06:00,670 --> 00:06:04,690 increment was de null-terminator, dan gaan we in te stellen op de 97 00:06:04,690 --> 00:06:06,260 minimum symbool. 98 00:06:06,260 --> 00:06:11,431 Dus als de gok was c, dan is onze nieuwe schatting gaat worden aa. 99 00:06:11,431 --> 00:06:16,050 En als onze oorspronkelijke gok was cccc, dan is onze nieuwe gok 100 00:06:16,050 --> 00:06:18,380 gaat worden aaaaa. 101 00:06:18,380 --> 00:06:24,430 >> Dus wanneer we het maximale reeks te komen van een bepaalde lengte, dan zijn we 102 00:06:24,430 --> 00:06:29,090 gaan voeren om de minimale snaar van de volgende baan, die zal 103 00:06:29,090 --> 00:06:34,420 gewoon alle tekens van de minimum symbool. 104 00:06:34,420 --> 00:06:36,970 Nu, wat is deze controle hier doen? 105 00:06:36,970 --> 00:06:42,780 Nou, als index verplaatst van de achtste karakter aan de negen karakter - 106 00:06:42,780 --> 00:06:46,460 dus voeg acht c's zoals we onze vorige raad - 107 00:06:46,460 --> 00:06:51,270 vervolgens index is gaan richten op de laatste null terminator van onze gok 108 00:06:51,270 --> 00:06:57,990 array, die niet feitelijk bedoeld worden gebruikt in onze wachtwoord. 109 00:06:57,990 --> 00:07:03,530 >> Dus als we zijn gericht op die laatste null terminator, dan hebben we niet gevonden een 110 00:07:03,530 --> 00:07:07,750 wachtwoord dat geldig is met slechts acht karakters, wat betekent dat er geen 111 00:07:07,750 --> 00:07:10,550 geldig wachtwoord dat codeert de gegeven string. 112 00:07:10,550 --> 00:07:13,520 En we hebben om af te drukken dat, zeggend We konden geen geldige vinden 113 00:07:13,520 --> 00:07:16,100 wachtwoord en rendement. 114 00:07:16,100 --> 00:07:20,280 Dus dit while loop gaat herhalen over alle mogelijke snaren. 115 00:07:20,280 --> 00:07:24,640 >> Mochten er vertragingen zijn, dat codeert voor de verwacht gecodeerde tekenreeks, het zal 116 00:07:24,640 --> 00:07:26,190 keren dat wachtwoord. 117 00:07:26,190 --> 00:07:29,610 En het maakt het niets vinden, dan het zal terugkeren, drukken dat het 118 00:07:29,610 --> 00:07:31,910 was niet in staat om iets te vinden. 119 00:07:31,910 --> 00:07:39,220 Nu, merken dat itereren over alle mogelijke strings gaat waarschijnlijk 120 00:07:39,220 --> 00:07:40,420 een tijdje duren. 121 00:07:40,420 --> 00:07:43,590 Laten we eens echt zien hoe lang dat duurt. 122 00:07:43,590 --> 00:07:47,230 >> Laten we crack. 123 00:07:47,230 --> 00:07:51,050 Nou, oeps - het zegt undefined verwijzing naar crypte. 124 00:07:51,050 --> 00:07:55,330 Dus onthoud, voor de p sets spec en Ook de man pagina voor crypte dat we 125 00:07:55,330 --> 00:07:58,130 moeten verbinden in crypte. 126 00:07:58,130 --> 00:08:01,130 Nu, de standaard te maken opdracht niet weet dat je 127 00:08:01,130 --> 00:08:03,010 wil die functie te gebruiken. 128 00:08:03,010 --> 00:08:09,680 >> Dus laten we kopieer deze client commando en gewoon toe te voegen aan het einde 129 00:08:09,680 --> 00:08:13,300 ervan, het koppelen crypte. 130 00:08:13,300 --> 00:08:14,820 Nu stelt zij. 131 00:08:14,820 --> 00:08:23,880 Dus laten we draaien barst op een gegeven gecodeerde tekenreeks - 132 00:08:23,880 --> 00:08:25,130 dus Caesar. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Dus dat was vrij snel. 135 00:08:30,790 --> 00:08:33,230 >> Merk op dat deze eindigde op 13. 136 00:08:33,230 --> 00:08:38,240 Nou, gecodeerde wachtwoord van Caesar gebeurt te zijn 13. 137 00:08:38,240 --> 00:08:41,650 Dus laten we een ander wachtwoord proberen. 138 00:08:41,650 --> 00:08:45,830 Laten we eens Hirschhorns versleutelde wachtwoord en probeer het kraken dat. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Zo merken we al bereikt drie tekens. 141 00:08:55,110 --> 00:08:58,660 En we itereren over alle mogelijke drie-tekenreeksen. 142 00:08:58,660 --> 00:09:01,420 Dat betekent dat we al klaar itereren over alle mogelijke een en 143 00:09:01,420 --> 00:09:04,660 twee tekenreeksen. 144 00:09:04,660 --> 00:09:09,180 Nu, het lijkt erop dat dit gaat om een tijdje duren voordat we bij de 145 00:09:09,180 --> 00:09:10,580 vier-tekenreeksen. 146 00:09:10,580 --> 00:09:14,680 Het kan een paar minuten duren. 147 00:09:14,680 --> 00:09:16,055 >> Het duurde niet een paar minuten. 148 00:09:16,055 --> 00:09:18,450 We zijn op de vier-tekenreeksen. 149 00:09:18,450 --> 00:09:22,800 Maar nu moeten we itereren over alle mogelijk vier-tekenreeksen, die 150 00:09:22,800 --> 00:09:26,000 dat misschien zou kunnen duren 10 minuten. 151 00:09:26,000 --> 00:09:28,720 En toen we vijf character bereiken strings, moeten we itereren over alle 152 00:09:28,720 --> 00:09:31,450 van die, welke zou kunnen neem een ​​paar uur. 153 00:09:31,450 --> 00:09:34,080 En we moeten dan herhalen alle mogelijke zes-tekenreeksen, die 154 00:09:34,080 --> 00:09:36,560 een paar dagen zou duren en zo verder. 155 00:09:36,560 --> 00:09:41,380 >> Dus kon het potentieel zeer lang een tijd om over te herhalen alle mogelijke 156 00:09:41,380 --> 00:09:44,850 acht-karakter en minder snaren. 157 00:09:44,850 --> 00:09:50,600 Dus merken dat dit niet noodzakelijk een zeer efficiënt algoritme voor het vinden 158 00:09:50,600 --> 00:09:51,860 een wachtwoord. 159 00:09:51,860 --> 00:09:54,540 Je zou kunnen denken dat er zijn betere manieren. 160 00:09:54,540 --> 00:10:02,230 Bijvoorbeeld, het wachtwoord zyx! 32AB Waarschijnlijk is niet een veel voorkomende wachtwoord, 161 00:10:02,230 --> 00:10:06,440 terwijl het wachtwoord 12345 is waarschijnlijk veel vaker voor. 162 00:10:06,440 --> 00:10:13,570 >> Dus een manier om te proberen om een ​​wachtwoord te vinden sneller is om gewoon te kijken 163 00:10:13,570 --> 00:10:15,560 bij wachtwoorden die komen vaker voor. 164 00:10:15,560 --> 00:10:20,480 Dus bijvoorbeeld, kunnen we proberen om woorden te lezen uit een woordenboek en probeer alles van 165 00:10:20,480 --> 00:10:24,860 die woorden als onze paswoord gissingen. 166 00:10:24,860 --> 00:10:29,210 Nu, misschien een wachtwoord is niet zo eenvoudig. 167 00:10:29,210 --> 00:10:32,600 Misschien dat de gebruiker was enigszins slim en probeer het toevoegen van een nummer aan 168 00:10:32,600 --> 00:10:34,220 het einde van een woord. 169 00:10:34,220 --> 00:10:37,000 >> Dus misschien zijn wachtwoord was wachtwoord1. 170 00:10:37,000 --> 00:10:41,520 Zodat u kunt proberen itereren over alle woorden in het woordenboek met een 171 00:10:41,520 --> 00:10:43,210 toegevoegd aan het einde van het. 172 00:10:43,210 --> 00:10:47,360 En dan misschien na dat te doen, zul je voegt twee aan het einde ervan. 173 00:10:47,360 --> 00:10:50,240 >> Of misschien de gebruiker probeert om zelfs slimmer, en ze willen dat hun 174 00:10:50,240 --> 00:10:54,980 vergeten te worden "hacker", maar ze zijn gaat om alle exemplaren van e's vervangen 175 00:10:54,980 --> 00:10:56,600 met drieën. 176 00:10:56,600 --> 00:10:58,440 Dus je kan dit ook doen. 177 00:10:58,440 --> 00:11:02,100 Itereren over alle woorden in het woordenboek maar vervang tekens die 178 00:11:02,100 --> 00:11:04,790 getallen lijken met die nummers. 179 00:11:04,790 --> 00:11:09,670 >> Dus op deze manier, zou je nog meer te vangen wachtwoorden die zijn vrij normaal. 180 00:11:09,670 --> 00:11:14,690 Maar op het einde, de enige manier waarop je kunt vangen alle wachtwoorden is te bruut 181 00:11:14,690 --> 00:11:17,340 dwingen itereren over alle mogelijk strings. 182 00:11:17,340 --> 00:11:22,100 Dus in het einde, heb je nodig om te herhalen over alle snaren van het ene personage naar 183 00:11:22,100 --> 00:11:28,110 acht tekens, die zou kunnen nemen een zeer lange tijd, maar je moet om het te doen. 184 00:11:28,110 --> 00:11:30,024 >> Mijn naam is Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 En dit is Crack. 186 00:11:31,425 --> 00:11:36,533