610 likes | 786 Views
Software and Security. میثم ناوکی عارفی دانشکده ریاضی و علوم کامپیوتر دانشگاه صنعتی امیرکبیر پائیز 88. Why Software ?. چرا نرم افزار باید در سطحی از امنیت مانند رمز، کنترل های دسترسی و ... باشد ؟ چون تمام اطلاعات امنیتی درون نرم افزار پیاده سازی شده است .
E N D
Software and Security میثم ناوکیعارفی دانشکده ریاضی و علوم کامپیوتر دانشگاه صنعتی امیرکبیر پائیز88
Why Software ? • چرا نرم افزار باید در سطحی از امنیت مانند رمز، کنترل های دسترسی و ... باشد ؟ • چون تمام اطلاعات امنیتی درون نرم افزار پیاده سازی شده است . • قانون : اگر نرم افزار شما هدف حمله باشد ، سطح امنیتی شما شکسته خواهد شد .
Miscellaneous Software-Based Attacks • تعداد خیلی زیادی ازحملات شامل نرم افزارها می شوند . Salami Attack Linearization Attack Time Bomb
Salami Attack • دریک salami attack برنامه نویس مقداری پول را از طریق تراکنش های مختلف بدست می آورد و در هر تراکنش مقداری را جابجا میکند.این مقادیرباید به اندازه ی کافی کوچک باشند تا تشخیص آن مشکل باشد . مثال : • برنامه نویس کم کم از حساب بقیه (کمتر از cent ) کسر می کند و به حساب خود اضافه می کند . • هیچ کدام از مشتریان این کمبود ناچیز (کمتر از cent) را متوجه نمی شوند . • بانک نیز ممکن است مشکلی پیدا نکند . • با گذشت زمان برنامه نویس پول زیادی بدست می آورد .
Linearization Attack • برنامه برای یک serial numberچک می شود . • برای بالابردن کارایی ، در هر لحظه یک کاراکتر چک می شود . • آیا attacker می تواند از این مطلب استفاده نماید ؟
Linearization Attack • اگر Serial number 8 کاراکتر باشد و هر کاراکتر 128 حالت داشته باشد : • در حالت عادی 1288 = 256حالت برای serial number وجود دارد. • با استفاده از Linearization attack ، attacker حداکثر به 8(128) = 210 حدس نیاز دارد.
Time Bomb • در1986 ، Donald Gene Burleson از کارفرمایش درخواست کرد که مالیات ماهیانه را متوقف کند . • Company رد کرد . • او نقشه کشیده بود تا به Company خسارت برساند . • او از کامپیوترهای Company استفاده کرد تا مدارکی قانونی ایجاد نماید ، اما Company متوجه شد و او را اخراج کردند . • Burleson روی نرم افزاری کار کرده بود . • بعد از اخراجش نرم افزارش ((Time Bomb هزاران رکورد از اطلاعات Company را پاک کرد .
What is Reverse Engineering ? • تعریف 1. عملیات بیرون کشیدن اطلاعات طراحی از هر وسیله ای که توسط انسان تولید می شود . 2. پردازش روی یک وسیله ی مهندسی ساز مانند ماشین ،موتور جت ، نرم افزار و ... برای فهمیدن جزئیات طراحی و معماری آن . در جهان نرم افزار برای بدست آوردن کد نرم افزار استفاده می شود .
Why SRE ? • موارد استفاده : از بین بردن محدودیت های استفاده از نرم افزار . ایجاد malicious software. تقلب در بازی ها . گسترش ویا اصلاح کد ، زمانی که طراحی نرم افزار از ابتدا هزینه ی زیادی دربر دارد و به developer دسترسی نداریم . و . . .
SRE • فرضیات reverse engineerما یک attacker است . attacker فقط یک فایل exe دارد . سیستم عامل مورد نظر windows است .
SRE Tools • Disassembler فایلexeرا به کد اسمبلی تبدیل می کند . همیشه نمی تواند این کار را به درستی انجام دهد . • Debugger جهت متوقف کردن برنامه در نقاط خاص به منظور فهمیدن آن . • Hex Editor برای patch کردن فایل exe (ایجاد تغییرات در فایل exe ) • Regmon ، Filemon و ...
SRE Tools • IDA Pro یک disassembler قدرتمند و انعطاف پذیر. کار تبدیل را نسبتا بهتر از بقیه Disassembler ها انجام می دهد (OllyDbg,PEBrowse) • SoftICE یک debugger خبره با ابزارهای پیچیده . حتی می تواند برای Debugg کردن سیستم عامل نیز استفاده شود. • UltraEdit یک نرم افزار freeware برای اصلاح کد exe .
Why is a Debugger Needed ? • Disassemblerیک دید staticمی دهد . کاربر باید به صورت ذهنی مسیر برنامه را دنبال کند. • ِDebuggerیک دید dynamicمی دهد . کاربر می تواند break pointمشخص کند . می توان با بخشی از کد به صورت black boxبرخورد کرد .
SRE Necessary Skills • توانایی کار با ابزارهای موجود . • دانشی از windowsمانند ساختار فایل exe و... . • دانشی از زبانassembley . • حوصله و صبر بی پایان .
SRE Example • ما یک مثال خیلی ساده را در نظر می گیریم . • این مثال فقط به DisassemblerوHex Editorنیازدارد . • برای اکثر کد های واقعی ما به Debuggerنیز نیاز خواهیم داشت.
SRE Example • برنامه به یک Serial number نیاز دارد . • Attacker ، Serial numberرا نمی داند . • آ یا attackerمی تواند Serial numberرا از فایلexeبدست آورد !
SRE Example • کد زبان سطح بالای برنامه ی serial.exe که attacker به آن دسترسی ندارد .
SRE Example • خروجیIDA Pro شایدSerial Number، S123N456باشد .
SRE Example • تست شماره سریال :
SRE Example • Attackerمی خواهد فایل exe را طوری اصلاح کند که دستور jz همیشه true باشد. برای این کار دستور testرا با دستور xor جایگزین می کند .
SRE Example • اصلاح با Hex Editor serial.exe serialPatch.exe
SRE Example • SerialPatch.exeبرای هرشماره سریالی کار می کند .
SRE Attack Mitigation • جلوگیری از SREغیرممکن است . • اما می توان اینگونه حملات را سخت تر کرد : • تکنیک های Anti-Disassembly برای مبهم کردن دید ایستا . • تکنیک های Anti-Debugging برای مبهم کردن دید پویا . • Tamper Resistance برای مشکل تر کردن patching. • Code Obfuscation فهمیدن کد را سخت تر می کند .
Anti-Reversing • اثرات احتمالی Anti-Reversing روی برنامه : • بزرگ تر شدن برنامه . • مشکل شدن نگهداری آن . • کندتر شدن برنامه . • بالارفتن مصرف حافظه و ... .
MethodAnti-Disassembly • Executable file encryption • False disassembly • Self-modifying code • ...
Code Encryption • روشی رایج برای مبهم کردن دید ایستا . • متاسفانه این روش برای reverser ماهر غیر معمول نیست ، چون در اغلب موارد تمام اطلاعات مورد نیاز مانند منطق encryption و یا key درون برنامه وجود دارند . • بعلاوه برنامه باید قبل از اجرا رمزگشایی شود ، که درنتیجه باید برنامه رمزگشا نیز همراه برنامه باشد .
False Disassembly • فرض کنید کد واقعی مانند زیر باشد : • چیزی که disassembler می بیند : • یعنی دستورات 3 به بعد به اشتباه تفسیر می شود . … jmp junk inst 3 inst 4 inst 1 … inst 2 inst 3 inst 4 inst 5 inst 6 inst 1
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 }
Disassembly Basic • Linear sweep • دستورات را همانگونه که ظاهر می شوند Disassemble می کند. • SoftICE وWinDlgازاین دیدگاه استفاده می کنند . • Recursive traversal • Control flow برنامه را دنبال می کند . • دیدگاهی باهوش تر . • OlleyDbg ، IDAPro و PEBrowseازاین دیدگاه استفاده می کنند .
Confusing a Disassembler jmp After _emit 0x0f After : moveax,[somevariable] push eax call Afunction • روشی قوی نیست اما رایج است . • قراردادن یک بایت junk : • شبه دستور_emit یک بایت را درموقعیت جاری درون سگمنت کد تعریف می نماید . • Linear sweep را فریب می دهد اما Recursive traversal را نه .
Confusing a Disassembler • چگونه یک Recursive traversal را می توان فریب داد ؟ • با استفاده از یک گزاره ی همیشه درست یا غلط (opaque pridicate) و ساختن dead branch. • برنامه اصلی از dead branchصرفنظر می کند ما disassemblerنمی تواند .
Confusing a Disassembler • moveax, 2 • cmpeax, 2 • je After • _emit 0xf • After: • moveax, [SomeVariable] • push eax • call Afunction • استفاده از else غیر قابل دستیابی . • متاسفانه disassembler ها کدهای متفاوتی برای کد بالا تولید می کنند • این کد IDAPro را فریب می دهد اما OllyDbg را نه .چون OllyDbg مکان پرش را به عنوان نشانه نقطه شروع کد صحیح در نظر می گیرد .
Confusing a Disassembler • چطور می توان OllyDbg را فریب داد ؟ • این کد OllyDbg را فریب می دهد اما PEBrowse را نه ! • moveax, 2 • cmpeax, 3 • je Junk • jne After • Junk: • _emit 0xf • After: • moveax, [SomeVariable] • push eax • call Afunction
Confusing a Disassembler • چگونهPEBrowse را فریب دهیم ؟ • این کد هر Disassembler ی که تست شده است را فریب می دهد . • moveax, 2 • cmpeax, 3 • je Junk • moveax, After • jmpeax • Junk: • _emit 0xf • After: • moveax, [SomeVariable] • push eax • call Afunction
Confusing a Disassembler • نتایج : • یک الگوریتم عمومی (public Algorithm) برای فریب دادن Disassemblerها وجود ندارد . • Disassembler های windows به اندازه ی کافی هوشمند نیستند و می توان راهی برای فریب دادن آنها پیدا کرد .
Anti-Debugger • به دلیل انجام حجم زیادی از reversing در داخل debugger ، بعضی اوقات مفید به نظرمی رسد که درون برنامه کدهایی قرار دهیم که برنامه را پیچیده و در نتیجه قراردادن break point را سخت تر نماید . • تکنیک های Anti-Debugger زمانی موثر می باشند که با Codeencryption همراه باشند چون encryption ، reverser را مجبور می کند تا برنامه را درون یک debugger اجرا نماید . • برای فهم تکنیک های Anti-Debugger نیاز به دانستن نحوه ی کنترل برنامه توسط debugger داریم :
Anti-Debugger • وقتی کاربر در نقطه ای از برنامه break pointرا قرار می دهد ، معمولا آن دستور را با دستور int 3 جایگزین می شود . int 3 یک وقفه break point است که debugger را از وقوع یک break pointمطلع می کند . debugger با مشاهده ی int 3، int 3 را با دستور اصلی برنامه جایگزین می کند وبرنامه را freeze می کند تا کاربر state برنامه را مشاهده کند .
Anti-Debugger Example • فرض کنید وقتی برنامه دستور1 را می گیرد دستورات 2 ، 3 و4 را واکشی نماید . • فرض کنید وقتی debugger دستور 1 را اجرا می کند ، دستوری را واکشینمی نماید. • آیا از این تفاوت می توان برای گیج کردن debugger استفاده نمود ؟ … inst 2 inst 3 inst 4 inst 5 inst 6 inst 1
Anti-Debugger Example … • فرض کنید دستور1 ، دستور 4 را در حافظه overwrite نماید. • برنامه درست کار خواهد کرد چون دستور4 قبلا واکشی شده است . • Debugger هنگام برخورد با junk گیج خواهد شد . • معایب : • اگر این قست از کد بیش از یک باراجرا شود ، برنامه با مشکل مواجه خواهد شد . • کد خیلی وابسته به platform خواهد شد . inst 2 inst 3 inst 4 junk inst 5 inst 6 inst 1
The IsDebuggerPresent API • IsDebuggerPresent یکی از API های ویندوز است که می توان از آن برای تشخیص Debugger ها استفاده کرد . • وقتی این تابع فراخوانی می شود ، reverser می تواند به راحتی آن را پیدا کرده و حذفش نماید . • یک دیدگاه که این API را موثرتر می سازد ، پیاده سازی آن درون برنامه است .
Code CheckSum • روی کد یک CheckSum را محاسبه می کند . سپس در زمان اجرا صحت آن چک می شود . • مزیت • چون Debugger کد را برای breakpoint اصلاح می کند ، می توان حضور Debugger را تشخیص داد . • همچنین از patch کردن برنامه جلوگیری می کند .
Code Obfuscation Methods • Opaque Predicates • Inlining and Outlining • Restructing Arrays • Modify Variable Encoding • Ordering Transformation • Guards Network • ...
Opaque Predicates • ایده : قراردادن عبارات شرطی بدیهی . • برای مثال : if (x == x + 1) … بسادگی قابل تشخیص است و نیاز به مثالهای پیچیده تر داریم : if (x*x + y*y >= 2*x*y) … • این عبارت زیاد واضح نیست که همیشه trueاست و مخصوصا در زبان اسمبلی کمتر واضح است.
Inlining and Outlinig • درInlining هر function callبا بدنه ی function جایگزین می شود . • کارایی زمان اجرا افزایش می یابد چون سربار function call بطور کامل برداشته می شود و درمقابل حجم کد افزایش می یابد . • در مفهوم مبهم سازی ، Inlining ابزاری قوی است چون Abstraction ایجاد شده توسط Developer را از بین می برد .
Inlining and Outlinig • Outliningگرفتن یک دنباله از دستورات به عنوان یک function جدید است .(عکس عمل Inlinig ) • یک پیشنهاد جالب در بحث مبهم سازی ، ترکیب آنهاست. • اگر دنباله ی دستورات به صورت تصادفی انتخاب شود ابزاری قوی در جهت مبهم سازی کد خواهد بود. • وقتی مانند یک پروسس تکرار شود به فاکتور ابهام می افزاید .
Restructing Arrays • هدف بهم زدن هدف آرایه در برنامه است . • برای مثال : ادغام دو آرایه با هم . تبدیل یک آرایه به چند آرایه . تغییر ابعاد آرایه . • عملا روشی قوی نیست .
Modify Variable Encoding • روش های زیادی برای اعمال آن وجود دارد. • مثال : • بجای استفاده از کد مقابل for (i = 0; i < 10; i++) … • از کد زیراستفادهنمائیم : for (i = 1; i < 20; i += 2) … • این یک مثال خیلی ساده است و ما باید سعی کنیم آن را پیچبده تر نمائیم.
Ordering Transformation • ایده : بهم زدن ترتیب عملیات برنامه . در این روش ترتیب عملیات تا حد امکان Randomize می شود . • روشی موثر در گیج کردن reverser . • متاسفانه ، همیشه نمی توانیم ترتیب عملیات برنامه را تغییر دهیم چون بعضی از عملیات وابسته به کد هستند . • ایده پیدا کردن عملیاتی است که به کد وابسته نیستند وسپس تغییر دادن ترتیب آنهاست .