Я только что установил 12.04 (на самом деле WUBI) и хотел немного узнать о переполнении буфера. К сожалению, когда я пытаюсь использовать такие функции, как puts()
и gets()
неправильным образом (то есть вызвать переполнение буфера), gcc
сообщает мне, что обнаружил smashing the stack
и завершил мою программу.
Как включить переполнение стека?
Для большей ясности, это программа:
#include<stdio.h>
CanNeverExecute()
{
printf("I can never execute\n");
exit(0);
}
GetInput()
{
char buffer[8];
gets(buffer);
puts(buffer);
}
main()
{
GetInput();
return 0;
}
Я не думаю, что вы делаете, это переполнение стека. Вот что происходит, когда вы слишком глубоко входите в функцию, из-за чего у вас заканчиваются кадры стека.
int main(int argc, char *argv[]) {
return main(argc, argv);
}
То, что вы пытаетесь достичь, это переполнение буфера в стеке. Я думаю, что вы надеетесь написать на обратный адрес, а затем заставить его позвонить CanNeverExecute
.
Затем вы получаете stack smashing detected
из стека протектора gcc
. Вы можете отключить его, используя gcc -fno-stack-protector
. Конечно, никогда не делайте этого с программами, которые вы собираетесь запускать для производства.
Прежде всего, использование любой функции в неправильном порядке не рекомендуется. Даже если вы это сделаете, в большинстве случаев код не будет работать.
Кроме того, насколько мне известно, «переполнение стека» - это ошибка времени выполнения, которая обычно возникает, когда вы пытаетесь сохранить что-то, размер которого больше размера выделенного стека.
Вы не можете «включить переполнение стека» - это имя класса ошибок, которые могут произойти в Си и других языках. Подробности см. В статье Википедии .
Итак, по сути, переполнение стека - это то, что происходит с вашей программой и что заставляет программу завершаться.
В простой программе: либо достаточно долго смотреть на код до тех пор, пока вы не увидите ошибку, либо использовать отладчик (называемый gdb
) для пошагового выполнения программы, это поможет вам найти проблему.
В этом вопросе о переполнении стека перечислены почти все возможные способы вызвать переполнение стека во многих языках.