تمرین دوم امنیت شبکه-نیمسال دوم ۹۵-۹۶

 

به نام خدا

تمرینات Buffer Overflow

استاد: دکتر مقصود عباسپور

کمک تدریس: جواد زندی

 

لطفا در ارسال تمرینات خود به نکات‌ مهم زیر توجه داشته باشید:

1-     مهلت این سری تمرینات تا ۴اردیبهشت می‌باشد.

2-     برای دریافت نسخهPDF تمرین از لینک استفاده نمایید.

3-     نحوه تحویل تمرینات شما به دو صورت می‌تواند باشد:

الف) تمریناتی که به صورت سوالات تحلیلی و تعریفی و مسله‌ای است به صورت خوانا دستی روی کاغذ بنویسید و برگه خود را تحویل استاد درس دهید. در صورتی که مایل بودید می‌توانید تصویر مناسب از برگه تهیه کرده و در درس‌افزار بارگذاری نمایید.

ب) سوالاتی از تمرین که شامل برنامه‌نویسی است: در این مورد باید متن برنامه ‌(source code) که حتما باید قابل اجرا باشد به همراه متعلقات لازم در درس‌افزار با درنظرگرفتن عنوان مناسب با فرمول [SecNet95B][hw2][student#][full name] ارسال کنید. همچنین به خاطر داشته باشید که درصورتی که قصد دارید چندین فایل برای حل تمرین بفرستید، ابتدا باید آنها را zip کنید و نام فایل زیپ شده را به فرمول فوق درآورید.

4-     از آنجایی که پاسخ‌های شما بادقت صحیح‌می‌شود، ایده‌های‌خلاقانه و پاسخ‌های هوشمندانه در حل‌سوالات طبیعتا نمره‌ای فراتر از تمرین دارد.

 

 

سوالات مفهومي:

1-     سرریز بافر چیست؟ انواع آن را نام ببرید و راه‌های دفاع دربرابر آنها را نیز خلاصه توضیح دهید.

2-     با یک مثال بیان کنید چرا داشتن stack و heap غیرقابل اجرا (No Executable Stack & Heap) برای جلوگیری از حملات سرریز بافر کافی نیست؟

3-     تابع زیر را درنظر بگیرید:

Void main (int argc, char *argv[]) {

   char buffer [10];

   if (argc>1) {

strcpy (buffer, argv[1]);

}

}

استک پس از فراخوانی این تابع بصورت زیر درخواهد آمد:

 

 

فرض کنید ما از موارد زیر مطلع هستیم:

کامپایلر برای نوع char، یک بایت فضا در حافظه در نظر می گیرد.

حدس می زنیم که آدرس SP (بالای استک) در حال حاضر بین 0xbffff6c8 و 0xbffff6c0 است (توجه کنید که رشد استک در جهت کاهش آدرس های حافظه است).

مقدار فضای حافظه لازم برای ذخیره کردن sfp و return address، هر کدام چهار بایت است.

فضای استک اجرایی است.

معادل هگز یک ورودی خرابکارانه برای تابع main را بنویسید(تئوری سوال حل شود) که پس از اجرا، دستور /bin/sh را اجرا نماید. (راهنمایی: در همه ی معماری ها، یک دستور No Operation یا NOP با معادل هگز 0x90 وجود دارد).

 

 

سوالات برنامه‌نويسي:

نکته: از آنجایی که این بخش از تمرین کاملا عملی می‌باشد، شما می‌بایست به ۲نکته مهم توجه داشته باشید:

i. همانطور که می‌دانید در لینوکس مکانیزم ASLR برای جلوگیری از حملات سرریز وجود دارد. در همه‌ی تمرینات می‌توانید(مگر در مورد تمریناتی که صراحتا قید شده که نباید آن را غیرفعال نمایید.) این مکانیزم را غیرفعال نمایید تا بتوانید برنامه‌ها را exploit کنید. برای غیرفعال نمودن آنها میتوانید با دسترسی root فرمان زیر را در ترمینال اجرا کنید:

echo 0 > /proc/sys/kernel/randomize_va_space

ii. در کامپایلر gcc  به‌طور پیش‌فرض پشته‌ی برنامه‌ها توسط مکانیزم canary محافظت می‌شود. برای غیرفعال کردن این مکانیزم(چون می‌خواهیم exploit کنیم) باید شما از سوییچ زیر استفاده نمایید:

-fno-stack-protector

Example:                    gcc -fno-stack-protector main.cpp

1-     این تمرین ساده‌ترین حالت نوشتن exploit سرریز بافر می‌باشد. برای این منظور به کد برنامه زیر دقت نمایید:

#include <time.h>

#include <stdlib.h>

void stringMirorring();

void runOnExploit();

int main () {

        stringMirorring ();

        return 0;

}

void FeedMeInput() {

        char buffer[8];

        gets(buffer);

        puts(buffer);

}

void runOnExploit () {

        printf(“Successfully Exploited!\n”);

}

I.  (بدون دستکاری کد برنامه) برای برنامه‌ی فوق ورودی طراحی نمایید که تابع runOnExploit اجرا شود.

II. برای تابع فوق ورودی طراحی نمایید که فرخوان سیستمی exit() اجرا شود.

III. آیا می‌توانید ورودی طراحی نمایید که اول تابع runOnExploit اجرا شود و سپس تابع اصلی exit اجرا شود؟

 

2-     در این تمرین قصد داریم ابتدا یک shellcode نوشته و سپس آن را دراثر یک سرریز بافر اجرا کنیم. بنابراین تمرین به دو قسمت تقسیم می‌شود:

Ø قسمت اول: نوشتن یک shellcode

Ø قسمت دوم: اجرا کردن shellcode در اثر یک سرریز بافر. نوشتن shellcode را در کلاس درس آموخته‌اید. بنابراین شما باید shellcode ای بنویسید که برنامه با کدخطای ۱۲ بسته شود.

 

3-     (امتیازی) برای یک برنامه‌ی ساده مانند آنچه در سوال ۱ دیدید (برنامه را خودتان بنویسید) با استفاده از تکنیک اجرا کردن shellcode ها یک سوکت شبکه از داخل کامیپوتر به بیرون بزنید(به یک ip دلخواه جز کامپیوتر خود) و فایل passwd را از مسیر /etc/passwd بر‌روی شبکه به یک آی پی مشخص ارسال نمایید.

   

تمرین اول امنیت شبکه-نیمسال دوم ۹۵-۹۶

 

به نام خدا

تمرینات Basic Cryptography

استاد: دکتر مقصود عباسپور

کمک تدریس: جواد زندی

 

لطفا در ارسال تمرینات خود به نکات‌ مهم زیر توجه داشته باشید:

1-     مهلت این سری تمرینات تا ۲۳اسفند می‌باشد.

2-     برای دریافت نسخهPDF  تمرین از لینک استفاده نمایید.

3-     نحوه تحویل تمرینات شما به دو صورت می‌تواند باشد:

الف) تمریناتی که به صورت سوالات تحلیلی و تعریفی و مسله‌ای است به صورت خوانا دستی روی کاغذ بنویسید و برگه خود را تحویل استاد درس دهید. در صورتی که مایل بودید می‌توانید تصویر مناسب از برگه تهیه کرده و در درس‌افزار بارگذاری نمایید.

