Prologue and Epilogue Procedures

Prologue and Epilogue Procedures

Mahdi

در بحث نحوه ی کارکرد Stack و درکل Memory دوتا فرآیند داریم به اسم Prologue و Epilogue 

اول بریم سراغ Prologue :

این فرآیند به یک سری مراحلی اطلاق میشه که Stack رو آماده میکنند برای رزرو شدن توسط Function Call ها. و Return Address رو ذخیره میکنه تا فرآیند Return با مشکل مواجه نشه

مراحل Prologue : 

1.EBP Address Pushed onto Stack as "SFP"

2. ESP Address Copied to EBP and they now Both Point to the SFP on the Stack


[1] در مرحله اول آدرسی که در EBP ذخیره شده به عنوان SFP یا Stack Frame Pointer کپی میشه داخل stack

[2] در مرحله دوم آدرسی که در رجیستر ESP ذخیره شده کپی میشه داخل رجیستر EBP و هردوی اونها یعنی هم ESP و هم EBP به یک آدرس اشاره میکنند که اون آدرس همان SFP هست.


اما پروسه ی Epilogue :

این فرآیند به پروسه هایی اطلاق میشه که استک رو پاکسازی میکنن تا دوباره قابل رزرو بشه و اطلاعات اضافی رو پاک میکنه.

مراحل Epilogue :

ابتدا آدرسی که به عنوان SFP داریم انتقال پیدا میکنه به ESP تا از این به بعد ESP به SFP اشاره کنه و فضایی که SFP اشغال کرده آزاد بشه

در مرحله دوم EBP برگردانده میشه به جای اصلی خودش که کف استک هست (الان داره به SFP اشاره میکنه ولی بعد اینکار برمیگرده سرجاش)

مرحله سوم Return Pointer میاد و EIP رو هدایت میکنه به سمت فراخوان Function بعدی (Function Caller)

و بعد از این مراحل فضایی که دیتا های old و بلا استفاده اشغال کردن آماده ی overwrite شدن میشن.


اما یک مسئله ای که هست اینه که زمانی که مدل ذخیره سازی(storage-class) توابع برنامه از نوع Naked باشهاون موقع چه اتفاقی میوفته؟

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

t.me/Bitsecurityteam

Report Page