Как работает атака кучным распылением?
Вопрос
Я прочитал две статьи о кучном распылении: Викиэпдия и это сообщение в блоге.Я понимаю, как код оболочки вводится в память программы.Но как программа сделана для перехода / вызова к адресной памяти, расположенной в куче?
Какой сбой вызывает вызов heap?
Должна ли такая атака проводиться с помощью своего рода атаки переполнения буфера?
Есть ли какое-нибудь золотое правило, подобное тому, что касается переполнения буфера, т. е. используйте n версию функций (strncpy
вместо этого strcpy
)?
Решение
Если я правильно понимаю,
Обычно они используют преимущество того факта, что эти блоки кучи будут находиться примерно в одном и том же месте каждый раз, когда выполняется распыление кучи.Выполнение поток может быть перенаправлен в кучу распыляется через переполнение буфера или кучу ошибки переполнения.
Они говорят о подобной ситуации:
char buffer[10];
FuncPtr p;
И когда вы читаете в buffer
защита от переполнения отсутствует, и вы можете записывать данные непосредственно в ячейку памяти для p
.Позже, когда ваш код попытается вызвать p
, он переместится туда, куда хочет, чтобы он переместился злоумышленник, предположительно туда, где они внедрили исполняемый код в ваше приложение.
Простое решение:Не используйте статические буферы (предпочитайте std::
классы коллекции) и всегда проверяйте наличие переполнений.