*** Обнаружено разрушение стека ***: <unknown>прекращено Прервано (сброшено ядро) Ошибка иногда возникает? - PullRequest
1 голос
/ 09 апреля 2020

Я выполняю домашнее задание (из-за этого не могу опубликовать код), и очень редко получаю эту ошибку во время выполнения:

* обнаружено разрушение стека *: прекращено Прервано (ядро сброшено)

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

Спасибо you!

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

1 Ответ

1 голос
/ 09 апреля 2020

*** stack smashing detected *** ошибка возникает, когда, как следует из названия, вы sma sh стек , что означает, что у вас переполнение буфера и канарейка перезаписывается другим значением , Это механизм безопасности, реализованный gcc / g ++ для предотвращения эксплойтов переполнения буфера с использованием -fstack-protector.

. Чтобы избежать этой ошибки, отключите fstack-protector в g cc при компиляции кода с использованием

* 1011. *

Редактировать 1
Однако отключение защиты стека устранит эту ошибку, но вы можете получить segmentation fault в результате перезаписи стека.

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

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

You необходимо настроить компилятор, чтобы облегчить переполнение буфера.

Edit 2

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

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

Это означает, что распределение адресного пространства является случайным, и байты между вашими векторами каждый раз различаются. Иногда переполненный буфер не доходит до канарейки, а иногда и доходит. Чтобы получить согласованное поведение каждый раз, вам также необходимо отключить ASLR. Поддержка ASLR обеспечивается вашей ОС. Чтобы отключить ASLR, на linux его отключают, установив randomize_va_space на 0. Этого можно достичь с помощью

echo 0 > /proc/sys/kernel/randomize_va_space
...