Buffer Overflow

Автор: admin

Buffer Overflow она же уязвимость «переполнения буфера (стека)» является одной из самых многочисленных и серьёзных уязвимостей. Найдено тысячи уязвимостей этого типа и написано более 2-х тысяч эксплойтов юзающих её. Если кто-то сомневается в этом, пусть пробежится по баг тракам. Спектр применения данной уязвимости очень широк. Переполнение буфера используется вирусами для завершения процессов антивирусов или фаерволов (эту возможность первым использовал небезызвестный Роберт Моррис в коде своего червя). Также при помощи данной уязвимости можно открыть определённый порт на удалённом сервере, получить рута на локальный системе или просто подвесить сервис. Из всего перечисленного следует, что эта уязвимость может здорово помочь! Но многие из-за недопонимания забывают о ней. А зря! Сейчас я постараюсь пролить свет на Buffer Overflow!!!
Сначала определимся, что такое стек (буфер) и как он работает. Если ты хороший программер, то знаешь что это такое, но на всякий пожарный поясню. Обратимся к мануалу и читаем: «Стек – это структура данных, построенная по принципу «первый пришёл – последний ушёл» (сокращённо LIFO – по буржуйски)». А теперь посмотрим с другой стороны, так сказать на наглядном примере =)). Пусть стек – это обойма для патронов автомата Калашникова. Патроны – это данные. Так вот, последний патрон, который затолкали в обойму, первым вылетит из автомата при нажатии на курок. Так думаю понятнее. Вот это и есть принцип работы стека. Ну а теперь о самом переполнении буфера. В качестве примера приведу кусок кода на С++: //…...................................
char Pass[128];

cout << “Enter password”;
cin >> Pass;
//…....................................

Из кода видно, что в переменную Pass загоняются данные. В нашем случае это пароль. Введём любое сочетание символов длиной, например 6 символов. Вроде всё нормал, и ничто не предвещает беды. =)) Но, если ввести пароль длиной, например 136 символов, то выскочит ошибка и программа аварийно завершится. Что же произошло и почему прога ругается? Взглянем на кусок кода ещё раз и видим, что введённые нами данные превышают допустимую норму. Именно поэтому стек «лопнул». Ведь буфер переменной Pass равен 128 символов, а мы ввели 136. Вот и вся суть переполнения буфера!

В нашем случае прога аварийно завершилась или зависла (что бывает реже). Это можно применить при вводе пароля на FTP, и если сервис уязвим, подвесит его! Но владея определёнными знаниями можно сделать гораздо большее… А именно внедрить в водимые данные шелл-код. В шелл-коде может быть функция, открывающая порт на удалённой машине или функция, завершающая работу антивируса и т.д. Для дальнейшей работы важно понять ещё одно понятие, а именно что такое адрес возврата. Поясняю: адрес возврата - это адрес, с которого продолжится дальнейшее выполнение программы после «выгрузки» данных из стека. Так вот, весь смысл в том, чтобы в буфер загрузилось столько данных, чтобы они затёрли собой адрес возврата и вместо него записали адрес перехода на наш шелл-код… Адрес определяется опытным путём, путём проб и ошибок. Сам шелл-код заносится вместе с остальным «мусором» в стек.

Комментарии

Нет комментариев. Вы можете быть первым!

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

:

:
: