Подтвердить что ты не робот

Атаки переполнения кучи

Как выполняются атаки переполнения кучи?

В случае нападений stackoverflow злоумышленник заменяет адрес возврата функции своим адресом.

Как это делается при атаках переполнения кучи? Кроме того, возможно ли запустить код из кучи?

4b9b3361

Ответ 1

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

Представьте, что у меня есть наивная реализация кучи, чьи блоки управления таковы:

struct HeapBlockHeader
{
    HeapBlockHeader* next;
    HeapBlockHeader* prev;
    int size;

    // Actual heap buffer follows this structure.
};

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

В этой статье есть хороший обзор по атакам переполнения кучи: http://www.h-online.com/security/features/A-Heap-of-Risk-747161.html

В этой статье описывается некоторое упрощение, которое появилось в диспетчере кучи Vista, чтобы предотвратить такую ​​атаку: http://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Marinescu.pdf

EDIT: Возможность запуска кода из кучи, да это возможно. Многие платформы теперь делают невозможным выполнение неиспользуемой памяти кучи, что повышает барьер для запуска произвольного кода. Тем не менее, вы все равно можете использовать атаку типа "прыгать в libc". Перезапишите обратный адрес к известной функции, которая будет выполняться.