возвращаясь к адресу в стеке - PullRequest
2 голосов
/ 04 декабря 2011

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

Я должен упомянуть, что программа была разработана, чтобы позволить вам выполнять код из стека

Спасибо

Ответы [ 3 ]

1 голос
/ 04 декабря 2011

На x86, чтобы вернуться в местоположение в стека:

  LEA   EAX, offset[ESP]
  JMP   EAX

, как отметили другие, предотвращение выполнения данных может помешать фактическому выполнению процессора в области стека.после выполнения JMP.

Для возврата в местоположение, адрес которого указан в стеке :

  JMP   offset[ESP]

Аналогично, если целевое местоположение находится в «данныхстраниц ", DEP будет препятствовать выполнению.(Вы можете вызвать Windows и удалить DEP для этих данных; я не уверен, что вы можете сделать это для стека.)

1 голос
/ 04 декабря 2011

Конечно, вы можете вернуться по адресу в стеке. Но если память стека не является исполняемой (зависит от возможностей процессора и ОС), исключение нарушения доступа к памяти произойдет.

0 голосов
/ 04 декабря 2011

Обычно существует комбинация набора команд процессоров и соглашения о вызовах, которое использует компилятор. Некоторые процессоры возвращают только с использованием адресов в стеке, другие могут использовать адреса только в других регистрах, а некоторые могут решать только программисты. Естественно, вы могли бы, если хотите, вывести адрес стека для регистрации только для процессора типа ветви или поместить адрес в стек из регистра для процессора только для стека.

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

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

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

...