مبحث یکم : مقدمه و تاریخچه
مبحث دوم: مراحل نفوذ کردن / جلوگیری از نفوذ
مبحث سوم: حملات شبکه ای
مبحث چهارم - کار عملی
مبحث پنجم - DHCP
مبحث ششم - وب و حملات مطرح در آن
مبحث هفتم - حملات DoS
مبحث هشتم - سیستم عامل
مبحث نهم - مهندسی اجتماعی
مبحث دهم - Vulnerability (آسیب پذیری)

تکنیک ‌های کلی اکسپویت

هدف: کنترل روند اجرایی برنامه ، به گونه ‌ای که رفتاری خاص را از خود نشان دهد. در بحث exploiting باید دید خوبی ‌از معماری سیستم و ساختارهای حافظه داشته باشید. آشنایی با زبان assembly ‌هم می‌تواند کمک بکند. همچنین تسلط روی برنامه نویسی و OS نیاز است.

در زبان C، وظیفه چک کردن معتبر بودن داده ها، مناسب بودن ساختار داده ‌های مورد استفاده به عهده برنامه نویس است. مثلا ممکن است شما سایز آرایه ‌ای (بافری) که قرار است نام کاربری را نگه دارد 25 کاراکتر تعریف کرده باشید اما کاربر در زمان وارد کردن مقدار نام کاربری، 100 کارکتر وارد کند. حال اگر شما طول ورودی کاربر را چک نکنید،‌ برنامه شما می‌تواند به مشکل بخورد (crash‌کند و یا رفتار دیگری نشان دهد).

Exploit‌‌ها با تغییر روند برنامه اصلی و اجرای برنامه ‌های موردنظر نفوذگر منجر به حمله می گردند.

دو دسته کلی exploit را می‌توان بیان کرد. Format String – Buffer overflow

در شکل 2 ساختارحافظه نمایش داده شده است.

شکل 2

یک برنامه زمانی که اجرا می‌شود قسمت ‌های مختلفی در حافظه برایش در نظر گرفته می‌شود. قسمت ‌های مختلفی که برای یک برنامه در حافظه در نظر گرفته می‌شود عبارت اند از text segment که دستورات و کدهای برنامه در این قسمت قرار می‌گیرند. Heap که برای ذخیره  متغیرها (مثلا در زبان C++ حافظه ‌ای که با دستور new اختصاص داده می‌شود از این قسمت است). قسمتی که در اینجا مدنظر است قسمت stack (پشته) است. فرض کنید که یک تابع داریم که دارای چند آرگون ورودی است. زمانی که تابع فراخوانی می‌شود ابتدا آدرس بازگشت در stack‌ ذخیره می‌شود بعد هم آرگومان ‌های که تابع ذخیره می‌شوند. شکل 3 فضایی از یک کد زبان C است و شکل 4 نیز وضعیت حافظه پشته برای کد شکل 3 است. در شکل 4، پس از اجرای تابع second function محل آن در پشته حذف می‌شود و به همین ترتیب برای first function و …

شکل 3

شکل 4

سر ریز بافر: مسئولیت جامعیت داده­‌ها به عهده برنامه نویس است. به هنگام تخصیص حافظه هیچ کنترلی روی قرار گیری داده در فضای تخصیصی نداریم. اگر برنامه نویس داده 10 بایتی را در 8 بایت بنویسد دو بایت سر ریز می‌کند. این مقدار سر ریز شده روی یک خانه دیگر حافظه نوشته می‌شود.

مثلا در شکل 5 یک کد خیلی ساده را می بینید. به تابع foo ( )، دقیقا مقداری را که از ورودی  خط فرمان (command line input) گرفته می‌شود،‌پاس می‌شود. تابع foo‌ نیز این مقدار را در یک آرایه 12 کاراکتری کپی می‌کند (بدون اینکه کنترلی روی سایز آن مقدار ورودی داشته باشد).

شکل 5

در شکل 6 ساختار stack‌را می بینید.

شکل 6

شکل 7 برای زمانی است که کلمه hello را وارد می‌کنیم. شکل 8 زمانی را نشان می‌دهد که داده غیر عادی وارد کنیم. همانطور که می بینید این داده در بقیه قسمت ‌های حافظه هم جانویسی شده است.  به این مسأله سرریز بافر (buffer over flow) می گوییم.

شکل 7

شکل 8

اسکرول به بالا