Переполнение буфера все еще существует?

Я смотрел университетскую лекцию о переполнении буфера, и профессор закончил тем, что сказал

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

Причины, отметил он, следующие:

  1. программисты избегают использования функций, которые вызывают переполнение.

  2. рандомизированные смещения стека: при запуске программы выделяйте случайное количество места в стеке, чтобы затруднить прогнозирование начала вставленного кода.

  3. использовать методы для обнаружения повреждения стека.

  4. неисполняемые сегменты кода: разрешить выполнение кода только из "текстовых" разделов памяти.

Теперь мне интересно, существует ли атака переполнения буфера в наши дни? или это устарело.

подробный ответ будет очень признателен!

1 ответ

Решение
  1. Не всех нас. Каждый день появляется куча новых программистов. Наши коллективные знания strcpy это плохо распространяться на них магическим образом? Я так не думаю.

  2. Сложно, да. Невозможно, нет. Любая уязвимость, которая может быть превращена в произвольное чтение, может обойтись без такой защиты.

  3. Действительно, мы можем обнаружить повреждение стека при определенных обстоятельствах. Канарские острова, например, могут быть перезаписаны, их значение зависит от компилятора, и они могут не защищать от всех видов повреждения стека (например, GCC -fstack-protector-strong защищает от перезаписи EIP, но не от других видов переполнения)

  4. W ^ X память - это реальность, но сколько ОС приняли ее за стек? Это был бы интересный маленький исследовательский проект для твоих выходных.:) Кроме того, если вы посмотрите на методы возврата-ориентированного программирования (ROP) (возврат к libc является его применением), вы увидите, что его также можно обойти.

Другие вопросы по тегам