Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Эксплоиты(часть 2)

Рубрика: Безопасность -> Уязвимости Linux-сервера
Метки: |
Вторник, 20 января 2009 г.
Просмотров: 6148
Подписаться на комментарии по RSS

Переполнение буфера (buffer overflow).

     Наиболее известный класс Unix-эксплоитов в состоянии вызвать переполнение буфера. Переполнение буфера - это очень тонкое дело, требующее знания принципов работы операционной системы и процессора.

     Операционная система Linux распределяет оперативную память (RAM) блоками по 4 Кб. Эти блоки называются страницами. У каждой страницы есть свой уникальный номер.


     Пользователь запускает программу. Первым делом операционная система должна загрузить программу в память. Ядро выделяет процессу одну или несколько страниц и заносит номера страниц, используемые процессом, в свою внутреннюю таблицу. При этом используется относительная адресация, то есть все данные страницы адресуются относительно начала страницы. Относительная адресация освобождает процесс от необходимости следить за своим абсолютным расположением в памяти. Память, используемая процессом, делится на три разных блока:

     Сегмент кода (текста): содержит инструкции программы (текст) и константы (данные, доступные только для чтения). Сегмент кода доступен только для чтения, поскольку необходимости в его модификации нет. Любая попытка изменения этого сегмента вызывает ошибку.

     Сегмент данных: в этом сегменте хранятся статические и динамические данные. При необходимости размер данного сегмента может быть изменен. Этот сегмент может содержать разделяемые (общие) данные, которые доступны другим процессам.

     Сегмент стека: используется для хранения некоторых динамических данных, например параметров, передаваемых функциям. Как раз на этот сегмент и совершается атака, приводящая к переполнению буфера.

     Стек - это метод хранения данных, при котором новые данные помещаются в вершину стека, то есть «поверх» уже существующих в стеке данных. Последний элемент данных, который вы поместили в стек, будет извлечен из него первым. Для помещения данных в стек используется команда push, а для выталкивания (извлечения) из стека — команда pop. Размер стека изменяется динамически - ядро может увеличивать или уменьшать размер стека во время выполнения процесса. У стека есть начальный адрес - это адрес, с которого начнется добавление элементов в стек. Первый элемент стека будет записан по этому адресу. На вершину стека (последний элемент, добавленный в стек) указывает указатель ESP (stack pointer).

     Во всех высокоуровневых языках программирования (C/C++, Java, Perl, Python и др.) есть функции. Передача данных между основной программой и функцией осуществляется через стек. Крекер помещает инструкции в буфер и вызывает переполнение буфера(buffer overflow). В результате этого процессор начинает выполнять инструкции крекера. В некоторых случаях атакующий может использовать переполнение буфера, чтобы «обойти» определенные участки кода программы (например, функцию проверки пароля), но в большинстве случаев переполнение буфера(buffer overflow) используется для получения доступа к командной оболочке или для выполнения своих инструкций.

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



(обязательно)