ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Что такое переполнение буфера
  #1  
Старый 25.08.2006, 18:02
Аватар для Exile1985
Exile1985
Участник форума
Регистрация: 10.08.2006
Сообщений: 147
Провел на форуме:
404152

Репутация: 94
По умолчанию Что такое переполнение буфера

Что такое переполнение буфера

Эта статья написана для новичков, те кто давно занимаются хакерством, пишут вирусы, эксплоиты, эту статью можно не читать, так как они уже давно это знают. В статье я попробую доступным языком обьяснить что такое переполнение буфера и как работают эксплоиты использующие этот тип атаки.

Чтож начнем.


Содежрание
  • Вступление
  • Разновидности атак
  • Пример
  • Заключение



Вступление


Переполнение буфера - это попытка разместить слишком много данных в области компьютерной памяти.


Для начала представим магазин в который взяли продавца-дауна, без опыта работы продавцом, для него в ежедневнике написали инструкцию что он должен делать, например: «Поприветствовать посетителя», «выбить чек», «принять деньги» «отдать посетителю его товар и его чек» «попрощается с посетителем». Предположим что этот новый продавец совсем глуп и может работать только по инструкции в этом ежедневнике.

Следую из выше сказанного делаем вывод что наш магазин уязвим для атаки. Стоит нам, пока продавец ищет нужную инструкцию, подложить в ежедневник листок где будет написано «Взять все деньги из кассы и передать их покупателю» продавец, который действует строго по инструкции, выполнит то что написано на листке.
Естественно человек запомнил что нужно делать и заподозрит неладное, в отличии же от человека, компьютер в точности выполнит инструкцию. Если атакующий сможет подсунуть компьютеру инструкцию то он выполнит ее один в один. Это основа для нападения, связанного с переполнением буфера.


РАЗНОВИДНОСТИ АТАК


Существует три разновидности атак, основанных на переполнении буфера:
  • атаки на стек
  • атаки на формат строки
  • атаки на хип

Эти разновидности одинаковы по сути, но каждая направлена на разные части памяти компьютера. Для того, чтобы понять различия между этими атаками, обрисуем как работает компьютерная память.

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

Точно также, как если бы вы использовали тетрадь с двух сторон,
хип будет расти в сторону конца тетради,
а стек – в сторону начала.
А тетрадь (то есть виртуальная память) настолько велика, что хип никогда не достигнет стека и наоборот.

Позиции внутри этой виртуальной памяти (страницы в тетради) в программ, в стеке, в хипе или между ними, задаются адресами, выраженными в шестнадцатеричном формате. Например, самый старший адрес в памяти размером в два гигабайта будет равным 8FFFFFFF. Небольшие области этого адресного пространства служат для ввода данных в программу. Эти области, которые могут иметь адреса в стеке или хипе, называются буферами.

Атаки на стек


В стеке хранятся временные данные.
Предположим, что вы пишете заметки по проекту, над которым вы работаете, когда звонит телефон. Звонящий сообщает информацию, которую вы запрашивали, вы берете новый листок бумаги, кладете его поверх первого и записываете эту информацию. Прежде чем вы успеваете завершить разговор, в комнату входит начальник и просит вас сделать кое-что по окончании звонка. Вы берете еще один листок бумаги и записываете на него просьбу начальника. Теперь у вас есть небольшая стопка (стек) листков бумаги, с написанными на них инструкциями и данными. Как только вы выполняете очередное задание, вы сминаете листок и бросаете его в мусорную корзину. Вы используете стек таким же образом, как и в случае с атакой, направленной на переполнение буфера.

В компьютерах конечно нет листков бумаги, у компьютера есть память (RAM). Данные добавляются в стек сверху и потом извлекаются.
При атаке «переполнение буфера», направленной на стек, атакующий добавляет в него больше данных, чем предусмотрено, при этом лишняя часть перезаписываются поверх данных, для которых разработчик программы не предусмотрел такой вариант.

Например: давайте предположим, что программе необходимо использовать почтовый индекс из формы, заполненной пользователем. Длина даже самого длинного почтового индекса не превышает двенадцати символов. Но в нашем примере форму заполняем мы. Вместо того, чтобы ввести почтовый код мы 256 раз вводит букву «А», а за ней пишет определенные команды. После того, как программа получает эту сверхдлинную строку, бессмысленные данные переполняют буфер, выделенный для постового индекса (как вы помните, буфер – это область памяти, зарезервированная для ввода данных) и наши команды попадают в стек. Также как и в случае с магазином, когда мы подсовываем инструкцию «Отдай мне все деньги» в круглосуточном магазине, атака типа «переполнение буфера» подкладывает инструкции, которые программа в обычных условиях не должна выполнять. Будучи дословным исполнителем, компьютер не сможет выполнить неверные инструкции – программа завершится аварийно. Если же инструкции точны - программа слепо выполнит наши команды.

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

