-
یک شنبه 05 فروردین 1386, 11:00 صبح
#6
کاربر دائمی
بیبن پشته بیشتر برای بار گ
ذاری توابع به کار می رن :: یعنی در هنگان اجرای برنامه :: زمانی که میرسه به یک تابع چی میشه
اون تابع در پشته بار گذاری میشه
خوب حالا چی جوری بارگذاری میشه :: اول از همه return هست که یعنی این که بعد از اتمام
تابع به اولین دستوره بعد در برنامه هدایت بشه ::: بعدیش ارگومان هاست و هر چی دیگه بمونه یک فضایی هست برای متغییر های محلی بکار برده میشه
حالا فکر کن این متغییر؛ارایه محلیه ما 10 تا اندیس داره :: خوب برای این که به سریز بوجود بیاد از توابعی استفاده می شه که در مدیریت ضعیفی داره تو کنترل متغییر ها مثل
strcat:::gets:::memcpy::scanf:::,................. ..................
خوب وقتی اندازه ارایه 10 باشه و متغییری که در اون کپی بشه 700 تا باشه چی میشه؟؟
سرریز اتفاق میافته :: یعنی فپایی که برای متغغیر ها در پشته در نظر گرفته شده پر میشه و بقیش وارد فضای ارگومان ها و قسمت return میشه و حالا فکر کن این ها که وارد میشن
یک سری دستورات ماشین باشه و به return بگه بعد از اتمام تابع این جا برو و این یکی برنامرو اجرا کن!!
دقیقن به همین صورت انجام میشه ::: حالا احتمال داره شما ادرسی که تو حافظه حدس زده اید
اشتباه باشه یعنی یکم خطا داشته باشه :: اون وقت میان برای از بین بردن این احتمال دستورات ماشین رو تو دستورات هرزه قرار میدن ::: دستورات هرزه دستوراتی هست که هیچ ضرری برای برنامه ندارن مثل nop که قدیما از همین دستور استفاده میکردن :::
اما از اون جایی که سیستم مزاحمت یاب IDS به nop هایی که پشتش دستورات ماشین باشه حساس شده اند و به اونوان مزاحمت در نظر میگیرند اومدن به جایه nop از دستورات هرزه دیگه مثل MOV EAX,EAX استفاده میکنند
میبینید که EAX رو در خودش cut کرده یعنی انگار هیچ کاری نکرده (دستورات هرزه)
با این روش خطایی که تو حدس زدنه ادرس حافظه داشتید از بین میبره
برچسب های این تاپیک
قوانین ایجاد تاپیک در تالار
- شما نمی توانید تاپیک جدید ایجاد کنید
- شما نمی توانید به تاپیک ها پاسخ دهید
- شما نمی توانید ضمیمه ارسال کنید
- شما نمی توانید پاسخ هایتان را ویرایش کنید
-
قوانین سایت