Исправление ошибки переполнения стекового буфера

Уязвимости компиляции

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

Перед тем как исправить переполнение буфера, распаковывают на ПК ASLR. Он был разработан для защиты от ориентированного на возврат программирования как обходной путь к неисполнимым стекам, где существующие фрагменты кода объединены в цепочку на основе смещения их адресов.

Он работает путем рандомизации областей памяти структур, так что их смещения сложнее определить. Если бы эта защита существовала в конце 1980-х годов, червя Морриса можно было бы не допустить. Это связано с тем, что он функционировал частично, заполняя буфер в протоколе UNIX finger кодом эксплойта, а затем переполнял его, чтобы изменить адрес возврата и указывал на заполненный буфер.

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

Статический анализ покрытия

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

Нельзя предполагать, что такое обновление обеспечит достаточный охват. Организации или частные лица могут использовать программное обеспечение в системах с ограниченным доступом к интернету, требующих ручного обновления. Это означает, что новости об обновлении должны быть распространены среди любых администраторов, которые могут использовать ПО, а патч должен быть легкодоступен для загрузки. Создание и распространение исправлений выполняют как можно ближе к обнаружению уязвимости, что обеспечивает минимизацию времени уязвимости.

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

Комбинирование строк исходного кода в поисках потенциальных угроз может быть утомительным

Кроме того, всегда есть вероятность, что человеческие глаза могут пропустить что-то важное. Инструменты статического анализа используются для обеспечения качества кода, были разработаны специально для обнаружения уязвимости безопасности во время разработки

Статический анализ покрытия устанавливает «красные метки» для потенциальных переполнений buffer. Затем их обрабатывают и исправляют отдельно, чтобы вручную не искать в базе. Эти инструменты в сочетании с регулярными проверками и знанием того, как устранить переполнения, позволяют выявлять и устранять подавляющее большинство недостатков до завершения разработки ПО.

Краткое техническое изложение[править | править код]

Описаниеправить | править код

Рассмотрим более подробно случай переполнения буфера, расположенного в области стека. Это удобнее всего сделать с помощью примера программы на языке Си или C++. Пример ориентирован на архитектуру x86, но работает и на многих других.

Когда динамический буфер, представляющий собой автоматический массив, выделяется в функции, он создаётся на стеке во время вызова этой функции. В архитектуре x86 стек растёт от бо́льших адресов к меньшим (или справа налево, в приведённых ниже диаграммах), то есть новые данные помещаются перед теми, которые уже находятся в стеке. Здесь, представляет существующий стек, и — это некоторое новое значение, которое ЦП поместил в стек:

(NEWDATA)(DATA)(DATA)(…)

Записывая данные в буфер, можно осуществить запись за его границами и изменить находящиеся там данные. Когда программа вызывает подпрограмму, она помещает адрес возврата в стек, так что подпрограмма знает, куда возвращать управление после того, как она завершится:

(ADDR)(DATA)(DATA)(…)

Когда выделятся динамический буфер, стек растёт влево на размер буфера. Так, если функция начинается с объявления , результатом будет:

(.a………)(ADDR)(DATA)(DATA)(…)

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

Предположим, что 10-байтный буфер предназначен для того, чтобы содержать данные, предоставляемые пользователем (например — пароль). Если программа не проверяет количество символов, которые были введены пользователем, и записывает 14 байт в буфер, эти лишние данные «лягут» поверх адреса возврата, перезаписывая его новыми данными. Таким образом, это изменит место, в которое будет передано управление, когда завершится подпрограмма, и с которого программа продолжит исполнение после этого.

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

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

Примерправить | править код

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

 /* overflow.c - демонстрирует процесс переполнения буфера */

 #include <stdio.h>
 #include <string.h>
 
 int main(int argc, char *argv[])
 {
   char buffer10];
   if (argc < 2)
   {
     fprintf(stderr, "ИСПОЛЬЗОВАНИЕ: %s строка\n", argv]);
     return 1;
   }
   strcpy(buffer, argv1]);
   return ;
 }

Программу можно опробовать с несколькими разными строками. Строки размером в 9 или меньше символов не будут вызывать переполнение буфера. Строки в 10 и более символов будут вызывать переполнение, хотя это может и не приводить к ошибке сегментации.

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

 /* better.c - демонстрирует, как исправить ошибку */
 
 #include <stdio.h>
 #include <string.h>
 #define BUFFER_SIZE 10
 
 int main(int argc, char *argv[])
 {
   char bufferBUFFER_SIZE];
   if (argc < 2)
   {
     fprintf(stderr, "ИСПОЛЬЗОВАНИЕ: %s строка\n", argv]);
     return 1;
   }
   strncpy(buffer, argv1], BUFFER_SIZE - 1);
   bufferBUFFER_SIZE - 1 = '\0';
   return ;
 }

Как исправить отсутствие памяти на диске

Решение проблемы «Первичный диск переполнен» в Фотошопе состоит в реализации шагов, которые мы рассмотрим ниже.

Подключите другие диски в настройках Фотошоп

Первый способ состоит в подключении других рабочих дисков в настройках редактора «Фотошоп».

  1. Запустите редактор, выберите «Редактирование» – «Установки» (Настройки) – «Производительность».
  2. И найдите там опцию «Рабочие диски».
  3. Поставьте галочки рядом с дисками, обладающими наибольшим объёмом (например, D).
  4. После чего нажмите на «Ок» и полностью перезагрузите систему.

Также учтите, что не рекомендуется устанавливать первичным диском для Фотошоп системный диск (обычно это С), или диск, который вы используете в качестве хранилища данных (не говоря уже о сетевых или съёмных дисках).

Увеличьте свободное пространство на диске С

Другим решением проблемы является удаление лишних файлов с диска С для увеличения объёма свободного места.

  1. Для этого можно воспользоваться стандартной системной утилитой для очистки диска (наведите курсор на диск С.
  2. Нажмите ПКМ, выберите «Свойства».
  3. После чего перейдите во вкладку «Общие» и выберите там «Очистка диска), так и внешними утилитами типа «CCleaner».

Удалите временные файлы Фотошоп

В некоторых случаях причиной ошибки «Первичный рабочий диск переполнен» является чрезвычайно раздутые временные файлы Фотошопа на жёстком диске. На ОС Виндовс временные файлы «Фотошопа» обычно имеют имя ~PST####.tmp. Вам будет необходимо найти их и удалить, что позволит решить данную ошибку в Фотошоп.

Проведите дефрагментацию рабочего диска

Бывают ситуации, когда Фотошоп выдаёт сообщение об отсутствии свободного места в ситуации, когда этого места вполне достаточно. Это возникает из-за того, что Фотошоп требует связанного, нефрагментированного свободного места на своём рабочем диске.

Потому если на диске хватает свободного места, тогда вам будет необходимо выполнить его дефрагментацию. На Виндовс 10 это делается запуском Проводника, наведением курсора на рабочий диск, кликом ПКМ, и выбором опции «Свойства». Переходим на вкладку «Сервис», где жмём на «Оптимизировать». В открывшемся окне оптимизации вновь жмём на кнопку «Оптимизировать».

Нажмите на «Оптимизировать»

Простой вектор использования буфера

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

Например, когда юзер задает вопрос «да» или «нет», целесообразно сохранить строковые данные пользователя в небольшом buffer для строки «да», как показано в следующем примере.

Глядя на код, видно, что проверка границ не выполняется. Если пользователь вводит «возможно», то программа будет аварийно завершать работу, а не запрашивать у него ответ, который записывается в buffer независимо от его длины. В этом примере, поскольку user answer является единственной объявленной переменной, следующие значения в стеке будут значением обратного адреса или местом в памяти, куда программа вернется после выполнения функции ask Question.

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

Если первым шагом для обнаружения переполнения буфера в исходном коде является понимание того, как они работают, вторым этапом является изучение внешнего ввода и манипуляций с буфером, то третьим шагом будет необходимость узнать, какие функции подвержены этой уязвимости и какие могут действовать как «красные флаги». Функция gets отлично подходит для записи за пределами предоставленного ей buffer. На самом деле это качество распространяется на все семейство связанных возможностей, включая strcpy, strcmp и printf/sprintf, везде, где используется одна из этих функций уязвимости переполнения.

