1 / 61

Software and Security

Software and Security. میثم ناوکی عارفی دانشکده ریاضی و علوم کامپیوتر دانشگاه صنعتی امیرکبیر پائیز 88. Why Software ?. چرا نرم افزار باید در سطحی از امنیت مانند رمز، کنترل های دسترسی و ... باشد ؟ چون تمام اطلاعات امنیتی درون نرم افزار پیاده سازی شده است .

colman
Télécharger la présentation

Software and Security

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Software and Security میثم ناوکیعارفی دانشکده ریاضی و علوم کامپیوتر دانشگاه صنعتی امیرکبیر پائیز88

  2. Why Software ? • چرا نرم افزار باید در سطحی از امنیت مانند رمز، کنترل های دسترسی و ... باشد ؟ • چون تمام اطلاعات امنیتی درون نرم افزار پیاده سازی شده است . • قانون : اگر نرم افزار شما هدف حمله باشد ، سطح امنیتی شما شکسته خواهد شد .

  3. Miscellaneous Software-Based Attacks • تعداد خیلی زیادی ازحملات شامل نرم افزارها می شوند . Salami Attack Linearization Attack Time Bomb

  4. Salami Attack • دریک salami attack برنامه نویس مقداری پول را از طریق تراکنش های مختلف بدست می آورد و در هر تراکنش مقداری را جابجا میکند.این مقادیرباید به اندازه ی کافی کوچک باشند تا تشخیص آن مشکل باشد . مثال : • برنامه نویس کم کم از حساب بقیه (کمتر از cent ) کسر می کند و به حساب خود اضافه می کند . • هیچ کدام از مشتریان این کمبود ناچیز (کمتر از cent) را متوجه نمی شوند . • بانک نیز ممکن است مشکلی پیدا نکند . • با گذشت زمان برنامه نویس پول زیادی بدست می آورد .

  5. Linearization Attack • برنامه برای یک serial numberچک می شود . • برای بالابردن کارایی ، در هر لحظه یک کاراکتر چک می شود . • آیا attacker می تواند از این مطلب استفاده نماید ؟

  6. Linearization Attack • اگر Serial number 8 کاراکتر باشد و هر کاراکتر 128 حالت داشته باشد : • در حالت عادی 1288 = 256حالت برای serial number وجود دارد. • با استفاده از Linearization attack ، attacker حداکثر به 8(128) = 210 حدس نیاز دارد.

  7. Time Bomb • در1986 ، Donald Gene Burleson از کارفرمایش درخواست کرد که مالیات ماهیانه را متوقف کند . • Company رد کرد . • او نقشه کشیده بود تا به Company خسارت برساند . • او از کامپیوترهای Company استفاده کرد تا مدارکی قانونی ایجاد نماید ، اما Company متوجه شد و او را اخراج کردند . • Burleson روی نرم افزاری کار کرده بود . • بعد از اخراجش نرم افزارش ((Time Bomb هزاران رکورد از اطلاعات Company را پاک کرد .

  8. Software Engineering(SRE)

  9. What is Reverse Engineering ? • تعریف 1. عملیات بیرون کشیدن اطلاعات طراحی از هر وسیله ای که توسط انسان تولید می شود . 2. پردازش روی یک وسیله ی مهندسی ساز مانند ماشین ،موتور جت ، نرم افزار و ... برای فهمیدن جزئیات طراحی و معماری آن . در جهان نرم افزار برای بدست آوردن کد نرم افزار استفاده می شود .

  10. Why SRE ? • موارد استفاده : از بین بردن محدودیت های استفاده از نرم افزار . ایجاد malicious software. تقلب در بازی ها . گسترش ویا اصلاح کد ، زمانی که طراحی نرم افزار از ابتدا هزینه ی زیادی دربر دارد و به developer دسترسی نداریم . و . . .

  11. SRE • فرضیات reverse engineerما یک attacker است . attacker فقط یک فایل exe دارد . سیستم عامل مورد نظر windows است .

  12. SRE Tools • Disassembler فایلexeرا به کد اسمبلی تبدیل می کند . همیشه نمی تواند این کار را به درستی انجام دهد . • Debugger جهت متوقف کردن برنامه در نقاط خاص به منظور فهمیدن آن . • Hex Editor برای patch کردن فایل exe (ایجاد تغییرات در فایل exe ) • Regmon ، Filemon و ...

  13. SRE Tools • IDA Pro یک disassembler قدرتمند و انعطاف پذیر. کار تبدیل را نسبتا بهتر از بقیه Disassembler ها انجام می دهد (OllyDbg,PEBrowse) • SoftICE یک debugger خبره با ابزارهای پیچیده . حتی می تواند برای Debugg کردن سیستم عامل نیز استفاده شود. • UltraEdit یک نرم افزار freeware برای اصلاح کد exe .

  14. Why is a Debugger Needed ? • Disassemblerیک دید staticمی دهد . کاربر باید به صورت ذهنی مسیر برنامه را دنبال کند. • ِDebuggerیک دید dynamicمی دهد . کاربر می تواند break pointمشخص کند . می توان با بخشی از کد به صورت black boxبرخورد کرد .

  15. SRE Necessary Skills • توانایی کار با ابزارهای موجود . • دانشی از windowsمانند ساختار فایل exe و... . • دانشی از زبانassembley . • حوصله و صبر بی پایان .

  16. SRE Example • ما یک مثال خیلی ساده را در نظر می گیریم . • این مثال فقط به DisassemblerوHex Editorنیازدارد . • برای اکثر کد های واقعی ما به Debuggerنیز نیاز خواهیم داشت.

  17. SRE Example • برنامه به یک Serial number نیاز دارد . • Attacker ، Serial numberرا نمی داند . • آ یا attackerمی تواند Serial numberرا از فایلexeبدست آورد !

  18. SRE Example • کد زبان سطح بالای برنامه ی serial.exe که attacker به آن دسترسی ندارد .

  19. SRE Example • خروجیIDA Pro شایدSerial Number، S123N456باشد .

  20. SRE Example • تست شماره سریال :

  21. SRE Example • Attackerمی خواهد فایل exe را طوری اصلاح کند که دستور jz همیشه true باشد. برای این کار دستور testرا با دستور xor جایگزین می کند .

  22. SRE Example • اصلاح با Hex Editor serial.exe serialPatch.exe

  23. SRE Example • SerialPatch.exeبرای هرشماره سریالی کار می کند .

  24. SRE Attack Mitigation • جلوگیری از SREغیرممکن است . • اما می توان اینگونه حملات را سخت تر کرد : • تکنیک های Anti-Disassembly برای مبهم کردن دید ایستا . • تکنیک های Anti-Debugging برای مبهم کردن دید پویا . • Tamper Resistance برای مشکل تر کردن patching. • Code Obfuscation فهمیدن کد را سخت تر می کند .

  25. Software Anti-Reverse Engineering

  26. Anti-Reversing • اثرات احتمالی Anti-Reversing روی برنامه : • بزرگ تر شدن برنامه . • مشکل شدن نگهداری آن . • کندتر شدن برنامه . • بالارفتن مصرف حافظه و ... .

  27. MethodAnti-Disassembly • Executable file encryption • False disassembly • Self-modifying code • ...

  28. Code Encryption • روشی رایج برای مبهم کردن دید ایستا . • متاسفانه این روش برای reverser ماهر غیر معمول نیست ، چون در اغلب موارد تمام اطلاعات مورد نیاز مانند منطق encryption و یا key درون برنامه وجود دارند . • بعلاوه برنامه باید قبل از اجرا رمزگشایی شود ، که درنتیجه باید برنامه رمزگشا نیز همراه برنامه باشد .

  29. False Disassembly • فرض کنید کد واقعی مانند زیر باشد : • چیزی که disassembler می بیند : • یعنی دستورات 3 به بعد به اشتباه تفسیر می شود . … jmp junk inst 3 inst 4 inst 1 … inst 2 inst 3 inst 4 inst 5 inst 6 inst 1

  30. Self-modifying Code • self-modifying code کدی است که دستوراتش را هنگام اجرا تغییر می دهد . • sudocode example repeat N times { increase A by one do something with A } when STATE has to switch { replace the opcode "increase” above with the opcode to decrease } repeat N times { if STATE is 1 increase A by one else decrease A by one do something with A }

  31. Disassembly Basic • Linear sweep • دستورات را همانگونه که ظاهر می شوند Disassemble می کند. • SoftICE وWinDlgازاین دیدگاه استفاده می کنند . • Recursive traversal • Control flow برنامه را دنبال می کند . • دیدگاهی باهوش تر . • OlleyDbg ، IDAPro و PEBrowseازاین دیدگاه استفاده می کنند .

  32. Confusing a Disassembler jmp After _emit 0x0f After : moveax,[somevariable] push eax call Afunction • روشی قوی نیست اما رایج است . • قراردادن یک بایت junk : • شبه دستور_emit یک بایت را درموقعیت جاری درون سگمنت کد تعریف می نماید . • Linear sweep را فریب می دهد اما Recursive traversal را نه .

  33. Confusing a Disassembler • چگونه یک Recursive traversal را می توان فریب داد ؟ • با استفاده از یک گزاره ی همیشه درست یا غلط (opaque pridicate) و ساختن dead branch. • برنامه اصلی از dead branchصرفنظر می کند ما disassemblerنمی تواند .

  34. Confusing a Disassembler • moveax, 2 • cmpeax, 2 • je After • _emit 0xf • After: • moveax, [SomeVariable] • push eax • call Afunction • استفاده از else غیر قابل دستیابی . • متاسفانه disassembler ها کدهای متفاوتی برای کد بالا تولید می کنند • این کد IDAPro را فریب می دهد اما OllyDbg را نه .چون OllyDbg مکان پرش را به عنوان نشانه نقطه شروع کد صحیح در نظر می گیرد .

  35. Confusing a Disassembler • چطور می توان OllyDbg را فریب داد ؟ • این کد OllyDbg را فریب می دهد اما PEBrowse را نه ! • moveax, 2 • cmpeax, 3 • je Junk • jne After • Junk: • _emit 0xf • After: • moveax, [SomeVariable] • push eax • call Afunction

  36. Confusing a Disassembler • چگونهPEBrowse را فریب دهیم ؟ • این کد هر Disassembler ی که تست شده است را فریب می دهد . • moveax, 2 • cmpeax, 3 • je Junk • moveax, After • jmpeax • Junk: • _emit 0xf • After: • moveax, [SomeVariable] • push eax • call Afunction

  37. Confusing a Disassembler • نتایج : • یک الگوریتم عمومی (public Algorithm) برای فریب دادن Disassemblerها وجود ندارد . • Disassembler های windows به اندازه ی کافی هوشمند نیستند و می توان راهی برای فریب دادن آنها پیدا کرد .

  38. Anti-Debugger • به دلیل انجام حجم زیادی از reversing در داخل debugger ، بعضی اوقات مفید به نظرمی رسد که درون برنامه کدهایی قرار دهیم که برنامه را پیچیده و در نتیجه قراردادن break point را سخت تر نماید . • تکنیک های Anti-Debugger زمانی موثر می باشند که با Codeencryption همراه باشند چون encryption ، reverser را مجبور می کند تا برنامه را درون یک debugger اجرا نماید . • برای فهم تکنیک های Anti-Debugger نیاز به دانستن نحوه ی کنترل برنامه توسط debugger داریم :

  39. Anti-Debugger • وقتی کاربر در نقطه ای از برنامه break pointرا قرار می دهد ، معمولا آن دستور را با دستور int 3 جایگزین می شود . int 3 یک وقفه break point است که debugger را از وقوع یک break pointمطلع می کند . debugger با مشاهده ی int 3، int 3 را با دستور اصلی برنامه جایگزین می کند وبرنامه را freeze می کند تا کاربر state برنامه را مشاهده کند .

  40. Anti-Debugger Example • فرض کنید وقتی برنامه دستور1 را می گیرد دستورات 2 ، 3 و4 را واکشی نماید . • فرض کنید وقتی debugger دستور 1 را اجرا می کند ، دستوری را واکشینمی نماید. • آیا از این تفاوت می توان برای گیج کردن debugger استفاده نمود ؟ … inst 2 inst 3 inst 4 inst 5 inst 6 inst 1

  41. Anti-Debugger Example … • فرض کنید دستور1 ، دستور 4 را در حافظه overwrite نماید. • برنامه درست کار خواهد کرد چون دستور4 قبلا واکشی شده است . • Debugger هنگام برخورد با junk گیج خواهد شد . • معایب : • اگر این قست از کد بیش از یک باراجرا شود ، برنامه با مشکل مواجه خواهد شد . • کد خیلی وابسته به platform خواهد شد . inst 2 inst 3 inst 4 junk inst 5 inst 6 inst 1

  42. The IsDebuggerPresent API • IsDebuggerPresent یکی از API های ویندوز است که می توان از آن برای تشخیص Debugger ها استفاده کرد . • وقتی این تابع فراخوانی می شود ، reverser می تواند به راحتی آن را پیدا کرده و حذفش نماید . • یک دیدگاه که این API را موثرتر می سازد ، پیاده سازی آن درون برنامه است .

  43. Code CheckSum • روی کد یک CheckSum را محاسبه می کند . سپس در زمان اجرا صحت آن چک می شود . • مزیت • چون Debugger کد را برای breakpoint اصلاح می کند ، می توان حضور Debugger را تشخیص داد . • همچنین از patch کردن برنامه جلوگیری می کند .

  44. Code Obfuscation Methods • Opaque Predicates • Inlining and Outlining • Restructing Arrays • Modify Variable Encoding • Ordering Transformation • Guards Network • ...

  45. Opaque Predicates • ایده : قراردادن عبارات شرطی بدیهی . • برای مثال : if (x == x + 1) … بسادگی قابل تشخیص است و نیاز به مثالهای پیچیده تر داریم : if (x*x + y*y >= 2*x*y) … • این عبارت زیاد واضح نیست که همیشه trueاست و مخصوصا در زبان اسمبلی کمتر واضح است.

  46. Inlining and Outlinig • درInlining هر function callبا بدنه ی function جایگزین می شود . • کارایی زمان اجرا افزایش می یابد چون سربار function call بطور کامل برداشته می شود و درمقابل حجم کد افزایش می یابد . • در مفهوم مبهم سازی ، Inlining ابزاری قوی است چون Abstraction ایجاد شده توسط Developer را از بین می برد .

  47. Inlining and Outlinig • Outliningگرفتن یک دنباله از دستورات به عنوان یک function جدید است .(عکس عمل Inlinig ) • یک پیشنهاد جالب در بحث مبهم سازی ، ترکیب آنهاست. • اگر دنباله ی دستورات به صورت تصادفی انتخاب شود ابزاری قوی در جهت مبهم سازی کد خواهد بود. • وقتی مانند یک پروسس تکرار شود به فاکتور ابهام می افزاید .

  48. Restructing Arrays • هدف بهم زدن هدف آرایه در برنامه است . • برای مثال : ادغام دو آرایه با هم . تبدیل یک آرایه به چند آرایه . تغییر ابعاد آرایه . • عملا روشی قوی نیست .

  49. Modify Variable Encoding • روش های زیادی برای اعمال آن وجود دارد. • مثال : • بجای استفاده از کد مقابل for (i = 0; i < 10; i++) … • از کد زیراستفادهنمائیم : for (i = 1; i < 20; i += 2) … • این یک مثال خیلی ساده است و ما باید سعی کنیم آن را پیچبده تر نمائیم.

  50. Ordering Transformation • ایده : بهم زدن ترتیب عملیات برنامه . در این روش ترتیب عملیات تا حد امکان Randomize می شود . • روشی موثر در گیج کردن reverser . • متاسفانه ، همیشه نمی توانیم ترتیب عملیات برنامه را تغییر دهیم چون بعضی از عملیات وابسته به کد هستند . • ایده پیدا کردن عملیاتی است که به کد وابسته نیستند وسپس تغییر دادن ترتیب آنهاست .

More Related