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