Хакеры могут получить контроль над системой, максимально исчерпав емкость хранилища службы. Так как же хакеры осуществляют такие атаки с переполнением буфера?
Как хакеры атакуют системы с помощью вирусов и вредоносных программ? Иногда это может быть программа-вымогатель; иногда это может быть атака, которая потребляет ваши системные требования. Переполнение буфера — один из таких методов атаки, но что это такое на самом деле? Как работают эти атаки?
Что такое переполнение буфера?
Так что же такое буфер и стек? Буфер — это поле, в котором некоторая входная информация, которую вы передаете своему компьютеру, ждет, прежде чем она попадет в память. Вызов данных из памяти — операция, утомляющая систему. Поэтому, когда в области буфера достаточно места, вы вызываете данные прямо отсюда. Это означает повышение производительности вашего устройства. Конечно, когда место, доступное для буфера, заполнено, возникает необходимость записать его в память.
Стек — это, по сути, структура данных, в которой выполняются операции push (добавление) и pop (удаление) данных. Понятия буфера и стека очень похожи; однако буфер работает как стек, в котором временно хранятся входящие данные.
Переполнение буфера может быть сложной темой, но, как следует из названия, это происходит при перегрузке данных. Например, вы хотите войти в систему. Разработчики могут выделить 250 байт для имени пользователя. Если вы введете 300 байт данных, буфер переполнится. Это переполнение может повлиять на другие данные в памяти, причинив вред.
Это отлично подходит для хакеров. Киберпреступники могут комбинировать эту неразбериху с разными векторами атаки, например, взломать систему и войти под администратором.
Чтобы понять переполнение буфера, основными темами, которые вам необходимо осознать, будут Внутренняя архитектура ЦП, регистры памяти и то, как память обрабатывает данные. Вот некоторые термины о ЦП, о которых вам нужно знать.
Код сборки |
Язык программирования низкого уровня, то есть близко к машинному языку. |
Буфер |
Фиксированный размер выделенное пространство памяти. |
Байтовый код |
Компилируемая промежуточная языковая форма кода, написанная на языке высокого уровня. |
Компилятор |
Программа, преобразующая язык программирования в машинный код. |
куча |
Динамическое переменное пространство памяти. |
Основы теории памяти
Без понимания теории памяти может быть сложно решать проблемы переполнения буфера на практике. Вы можете думать об этом, как о попытке построить дом, не зная, как сделать стену.
Представьте, что вы хотите запустить переполнение буфера с точки зрения хакера. Для этого вам нужно манипулировать памятью и заставить процессор выполнять ваш код. Если бы вы были кем-то со злым умыслом, вашей целью здесь было бы перегрузить память и также манипулировать смежными областями памяти.
Но в первую очередь нужно сосредоточиться на понятиях кучи, стека и текстового сегмента.
Пока создается стек, память использует старшие адреса памяти. Старшие адреса памяти означают расширенную область памяти. Затем значения адресов начинают уменьшаться. Стек памяти использует метод под названием LIFO (Last In, First Out) во время использования памяти. Переменные в памяти стека допустимы только в той области, в которой они определены. Если они находятся за пределами этой области, произойдет ошибка.
Память стека, с другой стороны, работает динамически и не должна начинаться с высоких адресов. Не существует установленного предела памяти кучи; все ограничения устанавливаются операционной системой. Можно динамически изменять память кучи, и эти ограничения могут изменяться в соответствии с потребностями пользователя во время использования кучи. Пределы кучи памяти зависят от факторов, определяемых операционной системой и оборудованием. Другими словами, он предлагает динамическое использование в этих пределах.
Текстовый сегмент содержит программный код, а сегменты данных содержат глобальные данные. Доля высоких адресов стек и куча памяти среди них. Система выделяет обе памяти во время выполнения.
Чтобы лучше понять переполнение буфера, вы должны изучить регистры данных общего назначения, которые архитектура вашего компьютера использует для хранения данных. Вместо того чтобы анализировать каждую запись по отдельности, сосредоточьтесь на главном.
- ESP (расширенный указатель стека): Этот регистр содержит адрес на вершине стека.
- EBP (расширенный базовый указатель): Это содержит базовый указатель.
- EIP (расширенный указатель инструкций): И этот регистр содержит адрес следующей инструкции, которая будет выполнена.
Эти технические термины могут показаться немного запутанными, но представьте их все как небольшие разделы в памяти.
Как работают атаки переполнения буфера?
Когда вы добавляете новые данные в любой стек, эти данные будут размещены вверху. Затем все новые данные перемещаются вниз. ESP находится на вершине стека. Таким образом, в этом случае ESP переходит к более низкому адресу памяти. Представьте, что данные, добавленные выше, толкают ESP вниз.
Когда программа запускается, система создает кадр стека с локальными переменными. Основная цель атаки переполнения буфера — получить доступ к EIP или обратному адресу. Хакер, имеющий доступ к этому адресу, может указать ему любой вредоносный код, который он хочет, что затем повлияет на более широкую систему.
С каждым новым битом данных стек растет в сторону EBP. Настоящий вопрос здесь в том, что если мы введем слишком много данных, сможем ли мы подтолкнуть EBP к EIP? Таким образом, нужные вам данные или код находятся в EIP, и вы можете увидеть нужные результаты. Осталось только запустить. Когда вы запускаете программу, она указывает на ваш код EIP и начинает выполнение. В результате, если бы вы были хакером, вы бы осуществили свою первую атаку переполнения буфера.
Чтобы рассмотреть пример под другим углом, вы можете рассмотреть жидкости с различной плотностью, называемые ESP, EBP и EIP, в контейнере. Представьте, что ЭЦН расположен в верхней части контейнера, потому что его плотность ниже. Так же, как оливковое масло и вода, они не должны смешиваться. Таким образом, вредоносный код представляет собой другую жидкость: когда вы добавляете его в контейнер, он нарушает этот баланс, вытесняет часть жидкости и смешивается с EIP. Это будет означать переполнение буфера.
Как защититься от атак переполнения буфера
Так как же предотвратить это?
Во-первых, важно применять передовые методы кодирования на протяжении всего процесса разработки программного обеспечения, чтобы свести к минимуму уязвимости системы безопасности. Тщательно написанный код может снизить вероятность переполнения буфера.
Еще одним шагом является использование защитных механизмов, позволяющих отслеживать области памяти, проверять пределы буферов и обнаруживать атаки. Наконец, вам необходимо регулярно обновлять системы и применять исправления. Обновления, устраняющие уязвимости, затрудняют использование злоумышленниками известных уязвимостей. Кроме того, использование средств защиты, таких как программное обеспечение и брандмауэр, обеспечивает дополнительный уровень безопасности.
Примите меры против переполнения буфера
Атаки с переполнением буфера представляют серьезную угрозу для вашей кибербезопасности, и, естественно, важно принять меры против них. К счастью, эти атаки можно заблокировать и усилить защитные механизмы. Многие хорошие методы обеспечения безопасности, такие как постоянное обновление программного обеспечения для исправления исправлений, помогают защититься от таких атак, а также от других уязвимостей.