ب) سوالاتی از تمرین که شامل برنامه‌نویسی است: در این مورد باید متن برنامه ‌(source code) که حتما باید قابل اجرا باشد به همراه متعلقات لازم در درس‌افزار با درنظرگرفتن عنوان مناسب با فرمول [SecNet95B][hw1][student#][full name] ارسال کنید. همچنین به خاطر داشته باشید که درصورتی که قصد دارید چندین فایل برای حل تمرین بفرستید، ابتدا باید آنها را zip کنید و نام فایل زیپ شده را به فرمول فوق درآورید.

4-     از آنجایی که پاسخ‌های شما بادقت صحیح‌می‌شود، ایده‌های‌خلاقانه و پاسخ‌های هوشمندانه در حل‌سوالات طبیعتا نمره‌ای فراتر از تمرین دارد.

 

 

سوالات مفهومي:

1-     پیاده‌سازی هر نوع مکانیزم امنیتی  و ارایه‌ی آنها به کاربران به نحوی که میزان خطر را به حداقل برساند، خدمات امنیتی نامیده می‌شود. شما در درس با چند نوع از خدمات امنیتی از جمله Confidentiality, Integrity, Availability, Authentication, Non-Repudiation آشنا شده‌اید. همچنین انواع تهدیدات را به دسته‌های Interception, Modification, Fabrication, Interruption‌ تقسیم بندی نمودیم. حال بگویید هرکدام از این تهدیدات علیه کدام سرویس ارایه‌شده از خدمات امنیتی می‌باشد؟ همچنین بگویید باتوجه به تهدید ذکرشده راه شما برای خنثی‌کردن تهدید موردنظر چیست؟

 

2-  با دسترسی به لینک از جزئیات در مورد نحوه عملکرد پیاده‌سازی DES آگاه شوید. اکنون به این پرسش پاسخ دهید که اصولا به چه دلیل در این الگوریتم از ماژول‌های S-Box  استفاده می‌شود؟

 

3-     در مورد مدهاي کاري رمزهاي متقارن به سؤالات زیر پاسخ دهید:

الف) اگر IV استفاده شده در مد کاري CBC همواره صفر باشد، چه مشکلی ایجاد می‌شود؟

ب) تفاوت عملیاتی اصلی میان دو مد کاري CBC و CTR در حالت رمزنگاري و رمزگشایی در چیست؟ شما در چه حالت‌هایی مدکاري CTR را به مد کاري CBC ترجیح می‌دهید؟

 

4-     حملات متداول برروی DES و AES در صورت موجود بودن شرح دهید.

 