Атаки на формат строки

Атаки на формат строки также используют стек, но требуют гораздо меньше изменений, чем переполнение буфера стека, которое мы обсуждали ранее. Форматирование означает подготовку каких-либо данных к отображению или печати.
Однако, инструкции форматирования так гибки, что есть способы использовать их для записи в память. Атаки на формат строки обычно добавляют в память адрес, указывающий на другую ссылку, по которой атакующий добавляет свои исполнимые инструкции.

Например: используя нашу аналогию с «глупым продавцом», предположим, что его книга с инструкциями содержит 25 страниц. Предположим также, что после страницы с инструкцией, гласящей «возьми у покупателя деньги и открой кассу», мы вставим инструкцию «Перейди на страницу 26». Мы можем подготовить несколько страниц с инструкциями типа «Отдай покупателю все деньги», «Дай ему уйти и не поднимай тревоги» и поместить их в конец книги. Если глупый продавец будет следовать этим указаниям, это будет аналогично программе, которая перешла по указанному адресу в памяти и выполнила все найденные там инструкции.

Атаки на хип

Атаки на хип совершенно не затрагивают стек. Вспомните аналогию с заметками (проект, телефон, начальник) - стек использует временную память. В противоположность этому хип – это название, данное программистами памяти, которая не является временной, а должна быть готовой к использованию в течение работы программы. Страницы хипа могут быть считаны или записаны, что и удачно используется. Записываются инструкции атаки в страницы хипа и затем компьютер выполняет их. Технически – это не отличается от атаки на стек.

Пример


Разберем простой пример уязвимости переполнения буфера. Для этого рассмотрим следующую небольшую программу.

Код:
#include <stdio.h>
int test(char *big)
{
      char buffer[100];   // переполняемый буфер
      strcpy(buffer,big);  // переполнение буфера
      return 0;
}

int main (int argc, char *argv[])
{
	char big[1024];

	gets(big);   // ввод строки
	test(big);   // вызов уязвимой функции
         return 0;
}
Здесь, на первый взгляд, ничего особенного: вводится строка big, передается в качестве параметра функции test, где копируется в промежуточный буфер buffer. Главное здесь для нас то, что промежуточный буфер buffer имеет размер, который меньше потенциально возможного размера вводимой строки big. При передаче функции test строки длиной более 100 символов произойдет переполнение буфера buffer, которое можно использовать в своих целях.

Теперь скомпилируем программу как консольное Win32 приложение и посмотрим, что произойдет при переполнении буфера. Программу я назвал so, соответственно запускаем so.exe:

D:\exploit>so

и вводим строку длиной более 100 символов

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa


в результате чего получаем аварийное завершение программы и следующее сообщение об ошибке нарушения доступа по адресу 0x61616161.

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

Очевидно, что выполнение strcpy(buffer,big) при big с длиной превышающей размер отведенный под buffer приводит к затиранию-подмене адреса возврата. Теперь понятно, почему в сообщении об ошибке фигурировал адрес 0x61616161, так как 0x61 - код символа ‘a’, из которого состояла наша строка.

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

Заключение


Честно сказать это не статья, а вырезки из статей, немного подредактированные, для более удобного восприятия.
Интерестно будет узнать ваше мнение о ней.
Сразу говорю, конечно в интернете много подобных статей и я бы сказал, лучше чем эта, там вообще все что угодно можно найти, главное правильно искать, но на этом сайте подобной статьи я не нашел, вот и решил ее написать.



Ссылки на используемые сатьи:

http://www.security.nnov.ru/articles/ntbo.asp
http://www.sec4all.net/statea140.html
http://www.intuit.ru/department/security/netsec/3/3.html
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мой ржачный разговор в аське с кем-то вроде как с античата, как я подумал Дрэгги Болталка 21 22.07.2007 12:33
Фразы о жизни novichok Болталка 10 15.07.2006 21:04
Небольшой отрывок от книги T-REX Болталка 0 19.10.2004 05:19
МнеВеликие перцы svans Чаты 11 24.12.2002 18:20



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