Я не совсем понимаю порядок выполнения функции
эпилог. Будет ли сохраненное значение ebp
вставлено в ebp
до
функция возвращает адрес системы ()?
Да. Возвращение к адресу возврата является последним действием, которое можно разумно считать действием функции, а не ее вызывающей стороны.
Я прочитал это
«эпилог функции выполняется по окончании функции». В
в какой момент эта функция точно завершается?
Какая функция? Вы не представили один. Но в общих терминах C функция завершается, когда выполняет оператор return
или когда завершается выполнение последнего оператора в его теле. Это «прекращение», к которому относится документ.
Я не думаю, что это
перед звонком system()
Ну тогда сюрприз! Все дело в том, что функция эпилог , которая выполняется после завершения функции, приводит к передаче управления в точку входа функции system()
. Тем не менее, обратите внимание, что для правильной интерпретации это требует раздельной перспективы. Завершение функции зависит от конкретной функции и лучше всего определяется в терминах исходного кода функции. Эпилог, с другой стороны, не имеет представления в исходном коде - он содержит дополнительные машинные инструкции, вставленные компилятором для реализации семантики функции-возврата исходного языка.
потому что это будет означать перезаписанные сохраненные
EBP, содержащий 4 дерьмовых байта, будет храниться в EBP.
Да, но это не имеет значения, потому что esp
установлено правильно. Затем Control переходит к точке входа system()
, где пролог функции устанавливает esp
в качестве нового ebp
, и устанавливается новый esp
. Поэтому эта функция имеет допустимые границы стека, поэтому она работает правильно. Плохие вещи могут случиться, когда system()
возвращается, потому что адрес возврата определяется 4-мя дерьмовыми байтами, но нам все равно - мы наносим весь ущерб, который хотим нанести в оболочке, которую мы заставили system()
предоставьте нам, прежде чем system()
когда-либо вернется.