Mahdi
Mahdi
خواندن ۲ دقیقه·۲ سال پیش

Prologue and Epilogue in Stack

این دو فرایند از جمله فرایند هایی هستند که در بررسی کارکرد Stack باید مورد مطالعه قرار بگیرند.

╒╦Prologue :

این فرایند به طور کلی به مراحلی اطلاق میشود که Stack را آماده‌‌ی رزرو شدن توسط function call ها میکند و Return address را در آن ذخیره میکند تا فرایند Return با مشکل مواجه نشود.

╝| مراحل اتفاق افتادن Prologue :

  1. EBP address pushed onto Stack as "SFP [stack frame pointer]"
  2. ESP address copied to EBP and they now both point to SFP on the Stack
  • در مرحله اول آدرس EBP در استک ذخیره میشود که به آن SFP میگویند.
  • در مرحله بعد آدرس ESP در EBP کپی میشود و هردو به یک آدرس اشاره میکنند که همان SFP است.


╒╦Epilogue :

این فرایند به مراحلی اطلاق میشود که Stack را پاکسازی کرده و دوباره قابل رزرو میکنند.


╝| مراحل اتفاق افتادن Epilogue :

  1. ابتدا آدرسی که به عنوان SFP داریم به ESP منتقل میشود تا از این بعد ESP هم بهSFP اشاره کند و فضایی که SFP اشغال کرده آزاد بشود.
  2. در مرحله بعد EBP به جای اصلی خود برگردانده میشود که همان Stack Base یا کف استک است. تا الان به SFP اشاره میکرد اما الان به کف استک اشاره میکند.
  3. در آخر هم Return Pointer وظیفه ی هدایت EIP را به عهده میگیرد و آنرا به Function Caller بعدی هدایت میکند تا پروسه ی بعدی استک را تحویل بگیرد. اکنون تمام دیتا های قدیمی از استک پاک یا آماده ی overwrite هستند.

╝| یک مسئله‌ی دیگری که جالب توجه است این است که وقتی مدل ذخیره سازی (storage class) توابع (functions) در کدی که نوشتیم و کامپایل کردیم از نوع Naked باشد چه اتفاقی می افتد؟

- - - اتفاقی که رخ میدهد این است که وقتی کامپایلر متوجه این نوع ذخیره سازی بشود برای آن Function هیچ کدی جهت انجام این دو فرایند در نظر نمی گیرد. این مدل زمانی است که برنامه نویس میخواهد خودش کد مختص به خودش را برای این کار بنویسد.


▌The End




stackprogrammingbinaryمهندسی معکوسمعماری کامپیوتر
if you want bio, ask
شاید از این پست‌ها خوشتان بیاید