Прежде чем мы перейдем непосредственно к теме, вам следует знать несколько предварительных требований. ОЗУ (память) разделена на две области: Ядро Пространство - это место, где ядро (т. Е. Ядро операционной системы ) выполняет (т. е. запускает) и предоставляет свои услуги, Пространство пользователя само имеет разные области . Стек имеет регистры, связанные с нашей функцией, такие как EIP (расширенный указатель инструкций), указывающие на адрес возврата функции, другими словами, он указывает на инструкцию, которую следует выполнить после завершения функции. Расширенный указатель стека) указывает на начало стека. Мы также находим в вызове стека функции, которые вызывают параметры функции, и, что наиболее важно, мы находим статическое распределение памяти, это означает, что если программист знает, сколько данных ему нужно до компиляции программы, он может сделать статическое распределение (char buf [12 ]). Переменные, размещенные в стеке, хранятся непосредственно в памяти, и доступ к этой памяти осуществляется очень быстро. Стек имеет структуру LIFO (последний пришел - первый ушел), последний зарезервированный блок всегда является следующим блоком, который должен быть освобожден. Это упрощает отслеживание стека, освобождение блока из стека - это не что иное, как корректировка одного указателя. стек увеличивается от памяти с высокими адресами к низким адресам. Куча предназначена для динамического распределения памяти и ограничена размером виртуальной памяти (malloc в программе C). Куча растет от младших адресов к старшим адресам в оперативной памяти. Данные - это то, где находятся наши инициализированные и неинициализированные переменные (int a = 5, int b). Текстовый сегмент содержит исполняемые инструкции.

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

Вам понадобится kali linux и мозг из vulnhub. Позже я опубликую видео о том, как настроить лабораторную среду, в моем Твиттере (ссылка ниже).

Заголовки этой лабораторной работы: фаззинг и поиск смещения, который в основном состоит из отправки программе большого количества байтов, пока она не выйдет из строя, и мы точно знаем, где происходит сбой. Управление EIP означает, что мы знаем распределение EIP, поэтому мы можем использовать его для указания на некоторый вредоносный код. Поиск плохих персонажей ломает нашу полезную нагрузку. Затем мы найдем некоторую функцию, которая вернется в начало нашего стека, и мы сгенерируем нашу полезную нагрузку. И последнее, но не менее важное: мы будем владеть программой.
Не забудьте подписаться на меня в твиттере, где я буду публиковать видео из лаборатории. И не стесняйтесь задавать мне вопросы там.
https://twitter.com/YoussefIchioui