Возьми ее силой! Диман Dr.X (xdiman@mail.ru) Xakep, номер #064, стр. 064-114-1 Различные алгоритмы последовательного перебора Бродя по интернету в поисках хакерского софта, очень часто находишь различные программы для подбора паролей к архивам, определенным сервисам (FTP, POP3, ICQ), для SAM и PWL, для вскрытия алгоритмов шифрования (John The Ripper) и т.д. В основе большинства из них лежат два основных способа брутфорса: перебор всех возможных вариантов или подбор паролей по словарю. Я постарался сделать краткий обзор алгоритмов для первого способа, наиболее часто применяемых в вышеописанных типах программ. Кодить мы будем, как ты уже понял, на С++ из-за его быстроты, но ты сможешь легко реализовать эти методы и на других языках программирования. Нашей целью сегодня будет создание модуля, содержащего четыре алгоритма перебора, который ты затем сможешь использовать в своих программах. Плюсы и минусы последовательного перебора Сейчас перебор приобретает все большую актуальность. Легко понять, почему: словарный метод подбора пароля давно устарел и морально, и физически. Ясно, что любой юзер наслышан об атаках хакеров и ставит не простой пароль, а сгенерированный специальной программой, типа 4!@78$yu. Я не буду принимать в расчет недостатки последовательного перебора, такие как использование на атакуемой системе авторизации модуля GD для динамического генерирования цифр на картинках, блокировка входа под определенным IP и т.д. Неизвестно, как ты применишь наш модуль. Поэтому в моем случае единственный, но самый весомый недостаток перебора паролей - время. Ну хватит об этом, загружай свой любимый редактор с подсветкой синтаксиса С++, и приступим к созданию нашего универсального модуля. Старый добрый for... Ты уже, наверно, догадался, о каком алгоритме идет речь. Да, это заслуженно всеми забытый алгоритм вложенных циклов. Естественно, его нельзя использовать в серьезных программах из-за громоздкости и, как следствие, ограничения максимальной длины пароля. Мы попробуем этот алгоритм модифицировать. Вспомни: в пароле могут присутствовать и цифры, и даже специальные символы. Организовать такую генерацию с помощью циклов по ASCII-кодам не удастся. Как же быть? Попробуем в начале программы ввести пользовательский набор знаков, т.е. именно те знаки, из которых может быть составлен пароль: char stroke[256]; cin >> stroke; К примеру, если в пассворде могут использоваться заглавные латинские буквы и цифры, то следует ввести такую строку: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 А циклы тогда организуем не по ASCII кодам букв, а от 1 до длины введенной строки. В этом случае выводить символы мы будем не с помощью явного преобразования, а обращением к массиву со счетчиком в качестве индекса: cout << stroke[a]; cout << stroke[b]; cout << stroke[c]; cout << '\n'; a, b, c - это счетчики вложенных циклов. Но представь себе, каким будет код, если необходимо перебрать все пароли длиной, скажем, 13 символов? А если больше? Теперь понятна причина невозможности использования такого алгоритма для серьезных целей. Естественно, нужно искать другое решение. И оно было найдено, а суть его в использовании комбинаторных алгоритмов. Изучает же их наука комбинаторика. |