Эксплоиты(часть 2)
Метки: buffer overflow | ESP
Вторник, 20 января 2009 г.
Просмотров: 2277
Подписаться на комментарии по RSS
Переполнение буфера (buffer overflow).
Наиболее известный класс Unix-эксплоитов в состоянии вызвать переполнение буфера. Переполнение буфера - это очень тонкое дело, требующее знания принципов работы операционной системы и процессора.
Операционная система Linux распределяет оперативную память (RAM) блоками по 4 Кб. Эти блоки называются страницами. У каждой страницы есть свой уникальный номер.
Пользователь запускает программу. Первым делом операционная система должна загрузить программу в память. Ядро выделяет процессу одну или несколько страниц и заносит номера страниц, используемые процессом, в свою внутреннюю таблицу. При этом используется относительная адресация, то есть все данные страницы адресуются относительно начала страницы. Относительная адресация освобождает процесс от необходимости следить за своим абсолютным расположением в памяти. Память, используемая процессом, делится на три разных блока:
Сегмент кода (текста): содержит инструкции программы (текст) и константы (данные, доступные только для чтения). Сегмент кода доступен только для чтения, поскольку необходимости в его модификации нет. Любая попытка изменения этого сегмента вызывает ошибку.
Сегмент данных: в этом сегменте хранятся статические и динамические данные. При необходимости размер данного сегмента может быть изменен. Этот сегмент может содержать разделяемые (общие) данные, которые доступны другим процессам.
Сегмент стека: используется для хранения некоторых динамических данных, например параметров, передаваемых функциям. Как раз на этот сегмент и совершается атака, приводящая к переполнению буфера.
Стек - это метод хранения данных, при котором новые данные помещаются в вершину стека, то есть «поверх» уже существующих в стеке данных. Последний элемент данных, который вы поместили в стек, будет извлечен из него первым. Для помещения данных в стек используется команда push, а для выталкивания (извлечения) из стека — команда pop. Размер стека изменяется динамически - ядро может увеличивать или уменьшать размер стека во время выполнения процесса. У стека есть начальный адрес - это адрес, с которого начнется добавление элементов в стек. Первый элемент стека будет записан по этому адресу. На вершину стека (последний элемент, добавленный в стек) указывает указатель ESP (stack pointer).
Во всех высокоуровневых языках программирования (C/C++, Java, Perl, Python и др.) есть функции. Передача данных между основной программой и функцией осуществляется через стек. Крекер помещает инструкции в буфер и вызывает переполнение буфера(buffer overflow). В результате этого процессор начинает выполнять инструкции крекера. В некоторых случаях атакующий может использовать переполнение буфера, чтобы «обойти» определенные участки кода программы (например, функцию проверки пароля), но в большинстве случаев переполнение буфера(buffer overflow) используется для получения доступа к командной оболочке или для выполнения своих инструкций.
- Эксплоиты(часть 1)
- Эксплоиты(часть 2)
- Эксплоиты(часть 3)