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