1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB Bowden: Saya Rob, dan mari kita retak. 3 00:00:15,890 --> 00:00:19,390 Jadi ingat dari spec yang pset kita akan perlu menggunakan 4 00:00:19,390 --> 00:00:20,890 fungsi crypt. 5 00:00:20,890 --> 00:00:26,330 Untuk halaman manual, kita memiliki dua hash mendefinisikan _xopensource. 6 00:00:26,330 --> 00:00:28,290 Jangan khawatir tentang mengapa kita perlu melakukan itu. 7 00:00:28,290 --> 00:00:31,550 Dan juga hash termasuk unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Jadi sekali itu keluar dari jalan, mari kita sampai ke program yang sebenarnya. 9 00:00:35,920 --> 00:00:39,570 Hal pertama yang perlu kita lakukan adalah memastikan pengguna memasuki dienkripsi valid 10 00:00:39,570 --> 00:00:41,520 password pada baris perintah. 11 00:00:41,520 --> 00:00:46,050 Ingat bahwa program ini seharusnya dijalankan seperti dot slash retak, dan 12 00:00:46,050 --> 00:00:48,120 kemudian dienkripsi tali. 13 00:00:48,120 --> 00:00:52,990 >> Jadi di sini kita memeriksa untuk memastikan bahwa argc dua jika kita ingin 14 00:00:52,990 --> 00:00:54,380 melanjutkan program. 15 00:00:54,380 --> 00:00:58,830 Jika argc tidak dua, artinya baik pengguna tidak memasukkan terenkripsi 16 00:00:58,830 --> 00:01:02,560 password pada baris perintah, atau mereka memasuki lebih dari sekadar dienkripsi 17 00:01:02,560 --> 00:01:05,379 password pada baris perintah, di mana kalau kita tidak tahu apa yang harus dilakukan dengan 18 00:01:05,379 --> 00:01:07,660 argumen baris perintah. 19 00:01:07,660 --> 00:01:11,390 >> Jadi jika argc dua, kita dapat melanjutkan. 20 00:01:11,390 --> 00:01:14,160 Dan di sini, kita akan mendeklarasikan variabel terenkripsi. 21 00:01:14,160 --> 00:01:17,650 Itu hanya akan alias asli argv1 sehingga seluruh ini 22 00:01:17,650 --> 00:01:20,690 Program, kita tidak harus menyebutnya argv1, yang kemudian Anda harus berpikir 23 00:01:20,690 --> 00:01:22,950 tentang apa yang benar-benar berarti. 24 00:01:22,950 --> 00:01:27,180 >> Jadi akhirnya, kami ingin memvalidasi bahwa password terenkripsi pengguna 25 00:01:27,180 --> 00:01:30,840 masuk bisa benar-benar telah password terenkripsi. 26 00:01:30,840 --> 00:01:35,120 Per halaman manual dari crypt, yang password terenkripsi harus 13 27 00:01:35,120 --> 00:01:36,440 karakter. 28 00:01:36,440 --> 00:01:41,500 Sampai di sini, kita melihat bahwa hash didefinisikan mengenkripsi panjang sebagai 13. 29 00:01:41,500 --> 00:01:46,140 Jadi kita hanya memastikan bahwa panjang string terenkripsi 30 00:01:46,140 --> 00:01:49,090 password 13. 31 00:01:49,090 --> 00:01:52,280 >> Dan jika tidak, kami ingin untuk keluar dari program. 32 00:01:52,280 --> 00:01:56,470 Jadi sekali itu keluar dari jalan, kita bisa sekarang benar-benar mencoba untuk menemukan apa yang 33 00:01:56,470 --> 00:02:00,410 password yang memberikan terenkripsi sandi itu. 34 00:02:00,410 --> 00:02:04,870 Di sini, kami ingin mengambil garam dari password terenkripsi. 35 00:02:04,870 --> 00:02:08,930 Ingat, per halaman manual, yang dua karakter pertama dari terenkripsi 36 00:02:08,930 --> 00:02:10,590 String, seperti di sini - 37 00:02:10,590 --> 00:02:12,770 50ZPJ dan sebagainya - 38 00:02:12,770 --> 00:02:16,170 dua karakter pertama memberikan kita garam yang digunakan 39 00:02:16,170 --> 00:02:18,080 dalam fungsi crypt. 40 00:02:18,080 --> 00:02:21,740 >> Dan di sini, kita melihat bahwa garam itu ha. 41 00:02:21,740 --> 00:02:27,610 Jadi kami ingin menyalin dua yang pertama karakter, panjang garam yang hash 42 00:02:27,610 --> 00:02:30,230 didefinisikan sebagai dua. 43 00:02:30,230 --> 00:02:35,970 Kami harus menyalin dua karakter pertama ke dalam array ini, garam. 44 00:02:35,970 --> 00:02:39,340 Perhatikan bahwa kita perlu panjang garam ditambah satu, karena kita masih perlu null 45 00:02:39,340 --> 00:02:42,440 terminator pada akhir garam kami. 46 00:02:42,440 --> 00:02:46,940 >> Kemudian kita akan mendeklarasikan array ini, tamu, ukuran panjang max plus 47 00:02:46,940 --> 00:02:51,930 satu, di mana panjang max hash didefinisikan delapan, karena password maksimum 48 00:02:51,930 --> 00:02:55,090 adalah delapan karakter. 49 00:02:55,090 --> 00:02:59,860 Dan kita akan menggunakan ini untuk iterate atas semua string kemungkinan yang bisa 50 00:02:59,860 --> 00:03:01,430 menjadi password yang valid. 51 00:03:01,430 --> 00:03:07,720 Jadi jika karakter yang valid untuk password hanya a, b, dan c, maka 52 00:03:07,720 --> 00:03:14,970 kami akan iterate atas a, b, c, aa, ba, ca, dan seterusnya, sampai 53 00:03:14,970 --> 00:03:16,690 kita bisa melihat cccccccc - 54 00:03:16,690 --> 00:03:19,600 delapan c itu. 55 00:03:19,600 --> 00:03:23,620 >> Dan jika kita belum menyusuri valid password, maka kita perlu mengatakan bahwa 56 00:03:23,620 --> 00:03:26,590 string terenkripsi tidak valid untuk memulai. 57 00:03:26,590 --> 00:03:29,970 Jadi sekarang, kita mencapai ini sementara 1 lingkaran. 58 00:03:29,970 --> 00:03:33,100 Perhatikan bahwa berarti itu infinite loop. 59 00:03:33,100 --> 00:03:36,430 >> Perhatikan tidak ada pernyataan break dalam lingkaran ini tak terbatas. 60 00:03:36,430 --> 00:03:38,570 Ada hanya kembali pernyataan. 61 00:03:38,570 --> 00:03:41,210 Jadi kita tidak pernah benar-benar berharap untuk keluar dari loop. 62 00:03:41,210 --> 00:03:44,750 Kami hanya berharap untuk keluar dari program. 63 00:03:44,750 --> 00:03:48,220 Saya telah menambahkan cetak ini pernyataan kepada atas lingkaran ini hanya mencetak 64 00:03:48,220 --> 00:03:51,790 apa tebakan kami saat ini di apa password. 65 00:03:51,790 --> 00:03:53,630 >> Sekarang, apa yang lingkaran ini lakukan? 66 00:03:53,630 --> 00:03:58,330 Ini perulangan atas semua string mungkin yang bisa menjadi password yang valid. 67 00:03:58,330 --> 00:04:02,700 Hal pertama yang akan kita lakukan adalah mengambil menebak kami saat ini untuk apa 68 00:04:02,700 --> 00:04:03,920 password. 69 00:04:03,920 --> 00:04:07,230 Kami akan mengambil garam yang kita meraih dari string terenkripsi, dan kami 70 00:04:07,230 --> 00:04:09,850 akan mengenkripsi menebak. 71 00:04:09,850 --> 00:04:14,760 Ini akan memberi kita menebak dienkripsi, yang akan kita membandingkan terhadap 72 00:04:14,760 --> 00:04:18,810 string terenkripsi bahwa pengguna dimasukkan pada baris perintah. 73 00:04:18,810 --> 00:04:23,030 >> Jika mereka adalah sama, dalam hal string yang sebanding akan kembali nol, jika 74 00:04:23,030 --> 00:04:28,050 mereka sama, kemudian menebak adalah password yang dihasilkan terenkripsi 75 00:04:28,050 --> 00:04:33,520 String, dalam hal ini kita dapat mencetak bahwa sebagai password dan kembali kami. 76 00:04:33,520 --> 00:04:37,520 Tapi jika mereka tidak sama, yang berarti dugaan kami salah. 77 00:04:37,520 --> 00:04:43,250 >> Dan kami ingin iterate ke menebak valid berikutnya. 78 00:04:43,250 --> 00:04:46,410 Jadi itulah yang saat ini loop coba lakukan. 79 00:04:46,410 --> 00:04:51,760 Ini akan iterate menebak kami untuk menebak valid berikutnya. 80 00:04:51,760 --> 00:04:56,080 Perhatikan bahwa ketika kita mengatakan bahwa karakter tertentu dalam menebak kami memiliki 81 00:04:56,080 --> 00:05:01,770 mencapai simbol max, yang di sini adalah hash didefinisikan sebagai tilde, karena 82 00:05:01,770 --> 00:05:05,710 itulah terbesar karakter ASCII nilai bahwa pengguna dapat masuk di 83 00:05:05,710 --> 00:05:11,210 Keyboard, ketika karakter mencapai max simbol, maka kita ingin mengirim 84 00:05:11,210 --> 00:05:17,150 itu kembali ke simbol minimum, yang adalah spasi, lagi ASCII terendah 85 00:05:17,150 --> 00:05:20,800 simbol nilai yang pengguna dapat masuk pada keyboard. 86 00:05:20,800 --> 00:05:22,940 >> Jadi kita akan mengatur bahwa ke simbol minimum. 87 00:05:22,940 --> 00:05:25,720 Dan kemudian kita akan pergi ke karakter berikutnya. 88 00:05:25,720 --> 00:05:28,730 Jadi bagaimana kita menebak akan iterate? 89 00:05:28,730 --> 00:05:33,685 Nah, jika karakter yang valid adalah a, b, dan c, maka jika kita mulai dengan, 90 00:05:33,685 --> 00:05:36,630 itu akan iterate ke b, itu akan iterate ke c. 91 00:05:36,630 --> 00:05:44,360 c adalah simbol maks kami, jadi kami akan menetapkan kembali ke c, simbol minimum. 92 00:05:44,360 --> 00:05:48,100 Dan kemudian kita akan iterate index ke karakter berikutnya. 93 00:05:48,100 --> 00:05:53,920 >> Jadi jika asal tebak adalah c, berikutnya Karakter akan menjadi nol 94 00:05:53,920 --> 00:05:55,560 terminator. 95 00:05:55,560 --> 00:06:00,670 Di sini, perhatikan bahwa jika karakter bahwa kita sekarang ingin 96 00:06:00,670 --> 00:06:04,690 kenaikan adalah null terminator, maka kita akan mengaturnya ke 97 00:06:04,690 --> 00:06:06,260 simbol minimum. 98 00:06:06,260 --> 00:06:11,431 Jadi jika tebakan itu c, maka kami Dugaan baru akan menjadi aa. 99 00:06:11,431 --> 00:06:16,050 Dan jika menebak kami asli cccc, kemudian menebak baru kami 100 00:06:16,050 --> 00:06:18,380 akan menjadi aaaaa. 101 00:06:18,380 --> 00:06:24,430 >> Jadi setiap kali kita mencapai string maksimum dengan panjang tertentu, maka kita 102 00:06:24,430 --> 00:06:29,090 akan mengimplementasikan ke string minimum dari panjang berikutnya, yang akan 103 00:06:29,090 --> 00:06:34,420 hanya menjadi semua karakter simbol minimum. 104 00:06:34,420 --> 00:06:36,970 Sekarang, apa yang cek ini lakukan di sini? 105 00:06:36,970 --> 00:06:42,780 Nah, jika indeks bergerak dari kedelapan karakter ke sembilan karakter - 106 00:06:42,780 --> 00:06:46,460 jadi kita tambahkan delapan c sebagai sebelumnya kami kira - 107 00:06:46,460 --> 00:06:51,270 maka indeks akan fokus pada terakhir nol terminator menebak kami 108 00:06:51,270 --> 00:06:57,990 array, yang tidak dimaksudkan untuk benar-benar digunakan dalam password kita. 109 00:06:57,990 --> 00:07:03,530 >> Jadi jika kita terfokus pada nol lalu terminator, maka kita belum menemukan 110 00:07:03,530 --> 00:07:07,750 sandi yang valid menggunakan hanya delapan karakter, yang berarti tidak ada 111 00:07:07,750 --> 00:07:10,550 password yang valid yang mengenkripsi dengan string yang diberikan. 112 00:07:10,550 --> 00:07:13,520 Dan kami harus mencetak itu, mengatakan kita tidak bisa menemukan valid 113 00:07:13,520 --> 00:07:16,100 password, dan kembali. 114 00:07:16,100 --> 00:07:20,280 Jadi sementara ini loop akan iterate atas semua string mungkin. 115 00:07:20,280 --> 00:07:24,640 >> Jika menemukan yang mengenkripsi ke diharapkan string terenkripsi, itu akan 116 00:07:24,640 --> 00:07:26,190 kembali sandi itu. 117 00:07:26,190 --> 00:07:29,610 Dan itu tidak menemukan apa-apa, maka itu akan kembali, mencetak bahwa 118 00:07:29,610 --> 00:07:31,910 tidak dapat menemukan apa-apa. 119 00:07:31,910 --> 00:07:39,220 Sekarang, perhatikan bahwa iterasi atas semua mungkin string mungkin akan 120 00:07:39,220 --> 00:07:40,420 memakan waktu cukup lama. 121 00:07:40,420 --> 00:07:43,590 Mari kita benar-benar melihat bagaimana panjang yang membutuhkan. 122 00:07:43,590 --> 00:07:47,230 >> Mari kita membuat retak. 123 00:07:47,230 --> 00:07:51,050 Nah, oops - itu mengatakan tidak terdefinisi referensi untuk crypt. 124 00:07:51,050 --> 00:07:55,330 Jadi ingat, untuk p set spec dan juga halaman manual untuk crypt yang kita 125 00:07:55,330 --> 00:07:58,130 perlu link di crypt. 126 00:07:58,130 --> 00:08:01,130 Sekarang, default perintah make tidak tahu bahwa Anda 127 00:08:01,130 --> 00:08:03,010 ingin menggunakan fungsi tersebut. 128 00:08:03,010 --> 00:08:09,680 >> Jadi mari kita salin ini perintah klien dan hanya menambahkan ke akhir 129 00:08:09,680 --> 00:08:13,300 itu, menghubungkan crypt. 130 00:08:13,300 --> 00:08:14,820 Sekarang, mengkompilasi. 131 00:08:14,820 --> 00:08:23,880 Jadi mari kita jalankan retak diberikan terenkripsi String - 132 00:08:23,880 --> 00:08:25,130 sehingga Caesar. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Jadi itu cukup cepat. 135 00:08:30,790 --> 00:08:33,230 >> Perhatikan bahwa ini berakhir pada tanggal 13. 136 00:08:33,230 --> 00:08:38,240 Nah, password terenkripsi Caesar terjadi menjadi 13. 137 00:08:38,240 --> 00:08:41,650 Jadi mari kita coba sandi lain. 138 00:08:41,650 --> 00:08:45,830 Mari kita Hirschhorn yang dienkripsi kata sandi dan mencoba retak itu. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Jadi perhatikan kita sudah mencapai tiga karakter. 141 00:08:55,110 --> 00:08:58,660 Dan kita iterasi semua kemungkinan tiga karakter string. 142 00:08:58,660 --> 00:09:01,420 Itu berarti kita sudah selesai iterasi atas semua kemungkinan satu dan 143 00:09:01,420 --> 00:09:04,660 dua string karakter. 144 00:09:04,660 --> 00:09:09,180 Sekarang, sepertinya ini akan diperlukan beberapa saat sebelum kita mencapai 145 00:09:09,180 --> 00:09:10,580 empat karakter string. 146 00:09:10,580 --> 00:09:14,680 Mungkin butuh beberapa menit. 147 00:09:14,680 --> 00:09:16,055 >> Tidak butuh waktu beberapa menit. 148 00:09:16,055 --> 00:09:18,450 Kita berada di string empat karakter. 149 00:09:18,450 --> 00:09:22,800 Tapi sekarang, kita perlu untuk iterate atas semua mungkin string empat karakter, yang 150 00:09:22,800 --> 00:09:26,000 yang mungkin mengambil mungkin 10 menit. 151 00:09:26,000 --> 00:09:28,720 Dan kemudian ketika kita mencapai lima karakter string, kita perlu untuk iterate atas semua 152 00:09:28,720 --> 00:09:31,450 dari mereka, yang mungkin mengambil beberapa jam. 153 00:09:31,450 --> 00:09:34,080 Dan kita perlu untuk iterate atas semua mungkin enam-string karakter, yang 154 00:09:34,080 --> 00:09:36,560 mungkin butuh beberapa hari dan seterusnya. 155 00:09:36,560 --> 00:09:41,380 >> Jadi bisa mengambil berpotensi sangat panjang waktu untuk iterate atas semua mungkin 156 00:09:41,380 --> 00:09:44,850 delapan karakter dan sedikit string. 157 00:09:44,850 --> 00:09:50,600 Jadi melihat bahwa ini tidak selalu algoritma yang sangat efisien untuk menemukan 158 00:09:50,600 --> 00:09:51,860 password. 159 00:09:51,860 --> 00:09:54,540 Anda mungkin berpikir bahwa ada cara yang lebih baik. 160 00:09:54,540 --> 00:10:02,230 Misalnya, password ZYX! 32ab mungkin bukan password yang sangat umum, 161 00:10:02,230 --> 00:10:06,440 sedangkan password adalah 12345 mungkin banyak yang lebih umum. 162 00:10:06,440 --> 00:10:13,570 >> Jadi salah satu cara untuk mencoba untuk menemukan password lebih cepat adalah untuk hanya melihat 163 00:10:13,570 --> 00:10:15,560 pada password yang lebih umum. 164 00:10:15,560 --> 00:10:20,480 Jadi misalnya, kita dapat mencoba untuk membaca kata-kata dari kamus dan mencoba semua 165 00:10:20,480 --> 00:10:24,860 kata-kata sebagai menebak password kita. 166 00:10:24,860 --> 00:10:29,210 Sekarang, mungkin password tidak sesederhana itu. 167 00:10:29,210 --> 00:10:32,600 Mungkin pengguna agak pintar dan mencoba menambahkan nomor ke 168 00:10:32,600 --> 00:10:34,220 akhir kata. 169 00:10:34,220 --> 00:10:37,000 >> Jadi mungkin password mereka adalah password1. 170 00:10:37,000 --> 00:10:41,520 Jadi Anda dapat mencoba iterasi semua kata dalam kamus dengan satu 171 00:10:41,520 --> 00:10:43,210 ditambahkan ke akhir itu. 172 00:10:43,210 --> 00:10:47,360 Dan kemudian mungkin setelah melakukan itu, Anda akan tambahkan dua sampai akhir itu. 173 00:10:47,360 --> 00:10:50,240 >> Atau mungkin pengguna mencoba untuk menjadi lebih lebih pintar, dan mereka ingin mereka 174 00:10:50,240 --> 00:10:54,980 password untuk menjadi "hacker," tapi mereka akan menggantikan semua contoh e yang 175 00:10:54,980 --> 00:10:56,600 dengan tiga. 176 00:10:56,600 --> 00:10:58,440 Jadi Anda bisa melakukannya juga. 177 00:10:58,440 --> 00:11:02,100 Iterate atas semua kata dalam kamus tapi ganti karakter yang 178 00:11:02,100 --> 00:11:04,790 terlihat seperti angka dengan angka-angka. 179 00:11:04,790 --> 00:11:09,670 >> Jadi cara ini, Anda mungkin menangkap lebih password yang cukup umum. 180 00:11:09,670 --> 00:11:14,690 Tetapi pada akhirnya, satu-satunya cara Anda bisa menangkap semua password adalah untuk brute 181 00:11:14,690 --> 00:11:17,340 memaksa iterate atas semua mungkin string. 182 00:11:17,340 --> 00:11:22,100 Jadi pada akhirnya, Anda perlu iterate atas semua string dari satu karakter ke 183 00:11:22,100 --> 00:11:28,110 delapan karakter, yang mungkin mengambil waktu yang sangat lama, tetapi Anda harus melakukannya. 184 00:11:28,110 --> 00:11:30,024 >> Nama saya Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 Dan ini adalah Crack. 186 00:11:31,425 --> 00:11:36,533