Альтернативная защита

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

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

Недостаток заключается в том, что язык C не предоставляет стандартную, безопасную альтернативу этим функциям. Тем не менее имеется и позитив — доступность нескольких реализаций для конкретной платформы. OpenBSD предоставляет strlcpy и strlcat, которые работают аналогично функциям strn, за исключением того, что они усекают строку на один символ раньше, чтобы освободить место для нулевого терминатора.

Аналогично Microsoft предоставляет свои собственные безопасные реализации часто используемых функций обработки строк: strcpy_s, strcat_s и sprintf_s.

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

Ссылки [ править ]

  1. ^ Фитен, Уильям Л .; Сикорд, Роберт (27 марта 2007 г.). . США CERT .
  2. ^ Дауд, Марк; Макдональд, Джон; Шух, Джастин (ноябрь 2006 г.). Искусство оценки безопасности программного обеспечения . Эддисон Уэсли . С. 169–196. ISBN 0-321-44442-6.
  3. ^ Леви, Элиас (1996-11-08). . Phrack . 7 (49): 14.
  4. Пинкус, Дж .; Бейкер, Б. (июль – август 2004 г.). . Журнал IEEE Security and Privacy Magazine . 2 (4): 20–27. DOI .
  5. Burebista. . Архивировано из 28 сентября 2007 года. (мертвая ссылка)
  6. Бертран, Луи (2002). . MUSESS ’02: Симпозиум по разработке программного обеспечения Университета Макмастера . Архивировано из на 2007-09-30.
  7. pr1. .
  8. Любопытно (2005-01-08). . Phrack . 11 (63): 16.
  9. Соварел, Ана Нора; Эванс, Дэвид; Павел, Нафанаил. .
  10. Zhodiac (2001-12-28). . Phrack . 11 (58): 11.
  11. Фостер, Джеймс С .; Осипов, Виталий; Бхалла, Ниш; Хайнен, Нильс (2005). . Соединенные Штаты Америки: ISBN Syngress Publishing, Inc.  1-932266-67-4.
  12. Nergal (2001-12-28). . Phrack . 11 (58): 4.
  13. Checkoway, S .; Davi, L .; Дмитриенко, А .; Садеги, АР; Shacham, H .; Винанди, М. (октябрь 2010 г.). «Обратно-ориентированное программирование без возврата». Материалы 17-й конференции ACM по компьютерной и коммуникационной безопасности – CCS ’10 . С. 559–572. DOI . ISBN 978-1-4503-0245-6.
  14. . wiibrew.org . Проверено 18 января 2018 .
  15. . wiibrew.org . Проверено 18 января 2018 .

Методы безопасной разработки

Облачная служба Veracode выявляет уязвимости кода, такие как переполнение buffer, поэтому разработчики устраняют их до того, как они будут использованы. Уникальная в отрасли запатентованная технология тестирования безопасности бинарных статических приложений (SAST) Veracode анализирует его, включая компоненты с открытым исходным кодом и сторонние, без необходимости доступа к нему.

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

SAST выявляет критические уязвимости, такие как внедрение SQL, межсайтовый скриптинг (XSS), ошибку переполнения буфера, необработанные состояния ошибок и потенциальные закоулки. Кроме того, двоичная технология SAST предоставляет полезную информацию, которая определяет приоритеты в зависимости от серьезности и предоставляет подробную инструкцию по исправлению.

Уязвимость переполнения buffer существует уже почти 3 десятилетия, но она по-прежнему обременительна. Хакеры по всему миру продолжают считать ее своей тактикой по умолчанию из-за огромного количества восприимчивых веб-приложений. Разработчики и программисты затрачивают огромные усилия для борьбы с этим злом IT-технологий, придумывая все новые и новые способы.

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

Последствия ошибки

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

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

