امروز با شروع يكي از مفاهيم پركاربرد در بحث تست نفوذ با شما همراه هستيم. Buffer overflow Exploitation يكي از تكنيك هاي پركاربرد در نفوذ به سيستم ها ميباشد كه اجراي صحيح آن نيازمند داشتن دركي كامل از مفهوم Buffer overflow است.
يك Stack بلوك هاي بهم پيوسته از مموري است كه توسط توابع مورد استفاده قرار ميگيرند. در قرارگيري و يا حذف ديتا از Stack، از دو ساختار استفاده ميشود: "PUSH" كه ديتا را روي Stack قرار ميدهد و "POP" كه ديتا را از روي Stack بر ميدارد. Stack بر اساس Last in First out “LIFO” كار ميكند. به اين معني كه آخرين ديتايي كه وارد Stack ميشود، اولين ديتايي است كه از Stack خارج ميشود.در معماري x-86 اينتل، حداكثر سايز ديتاي وارد شده به Stack، WORD ناميده ميشود.
فقط 4 بايت (32بيت) براي هر عمل PUSH يا POP مجاز است.اشارهگر ESP به بالاي Stack اشاره ميكند. Stackها بشدت از لحاظ كاري با توابع رابطه نزديكي دارند. از Stack براي نگهداري آرگومان هاي توابع و همچنين تخصيص خودكار فضا به متغيرهاي محلي استفاده ميشود.Stack شامل فريم هايي است كه در مواقع فراخواني يك تابع عمل Push و در هنگام اتمام توابع عمل pop را انجام ميدهند. توابع با كمك محلي كه ESP به آن اشاره ميكند، به متغيرهاي محلي خود دسترسي پيدا ميكنند؛ هنگامي كه WORD ها از Stack وارد و يا خارج ميشوند، پيشنهاد ميشود كه در اين فرايند از چيزي به نام Frame Pointer(FP) استفاده كنيد.
FP آدرس فعلي از Stack را در رجيستر EBP نگه ميدارد. بنابراين تابع ميتواند با استفاده از جايي كه EBP نشان ميدهد، متغيرهاي محلي خود را مرجع قرار دهد.
Stack based Buffer overflow يكي از آسيب پذيري هاي متداول است. اين اسيب پذيري بر هر تابعي كه ورودي خود را بدون چك كردن باند ها بر روي مموري كپي ميكند، اثر ميگذارد. مانند :
Strcpy(), memcpy(), gets() و ... اما Buffer overflow چه موقعي اتفاق مي افتد؟ يك Buffer overflow زماني رخ ميدهد كه يك تابع داده خود را بدون انجام فرآيند چك كردن باندها به يك بافر كپي كند. در اين صورت اگر سايز داده هاي ورودي بيشتر از سايز بافر مقصد باشد، اين ديتا از سمت آدرس بالاي مموري سرريز خواهد كرد و احتمالا روي داده هاي قبلي موجود در Stack قرار خواهد گرفت (Overwrite).
با تفاسير، چگونه ميتوان از اين آسيب پذيري سوء استفاده كرد؟ سوء استفاده ( Exploitation) از يك Stack بر مبناي Buffer overflow، در حالت كلي به فرآيند Overwrite كردن آدرسي از كد شل خودمان بر روي آدرس برگشت تابع اطلاق ميشود.
مثال زير را در نظر بگيريد:
قبل از رخداد Buffer overflow
پس از رخداد buffer overflow
سربلند و مانا باشید.
نویسنده: احسان امجدی
منبع: انجمن تخصصی فناوری اطلاعات ایران
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.
کارشناس امنیت اطلاعات و ارتباطات
احسان امجدی ، مشاور امنیت اطلاعات و ارتباطات و تست نفوذ سنجی ، هکر کلاه سفید ، مدرس دوره های تخصصی امنیت اطلاعات و شبکه ، تخصص در حوزه های سرویس های مایکروسافت ، Routing و Switching ، مجازی سازی ، امنیت اطلاعات و تست نفوذ ، کشف جرائم رایانه ای و سیستم عامل لینوکس ، متخصص در حوزه SOC و ...
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود