Редактировать: просто перечитайте название вашей проблемы. Вы хотите знать, почему это называется Stack Smash. Когда вы вызывали функцию, массив которой был создан в C, генерировали фрейм для всех ваших локальных переменных, аргументы функции и адрес возврата для функции. Этот кадр был сделан в стеке и известен как кадр стека; звучит достаточно справедливо. Предполагается, что этот кадр стека принадлежит только этой функции и имеет границы от других кадров стека вокруг него; если это может изменить другие кадры стека, последствия могут быть ужасными. Это разрушило бы всю идею «функции имеют свою область видимости». Поэтому, поскольку ваш массив является локальной переменной, он был помещен в этот кадр стека, и когда вы поместили в него слишком много информации, вы писали, просто продолжали писать, пока не достигли границы кадра стека, а затем продолжили, C будет позволь тебе сделать это. Он устанавливает границы и позволяет вам нарушать их по желанию. Этот выход за пределы фрейма называется «разбиванием» стека, потому что вы перебрали другие важные данные. Разрушение стека уничтожает данные стека, записывая туда, куда не следует.
Я должен начать с того, что он не даст вам слишком много информации, если вы не узнаете, какие инструкции c были помещены в какую часть памяти.
Backtrace сообщает вам, какой код был запущен непосредственно перед тем, как произошел сбой; а именно ваша программа, которая вызвала код libc в массиве, который вы переполнили.
Карта памяти показывает, какие части памяти были выделены для чего, например, где вы программируете, где находятся библиотеки, где они называются, где находится куча и где находится стек. Он также дал вам разрешения для этих областей памяти rwxp (чтение, запись, исполняемый файл, PROC_STACK), хотя я не уверен насчет бита PROC_STACK.
По сути, если вы не знаете отображения вашей программы в памяти, это бесполезная информация. Вы также можете использовать свой отладчик, который гораздо полезнее. Это говорит вам о нескольких вещах:
- Ваша программа сломалась в libc, что может означать множество вещей.
- Вы разбили стек своим кодом.
Я предполагаю, что вы знаете, что ваш массив был инициализирован в кадре стека для вызывающей его функции, и поэтому, когда вы выдавили слишком много значений, вы вышли из кадра и разбили стек.
Надеюсь, это поможет. Если вы хотите узнать больше, просто спросите.