Чтобы быть совсем точным, следует отметить, что подобное описание событий верно лишь для компиляторов, компилирующих в “родной” (native) код. В управляемых языках у виртуальной машины есть свой стек для управляемых программ, за состоянием которого гораздо проще следить, и можно даже позволить себе при возникновении переполнения передать программе исключение. В языках Си и Си++ на подобную “роскошь” рассчитывать не приходится.

Исправить ошибку DRIVER OVERRAN STACK BUFFER

Если вы не можете войти на рабочий стол из-за синего экрана, который может уходить в цикл, то вам нужно загрузиться в безопасный режим через дополнительные параметры при загрузке. Они должны появится автоматически после 3-5 раза ошибки. Если не появляются, то перезагрузите компьютер 4-5 раз, доходя до ошибки. Первым делом попробуйте:

Удалить обновление

Если ошибка DRIVER OVERRAN STACK BUFFER стала появляться после обновления системы, то вы можете удалить последний установленный патч в дополнительных параметрах.

Восстановление при загрузке

Нажмите восстановление при загрузке. Это должно исправить проблемы с загрузчиком, если проблема в нем.

Безопасный режим

Если не помогло, то загрузитесь в безопасном режиме, нажав на “Параметры загрузки” > “Перезагрузить” > и нажать F5 (безопасный режим с загрузкой сетевых драйверов) и следуйте ниже способам.

1. Запустите CMD

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

Перейдите в центр обновления Windows 10 и установите их, если они имеются.

3. Драйвера

Нажмите Win+X и выберите “диспетчер устройств”. Попробуйте выявить, какие драйвера могут быть повреждены или конфликтовать с компонентами вашего ПК. Если сомневаетесь, то с уверенностью можете начать с драйвера Atheros, который отвечает за беспроводную сеть. Именно он и выдавал ошибку DRIVER OVERRAN STACK BUFFER на одном из моих компьютеров в офисе

Также, рекомендую уделить внимание на драйвер видеокарты

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

4. Удалить ПО

Сторонние программы могут вызывать различные конфликты в системе и вызывать синий экран. У некоторых пользователей на форуме Microsoft, ошибку DRIVER OVERRAN STACK BUFFER, вызвала программа Deamon Tools. Также, рекомендую удалить сторонний антивирус, если он установлен. Постарайтесь выявить программы, которые вы недавно установили, и после этого началась ошибка синего экрана.

В панели управления в пункте электропитание отключите “Быстрый запуск”, сняв галочку.

6. RAM

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

7. Восстановление системы

Если вы не отключали автоматическую точку восстановления, то вы можете откатить систему назад на пару дней в рабочее состояние. Перейдите в дополнительные параметры загрузки (1 риск) и нажмите на “Восстановление системы”. Далее следуйте рекомендациям помощника на экране.

Смотрите еще:

  • Проверка плохих драйверов с Windows Driver Verifier
  • Ошибка BUGCODE_USB_DRIVER в Windows 10
  • Ошибка THREAD_STUCK_IN_DEVICE_DRIVER 0x000000EA BSOD
  • Исправить ошибку DRIVER_POWER_STATE_FAILURE в Windows 10 
  • Обнаружено переполнение стекового буфера в Windows 10 

Загрузка комментариев


Канал
Чат

Что делать, если обнаружена уязвимость в данном приложении

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

Рассмотрим, несколько способов, как исправить ошибку, если произошло переполнение стекового буфера Windows 10.

Использование антивирусного ПО

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

Рекомендуется просканировать систему на вирусы, можно в безопасном режиме, если ОС не загружается, и выполнить проверку и устранение угроз посредством встроенного Защитника Windows.

Как очистить компьютер от вирусов при появлении ошибки «Стековый буфер переполнен»:

  • Открываем Защитник Windows через поисковую строку меню «Пуск» или в области уведомлений на панели задач;
  • Выбираем «Защита от вирусов и угроз» и переходим к параметрам сканирования;
  • Отмечаем флажком «Автономное сканирование Защитника Windows» и жмём соответствующую кнопку для начала проверки.

Чистая загрузка ОС Windows

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

