Авторские статьи Что такое переполнение буфера

Discussion in 'Статьи' started by Exile1985, 25 Aug 2006.

  1. Exile1985

    Exile1985 Elder - Старейшина

    Joined:
    10 Aug 2006
    Messages:
    124
    Likes Received:
    35
    Reputations:
    1
    Что такое переполнение буфера

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

    Чтож начнем.


    Содежрание

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



    Вступление​


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


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

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


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


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

    • атаки на стек
    • атаки на формат строки
    • атаки на хип

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

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

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

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

    Атаки на стек


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

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

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

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

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

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

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

    Атаки на хип

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

    Пример​


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

    Code:
    #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
     
    7 people like this.
  2. bul.666

    bul.666 булка

    Joined:
    6 Jun 2006
    Messages:
    719
    Likes Received:
    425
    Reputations:
    140
    Лучше вставлять не вырезки а самому их прочитать, понять, а потом нам донести в понятном всем языке и виде...
     
  3. Mobile

    Mobile Elder - Старейшина

    Joined:
    18 Feb 2006
    Messages:
    1,089
    Likes Received:
    822
    Reputations:
    324
    Нормально, новечкам пойдёт. +тебе за то, что честно сказал, что стать не совсем твоя, за то всёравно чучуть поработал...;)
    В следующий раз лучше сам наколбась статью какуюнить...
     
  4. Elekt

    Elekt Banned

    Joined:
    5 Dec 2005
    Messages:
    944
    Likes Received:
    427
    Reputations:
    508
    Понятно.
    Ты забыл про однобайтовое переполнение. Можешь дописать приписку?
     
  5. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,193
    Reputations:
    430
    Я вот нашёл... вроде всё подробно описано.
    _hxxp://rst.void.ru/papers/one_byte.txt
     
  6. em00s7

    em00s7 Elder - Старейшина

    Joined:
    2 May 2006
    Messages:
    169
    Likes Received:
    37
    Reputations:
    -10
    + держи ))))))))))
     
  7. Dmitriy507

    Dmitriy507 Elder - Старейшина

    Joined:
    29 Apr 2006
    Messages:
    135
    Likes Received:
    19
    Reputations:
    6
    мой гигабайт буфера долго заполнять надо будет!)))))
     
  8. Exile1985

    Exile1985 Elder - Старейшина

    Joined:
    10 Aug 2006
    Messages:
    124
    Likes Received:
    35
    Reputations:
    1
    попробую, я кокрас собирался взять какой нибуть сплоит и в статье подробно разобрать как он работает. Сейчас кокрас этим занимаюсь
     
  9. Exile1985

    Exile1985 Elder - Старейшина

    Joined:
    10 Aug 2006
    Messages:
    124
    Likes Received:
    35
    Reputations:
    1
    читал, и не один раз, понял смыл "переполнения буфера", про это и написал, можно было бы написать и как сплоит для найденой уязвимости делать (продолжение "Примера"), но решил что не правильно писать про то что сам еще доконца не понял.
    А в понятном для всех языке и виде, т.е. своими словами, пробовал написать, опыта маловато, слов не хватило :) следующую буду писать сам
     
  10. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Молодец, хорошая статья.
    Вы добавили слишком много репутации в последние 24 часа. Попробуйте попозже.
    Потом + поставлю-)
     
    #10 .Slip, 26 Aug 2006
    Last edited: 26 Aug 2006
  11. Exile1985

    Exile1985 Elder - Старейшина

    Joined:
    10 Aug 2006
    Messages:
    124
    Likes Received:
    35
    Reputations:
    1
    следующую статью буду писать сам, точнее уже начал ее писать
     
  12. васёк

    васёк Banned

    Joined:
    25 Aug 2006
    Messages:
    3
    Likes Received:
    2
    Reputations:
    -11
    мне навечку очень позновательная статья надо будет все запомнить. держи +