Подтвердить что ты не робот

Как переполнение буфера используется для использования компьютеров?

Как переполнение буфера используется для использования компьютеров?

Как можно произвольно выполнить произвольный код, вызывая stack или heap переполнения?

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

4b9b3361

Ответ 1

Это наиболее широко известный документ на эту тему: Разрушение стека для удовольствия и прибыли

Однако "переполнение стека" не имеет ничего общего с переполнением буфера. Переполнение стека, как правило, является просто ошибкой в ​​плохом коде, который нельзя использовать для чего-либо за пределами сбоя (DoS).

Изменить: вы также спросили о переполнении кучи. Это хороший документ по этому вопросу: http://www.w00w00.org/files/articles/heaptut.txt

Ответ 2

Стек содержит как данные, так и адрес возврата при переходе в подпрограмму. Если вам удастся указать конкретный адрес в стеке, где находится обратный адрес, вы можете заставить CPU перейти в конкретную ячейку памяти, где вы разместите свой собственный код. Это для переполнения буфера. Переполнение кучи немного отличается и труднее использовать.

Переполнение стека - это просто указание, что у вас закончилось пространство стека (которое, как правило, более ограничено, особенно в ядре).

Ответ 3

Представьте себе два дома на улице. Один из них - дом вашего друга, а один - его злой параноидный соседский дом с тремя дверьми. Злой параноидный сосед никогда не входит или не уходит, и его место заперто.

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

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


Замените следующие термины, и вы увидите аналогию с атакой переполнения буфера:

  • "ваш друг дома" → "часть программы, которая не проверяет переполнение буфера"
  • "его злой параноидальный соседний дом" → "другая часть программы, которая должна быть безопасной"
  • "boxes" → "аргументы/параметры для программы, которая не проверяет переполнение буфера"

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

Ответ 4

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

void make(char *me)
{
    char sandwich[4]; // local data, this is in stack.  the buffer for data is too small
    strcpy(sandwich, me);
    puts(sandwich);

    // implicit "return;" the return instruction(RET on Intel) instructs the processor to implicitly pop an address from stack then resume execution on that address
}

void main()
{
    // calling a subroutine (CALL on Intel) implicitly instructs the processor to push the next instruction address(getchar line) on stack before jumping to make.
    make("Love Not War"); 
    getchar();

    puts("This will not execute.  The address to next instruction(getchar) gets overwritten with Not War");

}

"Кроме того, должен ли вредоносный код третьей стороны записываться на языке ассемблера целевых процессоров?" Да

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

Ответ 5

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