Для чистой загрузки Windows выполняем следующие действия:

  1. Открываем консоль «Выполнить» (Win+R), вводим в поле команду msconfig, жмём «Ок» или клавишу Enter.
  2. В окне «Конфигурация системы» на вкладке «Общие» снимаем отметку с пункта «Загружать элементы автозагрузки». Затем на вкладке «Службы» отмечаем пункт «Не отображать службы Майкрософт» и жмём кнопку «Отключить все».
  3. Идём на вкладку «Автозагрузка» и жмём ссылку «Открыть диспетчер задач» (для Windows 10), в открывшемся окне Диспетчера задач поочерёдно отключаем каждую программу в списке.
  4. Возвращаемся к окну конфигурации и жмём «Ок», после чего перезагружаемся и проверяем, исчезла ли ошибка.

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

Специализированный софт

В сети есть немало лечащих утилит (Dr.Web CureIt, Kaspersky и др.), способных избавить компьютер от вирусов. Портативные программы не будут конфликтовать с уже установленным антивирусом и эффективно выполнят задачу сканирования и удаления вредоносного ПО. Есть также антивирусный софт, способный решать проблему на низком уровне, если вирусы не дают системе запуститься. Используя утилиты с обновлённой вирусной базой, можно исправить, в том числе ошибку переполнения стекового буфера.

Восстановление Windows

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

  • отключаем от компьютера лишние устройства, не требуемые для работы;
  • вставляем загрузочный накопитель и загружаемся с него, предварительно выставив приоритет загрузки в BIOS;
  • выбираем «Восстановление системы» – «Диагностика» – «Дополнительные параметры» – «Восстановление при загрузке», далее выбираем ОС, которую требуется восстановить, и ждём окончания процесса, перезагружаемся.

Крайней мерой, когда более простые и гуманные способы решения не помогли исправить ошибку, является переустановка Windows.

3 ответа

Лучший ответ

Функция CRT, которая обрабатывает обнаружение переполнения буфера стека, , предполагает, что повреждение кадра стека было вызвано атакой вредоносного ПО. Такая вредоносная программа традиционно использовала фильтры исключений fs: SEH (хранящиеся в кадре стека), чтобы получить обработчик исключений для запуска полезной нагрузки вредоносной программы. Один из способов заставить данные превратиться в исполняемый код.

Таким образом, функция CRT не может предполагать, что создание исключения безопасно. И больше не используется в CRT, включенном в VS2013, восходит к ~ VS2005. Он будет работать без сбоев, если ОС поддерживает его, а в противном случае гарантирует, что зарегистрированный обработчик исключений VEH / SEH также не сможет увидеть исключение. Kaboom, вылет на рабочий стол без диагностики, если у вас не подключен отладчик.

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

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

Вставьте этот код где-нибудь рядом с функцией main ():

И планирую в ближайшее время удалить его снова.

4

Hans Passant
25 Май 2016 в 21:49

Я хотел бы прокомментировать принятый ответ, но я только что присоединился, и у меня пока недостаточно репутации для этого.

Я попробовал решение с Visual Studio 2017, и мне пришлось внести несколько изменений, чтобы решение скомпилировалось.

Сначала мне пришлось изменить подпись __report_gsfailure, чтобы она соответствовала одному из файлов заголовков Microsoft, чтобы исправить ошибку компиляции.

Затем я столкнулся с ошибкой LNK2005, которую я смог исправить, добавив / FORCE: MULTIPLE в Linker-> Command Line для свойств моего проекта.

1

Ken McFadden
29 Авг 2019 в 17:26

На заданный вопрос нет решения.

Переполнение массива вызывает неопределенное поведение в стандартном C ++, поэтому конкретный результат не гарантируется. Неспособность дать надежный результат не является проблемой для компилятора – это допустимое поведение.

Я не знаю ни одной реализации, которая гарантирует какое-либо конкретное поведение в ответ на переполнение – VS, конечно же, нет. Что неудивительно, поскольку компиляторы не обязаны этого делать (что, по сути, означает неопределенное поведение). Причина этого в том, что часто бывает трудно надежно или постоянно обнаруживать такие случаи.

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

3

Peter
25 Май 2016 в 07:08

Поделитесь в социальных сетях:FacebookXВКонтакте
Напишите комментарий