بخشی از پاورپوینت
--- پاورپوینت شامل تصاویر میباشد ----
اسلاید 1 :
بررسی روش های حمله به نرم افزارها
نرم افزارهای کاربردی
مروری بر حملات سرریز بافر
نرم افزارهای تحت وب
مروری بر حملات رایج (SQLi, XSS, Harvesting, …)
بررسی روش های کشف ضعف های امنیتی
بازبینی کد (Source-code Audit)
Fuzzing & Fault-Injection
Binary Analyzing
بررسی روش های مقابله با حملات
سیستم های محافظتی موجود در سطح سیستم عامل و سخت افزار
سیستم های محافظتی ایجاد شده توسط نرم افزارهای جانبی
اسلاید 2 :
ضعف امنیتی در نرم افزار چیست ؟
منظور از Exploit کردن یک ضعف امنیتی ؟
اهداف استفاده از ضعف های امنیتی نرم افزار
ایجاد اختلال در روال کار نرم افزار یا سیستم (DoS)
اجرای دستورالعملی خارج از روال معمول اجرای نرم افزار(Controling Software)
بدست گرفتن کنترل کامل نرم افزار یا سیستم عامل(Controling System)
nPayload چیست ؟
اسلاید 3 :
بررسی روال اجرای یک نرم افزار
اختصاص یک محدوده آدرس در حافظه برای بارگذاری دستورالعمل ها و اطلاعات لازم
بارگذاری سگمنت های تعریف شده در نرم افزار
.text : حاوی دستورالعمل های اجرایی برنامه
.bss : حاوی اطلاعات و متغیر های تعریف نشده (uninitialized data)
.data : حاوی اطلاعات و متغیر های تعریف شده (static initialized data)
اختصاص فضای Stack و Heap
اسلاید 4 :
سرریز بافر زمانی رخ میدهد که حجم اطلاعات کپی شده به بافر ، بیشتر از میزان مشخص شده برای بافر باشد.
اسلاید 5 :
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdio.h>
int Hijack()
{ cout << "This function should be hijacked!";
getchar();
return 0; }
int Function1()
{ char var1[15];
cout << "_________1234567890abcd" << endl;
cout << "Enter Var1:";
cin >> var1;
cout << var1 << endl;
return 0; }
int main()
{ Function1();
getchar();
return 0; }
اسلاید 6 :
با استفاده از روش ذکر شده ، میتوان اقدام به اجرای کد و دستورات دلخواه نمود
با توجه به اینکه داده های ارسالی ما مستقیمآ در حافظه درج میشوند ، دستورات می بایست به زبان ماشین باشد.
به دستوراتی که برای اجرا در حافظه درج میشوند اصطلاحآ Payload گفته میشود
رعایت نکردن نکاتی همچون عدم استفاده از کاراکترهای خاص (0x00) باعث بروز مشکل خواهد شد
برای اینکه بتوانیم دستورات دلخواه خود را اجرا کنیم ، میبایست آدرس دقیق آنها را پس از درج در حافظه بدانیم
روال پیاده سازی حملات در واقعیت ، بسیار پیچیده تر و مشکل تر میباشد ~
اسلاید 7 :
از دید پردازنده ، تفاوتی میان دستورالعمل ها و داده ها وجود ندارد . ورودی داده شده درصورتی که دستور زبان ماشین معتبر باشد اجرا خواهد شد.
یکی از روش های تزریق Payload درحافظه ، ارسال آن در قالب پارامترهای ورودی نرم افزار میباشد
سرریز بافر میتواند هم در فضای Stack و هم در فضای Heap رخ دهد
بسته به محل وقوع سرریز (stack / Heap overflow) نحوه تغییر روال اجرای برنامه و پرش به محل Payload متفاوت بوده وتکنیک ها و روش های مختلفی برای هر حالت وجود دارد.
قابلیت بازنویسی EIP الزامی نیست ! در نظر داشته باشید که بازنویسی هر یک از ثبات ها میتواند در نهایت منجر به اجرای Payload گردد
اسلاید 8 :
روال پیاده سازی حملات در واقعیت ، بسیار پیچیده تر و مشکل تر میباشد:
آدرس های بارگذاری توابع و Dll ها بسته به هر نسخه نرم افزار ، سیستم عامل و حتی Service Pack تغییر میکند
در برخی موارد ، آدرس ها و offset های ثابت که در تمامی نسخ یکسان هستند نیز وجود دارند
نیاز به آگاهی از آدرس دقیق دستورات درج شده (Payload) در حافظه
بر خلاف Linux ، تخمین آدرس دقیق Stack در ویندوز براحتی امکانپذیر نیست
استفاده از تکنیک Return-to-lib/dll
استفاده از NOP Sled
محدودیت در حجم دستوراتی که میتوان در بافر درج کرد
استفاده از بخش های مختلف حافظه که قابلیت تزریق در آنها وجود دارد ، و پرش بین آنها
استفاده از Payload های چند مرحله ایی
محدودیت در استفاده ازکاراکترهایی که در حافظه درج میگردد
شناسایی کاراکترهایی که پس از تزریق در حافظه دستکاری میشوند
Encode کردن Payload برای پرهیز از وجود کاراکترهای خاص
نحوه ارسال دستورات به نرم افزار
اسلاید 9 :
در زبان ماشین ، امکان مقدار دهی به EIP بصورت مستقیم وجود ندارد ( مقادیر سایر ثبات ها توسط دستوراتی چون JMP MOV CALL ... به EIP داده میشوند )
در مثالی که پیش از این ذکر شد ، با فرض اینکه ما امکان بدست آوردن آدرس دقیق Payload برای استفاده دربازنویسی EIP را در نداریم ، میبایست از مقدار بازنویسی شده سایر ثبات ها استفاده کنیم .
EBP بازنویسی شده ، پس باید به دنبال دستورالعملی باشیم که محتوای EBP را در EIP درج کند (JMP EBP)
قدم بعد ، بازنویسی EBP برای اشاره به آدرسی از حافظه است که در آن دستورالعمل JMP EBP وجود داشته باشد
نکته : توابع کتابخانه ایی پویا(DLL) همواره در آدرس های مشخصی از حافظه بارگزاری میشوند . در هر یک از DLL های موجود در حافظه ممکن است بخشی از دستورات ، دستورات مورد نظر ما باشد
ایده : جستجوی محدوده آدرس توابع کتابخانه ایی برای دستورالعمل مورد نظر ما ، و بدست آوردن آدرس (offset) آن دستورالعمل
استفاده از ابزارهایی مانند FindJump
بازنویسی EIP با 0x7c822cac محتویات EBP را در EIP بازنویسی میکند
بدین ترتیب بدون نیاز به درج آدرس Payload
بطور مسقیم در EIP ، آنرا اجرا میکنیم
nنتیجه : پایداری بیشتر در روال حمله
اسلاید 10 :
1EIP با آدرسی که به jmp ebd اشاره دارد بازنویسی میشود
2پردازنده به آدرس مراجعه کرده و دستور اجرا میشود
3محتویات EBP که به محل Nop Sled در حافظه اشاره دارد ، در EIP بازنویسی میشود
4پردازنده با توجه به EIP ، برای ادامه اجرای دستورات به آدرس Nop Sled مراجعه میکند
5پس از پایان Nop پردازنده به دستور پرش به Nop Sled دوم میرسد
6Nop Sled دوم اجرا شده و روال در نهایت به اجرای Payload ختم میگردد.