В ответ на часть 2 вашего вопроса: в зависимости от того, что вы делаете, вы можете поместить значение в esp
(в виде массива arg). Если это конец шеллкода, тогда вы в порядке. Однако, если есть больше кода оболочки, и вы, возможно, делаете push
и, то esp
, как оказалось, находится где-то в остальной части вашего шеллкода, у вас могут быть проблемы (потому что в этот момент вы будете писать по своим собственным инструкциям). Простое исправление - сделать что-то вроде sub $0x99, %esp
в самом начале шеллкода.
EDIT (в ответ на комментарии)
Может быть, я неправильно понял вопрос. Когда вы сказали «переполнение стека», я предположил, что вы имели в виду переполнение буфера. Если я правильно понял, тогда читайте дальше. Предполагая, что вы действительно говорите о классической эксплоите с разбивкой стека (что, по-видимому, основано на картине, с которой вы связались), вы заполняете буфер с помощью санки nop
, shellcode
и, наконец, перезаписываете возвращаемый указатель , Код оболочки - «независимый от позиции код».Это означает, что это серия инструкций, которые могут быть выполнены независимо от текущего состояния регистров, флагов и т. Д.
Как правило, это также ссылка, которую вы размещаете, она заполняет буфер nops, за которым следует шеллкод, и, наконец, обратный адрес, который указывает где-то в tho nop sled. Когда выполняется команда ret
, адрес в %esp
вводится в %eip
, а %esp
увеличивается на 4 (на x86). Проблема заключается в том, что если ваш шеллкод имеет несколько команд push
, это имеет побочный эффект декремент%esp
. Если у вас их достаточно и, ваш шелл-код будет полностью в конце (т. Е. Рядом с обратным адресом), то вы можете в конечном итоге переписать свой шелл-код с помощью инструкций push
.
Итак, чтобы ответить на ваш вопрос. Нет, нет «механизма», чтобы отделить ваш шеллкод от «его стека». Это связано с тем, что для вашего шеллкода нет стека per-se. Помните, что это независимый от позиции код. Он должен иметь возможность запускать независимо от состояния машины. Любое управление стеком, которое должно произойти, должно выполняться самим шеллкодеком. Вот почему я предложил sub $0x99, %esp
в начале шеллкода, если в коде есть много операторов push
. Другим вариантом является наличие достаточного пространства между обратным адресом (который укажет %esp-4
) и вашим шеллкодом.
Я не уверен, что обсуждение механики атаки переполнения стека на открытом форуме - хорошая идея - я что-то упускаю? – Floris
'leave' - это тот, который делает вещь с' ebp'. – harold
@Floris Почему бы и нет? Безопасность, пряча голову в песок, никогда не помогала никому в долгосрочной перспективе. – Thomas