1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB Bowden: Jaz sem Rob in greva se pokanje. 3 00:00:15,890 --> 00:00:19,390 Torej, ne pozabite na pset spec, da bomo potrebovali za uporabo 4 00:00:19,390 --> 00:00:20,890 grobnica funkcijo. 5 00:00:20,890 --> 00:00:26,330 Na strani človeka, imamo dve hash opredeliti _xopensource. 6 00:00:26,330 --> 00:00:28,290 Ne skrbite o tem, zakaj moramo to storiti. 7 00:00:28,290 --> 00:00:31,550 In tudi hash vključujejo unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Torej, ko je to s poti, dajmo pridemo do pravega programa. 9 00:00:35,920 --> 00:00:39,570 Prva stvar, ki jo morate storiti je, se prepričajte uporabnik vnese veljavno šifrirana 10 00:00:39,570 --> 00:00:41,520 geslo v ukazni vrstici. 11 00:00:41,520 --> 00:00:46,050 Ne pozabite, da naj bi program , ki se vodijo kot dot slash razpoke in 12 00:00:46,050 --> 00:00:48,120 nato zakodiran niz. 13 00:00:48,120 --> 00:00:52,990 >> Tako da tukaj smo preverimo, da argc do dveh, če želimo 14 00:00:52,990 --> 00:00:54,380 nadaljevati s programom. 15 00:00:54,380 --> 00:00:58,830 Če argc ne dva, kar pomeni, da bodisi Uporabnik ni stopil šifriran 16 00:00:58,830 --> 00:01:02,560 geslo v ukazni vrstici, ali pa vnese več kot le šifrirana 17 00:01:02,560 --> 00:01:05,379 geslo v ukazni vrstici, v katerem tako da ne vemo, kaj storiti z 18 00:01:05,379 --> 00:01:07,660 argumenti v ukazni vrstici. 19 00:01:07,660 --> 00:01:11,390 >> Torej, če je argc dva, lahko nadaljujemo. 20 00:01:11,390 --> 00:01:14,160 In tu, gremo prijaviti spremenljivka šifrirano. 21 00:01:14,160 --> 00:01:17,650 To je le, da bo alias izvirnih argv1 tako, da je ves ta 22 00:01:17,650 --> 00:01:20,690 Program, nimamo, da ga pokličete argv1, ki potem moraš razmišljati 23 00:01:20,690 --> 00:01:22,950 o tem, kaj to dejansko pomeni. 24 00:01:22,950 --> 00:01:27,180 >> Torej, na koncu pa želimo potrditi, da šifrirano geslo uporabnika 25 00:01:27,180 --> 00:01:30,840 začel bi dejansko šifrirano geslo. 26 00:01:30,840 --> 00:01:35,120 Na strani človeka v grobnici, v šifrirano geslo mora biti 13 27 00:01:35,120 --> 00:01:36,440 znakov. 28 00:01:36,440 --> 00:01:41,500 Tu gor, opazite, da smo hash opredeljen šifriranje dolžino kot 13 let. 29 00:01:41,500 --> 00:01:46,140 Tako da smo samo pazite, da Niz dolžina šifriran 30 00:01:46,140 --> 00:01:49,090 Geslo je 13. 31 00:01:49,090 --> 00:01:52,280 >> In če ni, želimo za izhod iz programa. 32 00:01:52,280 --> 00:01:56,470 Torej, ko je to s poti, smo lahko zdaj dejansko poskusite najti tisto, kar 33 00:01:56,470 --> 00:02:00,410 geslo, ki je šifriran geslo je bilo. 34 00:02:00,410 --> 00:02:04,870 Tukaj želimo, da zgrabite sol iz šifriranega gesla. 35 00:02:04,870 --> 00:02:08,930 Zapomni si, na strani človeka, ki Prvi dve znakov šifriran 36 00:02:08,930 --> 00:02:10,590 string, kot tukaj - 37 00:02:10,590 --> 00:02:12,770 50ZPJ in tako naprej - 38 00:02:12,770 --> 00:02:16,170 prva dva znaka daje nam sol, ki je bila uporabljena 39 00:02:16,170 --> 00:02:18,080 v kripti funkcijo. 40 00:02:18,080 --> 00:02:21,740 >> In tukaj vidimo, da je sol ha. 41 00:02:21,740 --> 00:02:27,610 Zato želimo, da bi kopirali prva dva znakov, dolžina sol pa hašiš 42 00:02:27,610 --> 00:02:30,230 opredeljena kot dve. 43 00:02:30,230 --> 00:02:35,970 Imamo kopirati prvih dveh znakov v tem polju, sol. 44 00:02:35,970 --> 00:02:39,340 Obvestilo, da moramo dolžine soli plus ena, saj še vedno potrebujemo nično 45 00:02:39,340 --> 00:02:42,440 terminator na koncu našega soli. 46 00:02:42,440 --> 00:02:46,940 >> Potem bomo razglasi, da ta niz, gost, od velikosti dolžine max plus 47 00:02:46,940 --> 00:02:51,930 ena, kjer je maksimalna dolžina hash opredeljen kot osem, saj največja geslo 48 00:02:51,930 --> 00:02:55,090 je dolga osem znakov. 49 00:02:55,090 --> 00:02:59,860 In bomo to uporabimo za ponovitev preko vseh možnih nizov, ki bi lahko 50 00:02:59,860 --> 00:03:01,430 biti veljavni gesla. 51 00:03:01,430 --> 00:03:07,720 Torej, če se veljavni znaki v geslu so le, b in c, nato 52 00:03:07,720 --> 00:03:14,970 želimo ponoviti čez, B, C, aa, ba, ca, in tako dalje, dokler 53 00:03:14,970 --> 00:03:16,690 smo dobili za prikaz cccccccc - 54 00:03:16,690 --> 00:03:19,600 osem C je. 55 00:03:19,600 --> 00:03:23,620 >> In če nimamo dol veljavna geslo, potem moramo reči, da 56 00:03:23,620 --> 00:03:26,590 zakodiran niz ni velja za začetek. 57 00:03:26,590 --> 00:03:29,970 Torej, zdaj smo dosegli ta pa 1. zanka. 58 00:03:29,970 --> 00:03:33,100 Obvestilo, da pomeni, da je neskončna zanka. 59 00:03:33,100 --> 00:03:36,430 >> Obvestilo ne obstajajo odmor izjavo znotraj te neskončno zanko. 60 00:03:36,430 --> 00:03:38,570 Tam se vrne le izjave. 61 00:03:38,570 --> 00:03:41,210 Tako smo dejansko nikoli ni pričakovati Za izhod iz zanke. 62 00:03:41,210 --> 00:03:44,750 Mi samo pričakujejo, da zapustite program. 63 00:03:44,750 --> 00:03:48,220 Sem dodal ta tiskanja izjavo vrhu te zanke za samo natisnete 64 00:03:48,220 --> 00:03:51,790 kakšna je naša trenutna ugibati na kaj je geslo. 65 00:03:51,790 --> 00:03:53,630 >> Zdaj, kaj je to zanka počne? 66 00:03:53,630 --> 00:03:58,330 To je zanka preko vseh možnih nizov da bi se lahko veljavni gesel. 67 00:03:58,330 --> 00:04:02,700 Prva stvar, ki jo boš naredil, je da naš sedanji ugibati, za kaj 68 00:04:02,700 --> 00:04:03,920 geslo. 69 00:04:03,920 --> 00:04:07,230 Mi bomo sol, ki smo zgrabil od zakodiran niz, in smo 70 00:04:07,230 --> 00:04:09,850 gre za šifriranje ugibati. 71 00:04:09,850 --> 00:04:14,760 To nam bo dalo šifrirano ugibati, kar bomo primerjajo 72 00:04:14,760 --> 00:04:18,810 šifrirani niz, ki uporabniku vpisana v ukazni vrstici. 73 00:04:18,810 --> 00:04:23,030 >> Če sta enaka, pri čemer Niz primerljiv bo vrnil nič, če 74 00:04:23,030 --> 00:04:28,050 oni enako, verjetno je bila geslo, ki ustvari šifriran 75 00:04:28,050 --> 00:04:33,520 niz, v tem primeru lahko tiskamo da je naše geslo in nazaj. 76 00:04:33,520 --> 00:04:37,520 Toda, če niso bile enake, da pomeni naša domneva bila pravilna. 77 00:04:37,520 --> 00:04:43,250 >> In želimo ponoviti, da Naslednji velja ugibanje. 78 00:04:43,250 --> 00:04:46,410 Torej, to je to, medtem ko zanka poskuša narediti. 79 00:04:46,410 --> 00:04:51,760 To bo ponovitev naše ugibanje na naslednjo veljavno ugibati. 80 00:04:51,760 --> 00:04:56,080 Obvestilo, da ko smo rekli, da je zlasti lik v naše ugibanje je 81 00:04:56,080 --> 00:05:01,770 Dosegli simbol max, ki tu gor je razpršilna opredeljen kot tildo, saj 82 00:05:01,770 --> 00:05:05,710 To je največji znak ASCII vrednost da lahko uporabnik vnese na 83 00:05:05,710 --> 00:05:11,210 tipkovnico, ko doseže učinek max simbol, nato pa želimo poslati 84 00:05:11,210 --> 00:05:17,150 nazaj na najnižjo simbol, ki je prostor, spet najnižja ASCII 85 00:05:17,150 --> 00:05:20,800 simbol vrednost, ki jo lahko uporabnik vnesite na tipkovnici. 86 00:05:20,800 --> 00:05:22,940 >> Torej bomo nastavite, da na najmanjšo simbol. 87 00:05:22,940 --> 00:05:25,720 In potem smo šli na naslednji znak. 88 00:05:25,720 --> 00:05:28,730 Torej, kako so naši ugibanj bo ponovitev? 89 00:05:28,730 --> 00:05:33,685 No, če veljavni znaki so a, b, in c, potem, če smo začeli, 90 00:05:33,685 --> 00:05:36,630 to bo ponovitev na b, da bomo Ponovil do c. 91 00:05:36,630 --> 00:05:44,360 c max je naš simbol, tako da bomo določili c nazaj, minimalno simbol. 92 00:05:44,360 --> 00:05:48,100 In potem bomo Ponovil indeks na naslednji znak. 93 00:05:48,100 --> 00:05:53,920 >> Torej, če je prvotna domneva c, naslednji lik se bo nična 94 00:05:53,920 --> 00:05:55,560 terminator. 95 00:05:55,560 --> 00:06:00,670 Dol, opazil, da če znak da hočemo sedaj 96 00:06:00,670 --> 00:06:04,690 prirastek je bil null terminator, potem bomo jo nastavite na 97 00:06:04,690 --> 00:06:06,260 Najmanjša simbol. 98 00:06:06,260 --> 00:06:11,431 Torej, če je bilo ugibanje c, potem je naša Nova ugibati se bo aa. 99 00:06:11,431 --> 00:06:16,050 In če je bil naš prvotni guess cccc, potem je naša nova ugibanje 100 00:06:16,050 --> 00:06:18,380 se bo AAAAA. 101 00:06:18,380 --> 00:06:24,430 >> Torej, ko smo dosegli najvišjo niz za dano dolžino, potem smo 102 00:06:24,430 --> 00:06:29,090 gre za izvajanje na najmanjšo niz v naslednjem dolžine, ki bo 103 00:06:29,090 --> 00:06:34,420 samo se vsi znaki minimalna simbol. 104 00:06:34,420 --> 00:06:36,970 Zdaj, kaj je to preverjanje delaš tukaj? 105 00:06:36,970 --> 00:06:42,780 No, če je indeks preselil iz osmega znak devetih značaja - 106 00:06:42,780 --> 00:06:46,460 zato smo dodali osem C je kot naša prejšnja ugibati - 107 00:06:46,460 --> 00:06:51,270 Nato indeks se bo osredotočil na Zadnji null terminator naše ugibanje 108 00:06:51,270 --> 00:06:57,990 matrika, ki ni predviden za dejansko uporablja v naši geslo. 109 00:06:57,990 --> 00:07:03,530 >> Torej, če smo osredotočeni na to zadnjo null terminator, potem nismo našli 110 00:07:03,530 --> 00:07:07,750 geslo, ki je veljavna uporabo samo osem znakov, kar pomeni, da ni 111 00:07:07,750 --> 00:07:10,550 veljavno geslo, ki šifrira v določenem nizu. 112 00:07:10,550 --> 00:07:13,520 In imamo natisniti, da je pravi nismo mogli najti veljavno 113 00:07:13,520 --> 00:07:16,100 geslo in donosnost. 114 00:07:16,100 --> 00:07:20,280 Torej, to zanko, medtem ko se bo Ponovil preko vseh možnih nizov. 115 00:07:20,280 --> 00:07:24,640 >> Če ugotovi, da je katera koli šifrira da Pričakuje zakodiran niz, se bo 116 00:07:24,640 --> 00:07:26,190 vrniti to geslo. 117 00:07:26,190 --> 00:07:29,610 In to ne zdi nič, potem da se bo vrnil, tiskanje, da je 118 00:07:29,610 --> 00:07:31,910 ni mogel najti ničesar. 119 00:07:31,910 --> 00:07:39,220 Zdaj, opazili, da ponavljanjem čez vse možne strune je verjetno bo 120 00:07:39,220 --> 00:07:40,420 traja nekaj časa. 121 00:07:40,420 --> 00:07:43,590 Oglejmo dejansko videli, kako dolgo, da traja. 122 00:07:43,590 --> 00:07:47,230 >> Naredimo razpoko. 123 00:07:47,230 --> 00:07:51,050 No, ojej - pravi nedefinirano sklicevanje na grobnico. 124 00:07:51,050 --> 00:07:55,330 Torej, ne pozabite, za p določa spec in tudi stran man za grobnico, ki smo 125 00:07:55,330 --> 00:07:58,130 treba povezati v grobnici. 126 00:07:58,130 --> 00:08:01,130 Sedaj privzeta da ukaz ne veš, da si 127 00:08:01,130 --> 00:08:03,010 želite uporabljati to funkcijo. 128 00:08:03,010 --> 00:08:09,680 >> Torej, kaj je kopirati ta ukaz odjemalca in le dodamo na konec 129 00:08:09,680 --> 00:08:13,300 njega, ki povezuje grobnica. 130 00:08:13,300 --> 00:08:14,820 Zdaj se pripravlja. 131 00:08:14,820 --> 00:08:23,880 Torej, kaj je zagon razpoko na dana zakodiran niz - 132 00:08:23,880 --> 00:08:25,130 tako cesarjevega. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Tako da je bilo precej hitro. 135 00:08:30,790 --> 00:08:33,230 >> Obvestilo, da je ta končala na 13.. 136 00:08:33,230 --> 00:08:38,240 No, cesarjevega šifrirano geslo zgodi, da bo 13. 137 00:08:38,240 --> 00:08:41,650 Torej poskusimo drugo geslo. 138 00:08:41,650 --> 00:08:45,830 Oglejmo Hirschhorna je šifriran geslo in poskusite, da pokanje. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Tako opazili, da smo že dosegli tri znake. 141 00:08:55,110 --> 00:08:58,660 In smo ponavljanjem čez vse mogoče tri nize znakov. 142 00:08:58,660 --> 00:09:01,420 To pomeni, da smo že globoko ponavljanjem nad vso možno eno in 143 00:09:01,420 --> 00:09:04,660 dveh nizov znakov. 144 00:09:04,660 --> 00:09:09,180 Zdaj pa izgleda, da se bo to bo trajalo nekaj časa, preden smo dosegli 145 00:09:09,180 --> 00:09:10,580 štiri nize znakov. 146 00:09:10,580 --> 00:09:14,680 To lahko traja nekaj minut. 147 00:09:14,680 --> 00:09:16,055 >> Ni trajalo nekaj minut. 148 00:09:16,055 --> 00:09:18,450 Smo na strune v štirimestnih. 149 00:09:18,450 --> 00:09:22,800 Toda zdaj se moramo ponoviti čez vse možne strune štirih znakov, ki 150 00:09:22,800 --> 00:09:26,000 da bi morda traja 10 minut. 151 00:09:26,000 --> 00:09:28,720 In potem, ko smo dosegli pet značaja strune, moramo ponoviti čez vse 152 00:09:28,720 --> 00:09:31,450 tistih, ki bi lahko traja nekaj ur. 153 00:09:31,450 --> 00:09:34,080 In to moramo ponoviti čez vse mogoče šest-mestno strune, ki 154 00:09:34,080 --> 00:09:36,560 lahko traja nekaj dni in tako naprej. 155 00:09:36,560 --> 00:09:41,380 >> Torej bi lahko trajalo potencialno zelo dolgo Čas za ponovitev čez vse mogoče 156 00:09:41,380 --> 00:09:44,850 osem znakov in manj strune. 157 00:09:44,850 --> 00:09:50,600 Tako opazili, da to ni nujno Zelo učinkovit algoritem za iskanje 158 00:09:50,600 --> 00:09:51,860 geslo. 159 00:09:51,860 --> 00:09:54,540 Morda si mislite, da obstaja so boljši načini. 160 00:09:54,540 --> 00:10:02,230 Na primer, geslo ZYX! 32ab verjetno ni zelo pogosti geslo 161 00:10:02,230 --> 00:10:06,440 ker geslo je 12345 Verjetno veliko bolj pogosti. 162 00:10:06,440 --> 00:10:13,570 >> Torej en način poskuša najti geslo hitreje je, da samo poglej 163 00:10:13,570 --> 00:10:15,560 ob gesel, ki so bolj pogosti. 164 00:10:15,560 --> 00:10:20,480 Tako na primer, lahko poskusite prebrati besede iz slovarja in preizkusite vse 165 00:10:20,480 --> 00:10:24,860 te besede so naše geslo ugibanja. 166 00:10:24,860 --> 00:10:29,210 Zdaj, morda geslo ni tako preprosto. 167 00:10:29,210 --> 00:10:32,600 Mogoče si je nekoliko pameten in poskusite vstavljanje številke 168 00:10:32,600 --> 00:10:34,220 konec besede. 169 00:10:34,220 --> 00:10:37,000 >> Mogoče je bilo njihovo geslo password1. 170 00:10:37,000 --> 00:10:41,520 Torej, lahko poskusite ponavljanjem čez vse besede v slovarju z enim 171 00:10:41,520 --> 00:10:43,210 dodan na konec tega. 172 00:10:43,210 --> 00:10:47,360 In potem morda po tem, da boste dodajanje dveh do konca tega. 173 00:10:47,360 --> 00:10:50,240 >> Ali pa si skuša biti še bolj pameten, in želijo svoje 174 00:10:50,240 --> 00:10:54,980 geslo za "hacker", ampak oni bo nadomestil vse primerke e, je 175 00:10:54,980 --> 00:10:56,600 s trojkama. 176 00:10:56,600 --> 00:10:58,440 Torej, lahko to storite tudi. 177 00:10:58,440 --> 00:11:02,100 Ponovil preko vseh besed v slovarju ampak namesto znakov, da 178 00:11:02,100 --> 00:11:04,790 izgledal številk s temi številkami. 179 00:11:04,790 --> 00:11:09,670 >> Torej ta način, bi lahko ujeli še več Gesla, ki so precej pogosti. 180 00:11:09,670 --> 00:11:14,690 Toda na koncu je edini način, da lahko zajame vsa gesla, je brute 181 00:11:14,690 --> 00:11:17,340 prisiliti Ponovil čez vse možne strune. 182 00:11:17,340 --> 00:11:22,100 Torej, na koncu ne boste morali ponoviti čez vse strune iz enega znaka 183 00:11:22,100 --> 00:11:28,110 osem znakov, ki lahko traja zelo dolgo časa, vendar morate to storiti. 184 00:11:28,110 --> 00:11:30,024 >> Moje ime je Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 In to je Crack. 186 00:11:31,425 --> 00:11:36,533