Когда выполняется эпилог функции? - PullRequest
0 голосов
/ 02 июня 2019

Здравствуйте! Я анализирую возвращение к атаке на libc и обнаружил полезный веб-сайт со схемой, показывающей переполнение буфера до (справа) и после (слева), предназначенное для возврата к атаке на libc. Обратный адрес перезаписывается адресом системы.

Я не совсем понимаю порядок исполнения эпилога функции. Будет ли сохраненное значение ebp вставлено в ebp до того, как функция вернется к адресу system ()? Я прочитал, что «эпилог функции выполняется после завершения функции». В какой момент эта функция точно завершается? Я не думаю, что это до вызова system(), потому что это будет означать, что перезаписанный сохраненный ebp, содержащий 4 crappy bytes, будет сохранен в ebp. Но я хочу убедиться. Буду признателен за любую оказанную помощь.

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Я не совсем понимаю порядок выполнения функции эпилог. Будет ли сохраненное значение ebp вставлено в ebp до функция возвращает адрес системы ()?

Да. Возвращение к адресу возврата является последним действием, которое можно разумно считать действием функции, а не ее вызывающей стороны.

Я прочитал это «эпилог функции выполняется по окончании функции». В в какой момент эта функция точно завершается?

Какая функция? Вы не представили один. Но в общих терминах C функция завершается, когда выполняет оператор return или когда завершается выполнение последнего оператора в его теле. Это «прекращение», к которому относится документ.

Я не думаю, что это перед звонком system()

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

потому что это будет означать перезаписанные сохраненные EBP, содержащий 4 дерьмовых байта, будет храниться в EBP.

Да, но это не имеет значения, потому что esp установлено правильно. Затем Control переходит к точке входа system(), где пролог функции устанавливает esp в качестве нового ebp, и устанавливается новый esp. Поэтому эта функция имеет допустимые границы стека, поэтому она работает правильно. Плохие вещи могут случиться, когда system() возвращается, потому что адрес возврата определяется 4-мя дерьмовыми байтами, но нам все равно - мы наносим весь ущерб, который хотим нанести в оболочке, которую мы заставили system() предоставьте нам, прежде чем system() когда-либо вернется.

0 голосов
/ 02 июня 2019

Функция прекращается, когда:

  • выполняет оператор возврата, функция достигает своего конца (т.е. нет операторов C для выполнения)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...