ТЕХНИКА СЕТЕВЫХ АТАК
Шрифт:
· while ((++pswd[p])»MAX_VAL) pswd[p++]=MIN_VAL;p=0;
Такая конструкция скрывает рекурсию, и тот же алгоритм в рекурсивной форме записи может выглядеть так:
· void GetNextPasswd(char pswd, int p) · { · pswd[p]++; · if (!(pswd[p]»MAX_VAL)) return; · pswd[p]=MIN_VAL; · Count(pswd,++p); ·}Но если MIN_VAL отлично от нуля, то в программу приходится добавлять пару строк, инициализирующих значение очередной ячейки, например, это может выглядеть так:
· if (!pswd[p]) · { · pswd[p]=' '; · pswd[p+1]=0; ·}Другое решение заключается в предварительной инициализации всех ячеек значением MIN_VAL-1. Однако потом придется «вручную» вычислять длину пароля и внедрять завершающий строку нуль (если программа написана на языке Си).
Результат работы программы может выглядеть, например, так (все полученные пароли выводятся на экран, на практике же они передаются процедуре наподобие Crypt):
· " # $ % amp; ' * +, - ·. / 0 1 2 3 4 5 6 7 8 9 ·:; «=»? @ A B C D E · F G H I J K L M N O P Q · R S T U V W X Y Z [\] · ^ _ ` a b c d e f g h i · j k l m n o p q r s t u · v w x y z!! "! #! $! %! amp;! '! · (!)! *! +!,!– !.! /! 0! 1! 2! 3! · 4! 5! 6! 7! 8! 9!:!;! «! =!»!?! · @! A! B! C! D! E! F! G! H! I! J! K! · L! M! N! O! P! Q! R! S! T! U! V!…
В данном случае львиная доля процессорного времени тратится на вывод строк на экран, но при реальном подборе пароля, быстродействием переборщика не всегда удается пренебречь, поэтому имеет смысл переписать программу на ассемблер.
Частично оптимизированный вариант [338] (т.е. без учета особенностей исполнения кода процессорами семейства Intel 80x86) может выглядеть так (на диске, прилагаемом к книге, он находится в файле “/SRC/gen.pswd.simple.asm.c”):
· #include «stdio.h» · #include «memory.h» · · main · { · int p=0; · char pswd[10]; // Буфер для генерации паролей · memset( amp;pswd[0],0,10); // Иницилизация буфера · pswd[0]='!'; // Начальный пароль · · · __asm{ ·; Загрузка в регистр EAX указателя на буфер паролей · LEA EAX,pswd; ·; Сохранение регистра EAX в стеке · PUSH EAX · Begin: ·} · · // В этом месте должен быть расположен код обработки пароля · // в данном случае очередной пароль выводится на экран · printf("%s\n", amp;pswd[0]); · · __asm{ · POP EAX; Восстановление регистра EAX · PUSH EAX; И снова - сохранение! · INC [EAX]; ++pswd[p] · CMP Byte ptr [EAX],'z'; if (pswd[p]»'z') go to Check · JBE Begin; Очередной пароль · · // Проверка на перенос (и выполнение переноса) · Check: · MOV Byte ptr [EAX],'!'; pswd[p]='!' · INC EAX; p++ · CMP Byte ptr [EAX],0; if (!pswd[p]) go to Ok · JNZ Ok; Это не крайний символ · MOV Byte ptr [EAX],'!'; pswd[p]=0 · POP EAX; p=0 · PUSH EAX; Восстановление (сохранение) EAX · JMP Begin · Ok: · INC Byte ptr [EAX]; ++pswd[p] · CMP byte ptr [EAX],'z'; if (pswd[p]»'z') go to Check · JA Check · POP EAX; p=0 · PUSH EAX; Восстановление (сохранение) EAX · JMP Begin ·} · ·} · Исходный текст NR.PL · @ECHO off · perl -x -S "%0" · goto end · #!perl · #line 6 · print "TCP SpyServer Version 2.0 Copyright (c) 2000 Kris Kaspersky\n"; · · #Клиент\серверный шпион · use Socket; · · #Настойки по умолчанию · $local_port = 110; · $remote_port = 110; · $server = 'mail.aport.ru'; · · #Попытка взятия настоек из файла · if (open(FH,"tcpspy")) · { · $local_port=«FH»; · $local_port =~ s/\n//; · $remote_port=«FH»; · $remote_port =~ s/\n//; · $server=«FH»; · $server=~ s/\n//; ·} · · print "Порт локального сервера \t[$local_port]:"; · $tmp=«»; $tmp=~ s/\n//;if ($tmp»0) {$local_port=$tmp;} · · print "Порт удаленного сервера \t[$remote_port]:"; · $tmp=«»; $tmp=~ s/\n//;if ($tmp»0) {$remote_port=$tmp;} · · print "Адрес сервера (none нет) \t[$server]"; · $tmp=«»; $tmp=~s/\n//; · if (length($tmp)) {$server=$tmp} · · #Сохраняем настойки в файле · if (open(FH,"»tcpspy")) · { · print FH "$local_port\n"; · print FH "$remote_port\n"; · print FH "$server\n"; ·} · close (FH); · · # 666 - особый код для Эхо-сервера · if ($server=~/none/) {$server=666;} · · #Создаем сокет для локального сервера · socket(SERVER, PF_INET, SOCK_STREAM, 6); · setsockopt(SERVER, SOL_SOCET, SO_RESEADDR,1); · $my_addr = sockaddr_in($local_port, INADDR_ANY); · bind(SERVER, $my_addr); · · #Слушаем… · listen(SERVER,1); · while(1) · { · · print "Ожидание подключения…\t\t"; · #Определяем адрес клиента · $client_addr=accept(CLIENT, SERVER); · ($clint_port,$client_ip) = sockaddr_in($client_addr); · print "+OK [IP:",inet_ntoa($client_ip),"]\n"; · · $one=CLIENT; · · $connect=1; · · if ($server!=666) · {# Прокси-схема с удаленным сервером · print "Соединение с узлом $server…\t"; · socket(RSERVER, PF_INET, SOCK_STREAM,6); · connect(RSERVER, sockaddr_in($remote_port,inet_aton($server))) || die; · print "+OK\n"; · $two=RSERVER; · ·} · else · {# Эхо-сервер · print "Установка эхосервера…\t\t+OK\n"; · $two=CLIENT; ·} · · $x='foo'; · open(LOG,"»tcpspy.log"); · #Обработка текущего подключения · while($connect) · { · $rin=''; · vec($rin, fileno($one),1)=1; · $timeout=5; · $nfound=select($rout = $rin, undef, undef, $timeout); · if (vec($rout, fileno($one),1)) · { · #Слушаем ответ клиента · recv($one,$x,10000,0); · if (!length($x)) {$connect=0;} · else · { · · if ($x=~/#HALT_OFF/) {send($two,"HANDUP",0);die;} · print "$one$x"; · print LOG "$one$x"; · #Говорим это серверу · send($two,"$x",0); ·} ·} · else · {#Меняем сервера с клиентом · ($one,$two) = ($two,$one); ·} ·} · print "\n-ERR:Соединение разорвано\n"; · close(CLIENT); · close(RSERVER); · close(LOG); ·} · __END__ ·:end[1]. «UNIX не был создан для того, чтобы мешать кому-то делать глупости, ведь это помешало бы умным людям делать умные вещи» Doug Gwyn
[2] Тогда еще ARPANET
[3]http://www.siber.com/sib/internet/RussianNetStory.html
[4] От английского слова “creeper”– ползучее растение, ленточный конвейер. В русскоязычной литературе эта программа известна под именем «Вьюнок»
[5] В дословном переводе «Монстр из печенья» - герой популярной детской передачи Sesame Street
[6] Сетевые черви существовали еще и до Морриса. Если бы не масштабы эпидемии его творение так бы и осталось ничем незамеченным
[7] которые возникли намного позднее
[8] Ну, может быть, за исключением школьников младших классов, находящихся на иждивении у родителей
[9] Вадим Антонов
[10] Если непривилегированный пользователь получит право модификации файла паролей, он сможет изменить пароль администратора (или другого пользователя) и несанкционированно войти в систему
[11] Впрочем, обновления устанавливать необходимо - в большинстве случаев атакующий использует самые свежие уязвимости в системе, поэтому успешность атаки большей частью зависит от того, - чья из сторон (нападающий или жертва) первой отреагирует на сообщение о новой дыре
[12] Правильнее было бы сказать наивный или доверчивый. К сожалению, с приходом опыта доверчивость чаще всего остается
[13] Но «высшей» еще не обозначает сложной
[14] Впрочем, все это не мешает использовать книгу для «диванного чтения» и получать от этого удовольствие
[15] От английского “hack”– рубить, разрубать; кромсать; разбивать на куски, надрубать; наносить резаную рану, а так же тонкая ювелирная работа, верх совершенства
[16] Ну, по-русски они клацали, а по-американски хацкали
[17] Словом, киберпанков
[18] А могут считать, но публично утверждать обратное
[19] Сигареты, пиво и отращивание волос еще никого не сделали хакером
[20] Хакеры, хакеры…
[21] Шутка, конечно, но чего не бывает в жизни…
[22] Точная статистика варьируется от одного источника к другому, поэтому, конкретные цифры здесь не приводняется
[23] Любопытно, но выдержки из этой работы непонятным образом попадают в монографию Николая Безрукова «Компьютерные вирусы», изданную гораздо позже - в 1989 году, но без ссылок на первоисточник!
[24] К слову сказать, диплом не является свидетельством образованности - деградация высших учебных заведений - тема для отдельного длинного разговора