5-     یک پروتکل تبادل پیام بین فرستنده‌یA وگیرنده‌یB راگام به گام توضیح دهیدکه درآن صرفا رسیدن یک پیام از A به B اهمیت دارد و محتوای پیام مهم نیست. در این پروتکل صرفا جنبه‌ی عدم انکار و هویت سنجی اهمیت دارد. این پروتکل باید در برابر حمله ی Man In The Middle مقاوم باشد. بنابراین با رسم شماتیک مناسب مراحل پروتکل را به درستی شرح دهید.

 

6-     فرض کنید قصد داریم پیامی که حاوی x بایت است را ارسال کنیم. با درنظرگرفتن الگوریتم RSA تمامی مراحل موردنیاز برای رمزگذاری و رمزگشایی را به طور کامل شرح دهید.

 

7-      فرض کنید ۲نفر A,B می‌خواهند قبل از تبادل پیام با یکدیگر، هویت یکدیگر را برای خودشان احراز کنند(یعنی A هویت فرد B را احراز شناسایی کند و برعکس) توضیح دهید با استفاده از سیستم رمزنگاری نامتقارن و مرکز صدور گواهی(CA) این امر چطور امکان پذیر است؟

 

8-     در درس آموخته‌اید که وجود یک کلید قوی نقش بسیار مهمی در تامین امنیت داده‌ها دارد. از طرفی دیگر می‌دانید که امروزه طول کلید مناسب برای الگوریتم RSA حدود ۲۰۴۸ بیت به بالاست. این درحالی است که طول کلید برای الگوریتم‌هایی همچون AES ۱۲۸ یا ۲۵۶ درنظر گرفته می‌شود. حال به سوالات زیر پاسخ دهید:

I. چه ارتباطی بین طول کلید و استحکام الگوریتم‌رمزنگاری وجود دارد؟

II.  اگر داده‌‌یP را یک‌بار با الگوریتم RSA رمزگذاری کنیم،  بدست می‌آید. همچنین اگر همان داده‌یP را با الگوریتم AES رمزگذاری کنیم،  بدست می‌آید. با فرض برابر بودن طول کلید در هر دو الگوریتم، نشان دهید کدام الگوریتم قوی‌تر است(اثبات علمی ریاضی نیاز نیست. مهندسی و استدلالی بحث کنید!)؟ حال که متوجه شدید الگوریتم ضعیف‌تر کدام است، بگویید چرا بازهم از الگوریتم ضعیف‌تردر عمل استفاده می‌شود؟

III.  (امتیازی) ویژگی‌های یک کلید قوی در الگوریتم‌های RSA و AES چیست؟

 

9-     (امتیازی) آیا الگوریتم دیگری برای سیستم رمزنگاری نامتقارن به جز RSA وجود دارد؟ درصورتی که چنین الگوریتمی پیدا نمودید آن را از نظر استحکام و سرعت و امنیت نسبت به RSA مقایسه کنید. سپس مراحل رمزنگاری آن را به طور کامل شرح دهید.

 

 

سوالات برنامه‌نويسي:

i. در این قسمت قصد داریم تا الگوریتم‌های رمزنگاری موجود را با یکدیگر مقایسه کنیم. کتابخانه‌ی openssl در این تمرین بسیار راهگشا می‌باشد. درصورتی که با این بسته‌ی دوست داشتنی لینوکس آشنایی ندارید می‌توانید خودتان پیاده‌سازی‌های الگوریتم‌های DES, 3DES, AES و یک الگوریتم دیگر به دلخواه خودتان انتخاب نمایید (در صورتی که نمی‌خواهید از openssl استفاده نمایید، دقت داشته باشید که همه‌ی پیاده‌سازی‌ها باید دریک زبان و با یک کامپایلر، کامپایل شده باشد.)

مسله: فایل موجود در لینک را بارگیری نمایید و سعی کنید با یکی از دو تکنیک فوق(یا استفاده از openssl یا استفاده از برنامه پیاد‌سازی شده به زبان دلخواه خودتان) به روش‌های گفته شده رمزنگاری کنید. بنابراین برنامه‌ای به زبان C بنویسید که بتواند بتواند زمان مورد نیاز برای اینکار را اندازه گیری کند. زمان محاسبه شده را در تمرینات بنویسید و کد برنامه را مطابق با دستورالعمل قید شده ارسال فرمایید.

 

ii. مشابه تمرین فوق این‌بار قصد داریم تا چکیده پیام فایل موجود در پیوست را محاسبه کنیم. برای اینکار باید از الگوریتم‌های MD5, SHA1, SHA256 و یک الگوریتم به دلخواه خودتان انجام دهید. بنابراین برنامه‌ای به زبان C بنویسید که زمان محاسبه‌ی چکیده‌ی پیام را گزارش کند. زمان محاسبه شده را در تمرینات بنویسید و کد برنامه را مطابق با دستورالعمل قید شده ارسال فرمایید.