Как включить переполнение буфера?

Я только что установил 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;
}
1
задан 18 July 2018 в 08:23

4 ответа

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

int main(int argc, char *argv[]) {
    return main(argc, argv);
}

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

Затем вы получаете stack smashing detected из стека протектора gcc. Вы можете отключить его, используя gcc -fno-stack-protector. Конечно, никогда не делайте этого с программами, которые вы собираетесь запускать для производства.

0
ответ дан 18 July 2018 в 08:23

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

Кроме того, насколько мне известно, «переполнение стека» - это ошибка времени выполнения, которая обычно возникает, когда вы пытаетесь сохранить что-то, размер которого больше размера выделенного стека.

0
ответ дан 18 July 2018 в 08:23

Вы не можете «включить переполнение стека» - это имя класса ошибок, которые могут произойти в Си и других языках. Подробности см. В статье Википедии .

Итак, по сути, переполнение стека - это то, что происходит с вашей программой и что заставляет программу завершаться.

В простой программе: либо достаточно долго смотреть на код до тех пор, пока вы не увидите ошибку, либо использовать отладчик (называемый gdb) для пошагового выполнения программы, это поможет вам найти проблему.

0
ответ дан 18 July 2018 в 08:23

В этом вопросе о переполнении стека перечислены почти все возможные способы вызвать переполнение стека во многих языках.

0
ответ дан 18 July 2018 в 08:23

Другие вопросы по тегам:

Похожие вопросы: