Коллектив авторов - Защита от хакеров корпоративных сетей
- Название:Защита от хакеров корпоративных сетей
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Коллектив авторов - Защита от хакеров корпоративных сетей краткое содержание
В книге рассматривается современный взгляд на хакерство, реинжиниринг и защиту информации. Авторы предлагают читателям список законов, которые определяют работу систем компьютерной безопасности, рассказывают, как можно применять эти законы в хакерских технологиях. Описываются типы атак и возможный ущерб, который они могут нанести компьютерным системам. В книге широко представлены различные методы хакинга, такие, как поиск различий, методы распознавания шифров, основы их вскрытия и схемы кодирования. Освещаются проблемы безопасности, возникающие в результате непредсказуемого ввода данных пользователем, методы использования машинно-ориентированного языка, возможности применения мониторинга сетевых коммуникаций, механизмы туннелирования для перехвата сетевого трафика. В книге представлены основные сведения о хакерстве аппаратных средств, вирусах, троянских конях и червях. В этой книге читатель узнает о методах, которые в случае неправильного их применения приведут к нарушению законодательства и связанным с этим последствиям.
Лучшая защита – это нападение. Другими словами, единственный способ остановить хакера заключается в том, чтобы думать, как он. Эти фразы олицетворяют подход, который, по мнению авторов, позволит наилучшим образом обеспечить безопасность информационной системы.
Перевод: Александр Петренко
Защита от хакеров корпоративных сетей - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Большинство компиляторов в начале функции вставляют служебный программный код, который иногда называют прологом (prologue) функции. Назначение пролога, помимо всего прочего, – подготовить стек для работы функции. Часто именно эта часть программного кода сохраняет старое содержимое регистра EBP и загружает в него указатель текущего положения в стеке. После этих действий регистр EBP содержит указатель на вершину стека выполняющейся функции. Зная содержимое регистра EBP и добавляя к нему смещение, получают ссылку на размещенные в стеке данные. Обычно регистр EBP адресует переменные, хранимые в стеке.
Приведенный ниже пример простой программы с несколькими локальными переменными демонстрирует сказанное. Подробные комментарии в исходном тексте программы позволят читателю лучше понять, что она делает.
Пример программы
Приведенная на рис. 8.1 написанная на языке C программа (C-программа) очень проста. Она присваивает своим переменным некоторые значения.
Рис. 8.1. Пример простой программы, иллюстрирующий работу стека
В программе создаются три локальные переменные, которые будут помещены в стек: 15-байтовый буфер символов buffer и две целые переменные intl и int2. Во время инициализации главной функции программы этим переменным присваиваются значения, а по завершении своей работы программа возвращает 1. Несмотря на простоту, программа полезна для изучения машинного кода оттранслированной функции на языке C вместе с прологом, эпилогом и стеком. Рассмотрим дизассемблерный вид приведенной на рис. 8.1 программы, которая была скомпилирована как консольное приложение Windows в режиме построения окончательной версии Release. Дизассемблирование
Дизассемблирование приведенной на рис. 8.1 программы показывает, как компилятор решил несложную задачу определения, инициализации локальных переменных и записи их значений в стек. Результаты дизассемблирования приведены на рис. 8.2.
Рис. 8.2. Результаты дизассемблирования простой программы на языке CИз рисунка 8.2 видно, что в прологе функции _main компилятор сначала сохранил старое значение регистра EBP в стеке, а затем записал в EBP адрес вершины стека функции (текущее положение в стеке). Эти стандартные действия делаются для того, чтобы каждая функция использовала свой собственный стек. Большинство, если не все, функций выполняют подобные операции в начале, а обратные им – в конце, в заключительной части программы – эпилоге.
Дамп стека
Для того чтобы можно было просмотреть область стека, после его инициализации в отладчике была установлена точка прерывания. При просмотре стека видно, что в нем хранится в начале работы функции, и легче понять, что происходит со стеком в процессе ее выполнения. Дамп стека показан на рис. 8.3.
Рис. 8.3. Дамп стека после инициализацииИз рисунка видно следующее. Буфер памяти, инициализированный строкой «Hello World», занимает 16 байт, а каждое целое число занимает область памяти размером по 4 байта. Шестнадцатеричные числа слева от дампа – статические адреса стека, которые определяются компилятором во время трансляции и которые Windows редко использует. Статические адреса стека потребуются для задания точек перехода при изучении возможности использования переполнения буфера в своих целях. Из рисунка 8.3 видно, что в области стека буфер памяти занимает 16 байт, а не 15, как определено в программе. Большинство компиляторов выравнивают область стека и области данных в стеке на границу двойного слова, поэтому области стека и данных начинаются с адреса памяти, кратного четырем. Это является обязательным условием повышения производительности процессора, и многие программы предполагают, что выравнивание обязательно выполняется. Поэтому буфер памяти занимает 16 байт в области стека, а не 15.
Разнообразие стеков
После инициализации стек может измениться по многим причинам. Опции компилятора влияют на размер и выравнивание стека программы, а настройки оптимизации генерируемого компилятором кода могут сильно изменить механизм создания стека и получения к нему доступа.
Некоторые функции в прологе сохраняют в стеке содержимое отдельных регистров. Во-первых, это делать необязательно, а во-вторых, это полностью зависит от компилятора и функции. В генерируемом компилятором коде может быть или несколько команд сохранения регистров, или одна команда pusha, которая сразу сохраняет содержимое всех регистров. К тому же в прологе могут быть изменены размеры стека и некоторые смещения.
Многие современные компиляторы языков С и С++ оптимизируют генерируемый код различными способами, что сказывается на работе со стеком и стековыми переменными. Например, в одном из наиболее часто встречающихся вариантов оптимизации генерируемого программного кода для доступа к данным в стеке вместо регистра EBP используются ESP. Код получается сложным и трудно поддается анализу, но при этом освобождается лишний регистр, который компилятор использует для генерации более быстрого кода. Другим примером влияния оптимизации кода на работу со стеком служит размещение компиляторами временных переменных в области стека. По разным причинам компиляторы размещают временные переменные в области стека, например для сокращения времени выполнения циклов в программе. Всегда подобные действия сопровождаются тщательной настройкой указателя смещения для доступа к данным стека.
Рассматривая проблемы работы со стеками, нельзя не упомянуть о новых способах защиты стеков программным кодом, генерируемым компиляторами. На них основан проект Crispin Cowen\'s Immunix (www.immunix.com). В проекте используется модифицированный GCC компилятор с языка C для генерации программного кода, практически не позволяющего выполнить злонамеренную программу в результате подмены содержимого регистра EIP при переполнении буфера. Как правило, используется способ, получивший название проверочных величин (canary values). Он основан на записи в прологе дополнительной величины в стек и проверке ее значения в эпилоге функции. При совпадении обоих значений гарантируются целостность стека и неизменность значений сохраненных в стеке регистров EIP и EBP.Стековый фрейм функции
Как было упомянуто ранее, стек позволяет решить многие задачи. Во-первых, обеспечить локальное хранение переменных и данных функции. Во-вторых, передавать параметры в вызываемую функцию. В этой части главы будет рассказано, как компиляторы передают параметры вызываемым функциям и как это влияет на стек. Кроме того, будет уделено внимание разъяснению вопросов использования стека в командах процессора вызов функции call и возврата из нее ret.
Читать дальшеИнтервал:
Закладка: