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

Потому что грамматика Python запрещает это. См. документацию :

stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

. Точки с запятой могут использоваться только для разделения простых операторов (а не составных операторов, таких как for). И, действительно, почти нет причин использовать их даже для этого. Просто используйте отдельные строки. Python не предназначен для того, чтобы было удобно застревать много кода на одной строке.

19
задан 20 January 2009 в 15:14
поделиться

5 ответов

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

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

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

16
ответ дан 30 November 2019 в 03:34
поделиться

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

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

8
ответ дан 30 November 2019 в 03:34
поделиться

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

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

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

<час>

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

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

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

7
ответ дан 30 November 2019 в 03:34
поделиться

Фактически все современные процессоры при вызове подпрограммы, продвигают обратный адрес на той же области как локальные данные (стек). Для стандартных программ, который не проверяет верхний предел переменной (на детали функция 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's 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
ответ дан 30 November 2019 в 03:34
поделиться

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

1
ответ дан 30 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

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