Создать переполнение стека - PullRequest
0 голосов
/ 25 декабря 2008

Как создать условие переполнения стека в GNU / linux?

Ответы [ 8 ]

12 голосов
/ 25 декабря 2008

рекурсивная функция без выхода должна сработать

псевдокод, мой c немного ржавый

void stack_overflow()
{
   stack_overflow();
}
9 голосов
/ 25 декабря 2008

Я бы порекомендовал прочитать статью в журнале Phrack "Разбить стек ради удовольствия и прибыли" Он также содержит пример кода.

4 голосов
/ 25 декабря 2008

Вам просто нужно подумать о том, что использует стек в C.

  • Динамическое выделение памяти (с malloc()) использует кучу;
  • Локальные переменные и стеки вызовов функций используют стек.

Итак, все, что вам нужно сделать, это исчерпать стек. Это может сделать либо бесконечная рекурсия в функции, либо создание большой локальной переменной (не позволяйте их очистить, хотя и выходя из области видимости).

4 голосов
/ 25 декабря 2008

В статье Википедии есть примеры кода . Почему ты хочешь, чтобы кто-то был за мной ...

1 голос
/ 05 июля 2012

Многие примеры были приведены здесь в других ответах. Но каждый, кажется, пропустил это.

Чтобы вызвать переполнение стека, нужно понять, каков размер вашего стека. В Linux размер стека по умолчанию составляет 8 МБ.

 ulimit -a         //would give you the default stack size 
 ulimit -s 16384   // sets the stack size to 16M bytes

Таким образом, вы можете вызвать переполнение стека даже с массивом, скажем, 100 целых чисел, если вы настроите размер стека так, чтобы он был очень мал.

1 голос
/ 25 декабря 2008

С помощью alloca () или strdupa ()

0 голосов
/ 26 декабря 2008

"как создать условие переполнения стека в linux"

Точно так же, как при переполнении стека в Windows.

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

    int Add(int num)
    {
        num += Add(num);
        return num;
    }
0 голосов
/ 26 декабря 2008

Самый простой способ - просто объявить достаточно большую автоматическую переменную стека. Никакой рекурсии или alloca не требуется. Интересно, что это не ошибка во время компиляции. Необходимый размер зависит от платформы:

#define SIZE 10000000

int main(int argc, char **argv)
{
    char a[SIZE];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...