مهندسی معکوس، یک حوزه فراگیر و جذاب است که در آن به بررسی و تحلیل سیستمها و برنامههای رایانهای میپردازیم. این حوزه، شامل بررسی و تحلیل نرم افزارها، فایلهای پروتکل، پردازشگرها و تجهیزات الکترونیکی است.
ورود به دنیای مهندسی معکوس و باینری
مهندسی معکوس یکی از مقوله های بسیار مهم برای تست نفوذ می باشد، زیرا برای (به اصطلاح) هک کردن هر چیزی، اول باید بدونیم که چطوری کار میکنه. مهندسی معکوس فرآیندی برای درک نحوه ی کار کرد داخلی و ساخت یک چیز می باشد، حالا چه یک جاروبرقی باشد، چه یک cpu، چه یک سیستم عامل و چه یک برنامه ای مثل Chrome Browser. در دنیای سایبری مهندسی معکوس معمولا به معکوس کردن یک برنامه کامپایل شده برای درک کردن نحوه دقیق کارکرد داخلی آن گفته میشود. در این پست به برنامه هایی که با زبان C نوشته میشن اکتفا میکنیم و بیشتر در لینوکس. به موارد اختصاصی ویندوز، سایر زبان های برنامه نویسی در پست های دیگه خواهیم پرداخت.
ورود به دنیای مهندسی معکوس، برای علاقهمندان به تکنولوژی و رایانه، بسیار شیرین و جذاب است. اما برای ورود به این دنیا، نیاز است تا دانش فنی لازم را بدست آورده و با ابزارها و تکنیکهای مورد استفاده در این حوزه آشنا شوید.
مهندسی معکوس به چه پیش زمینه هایی نیاز دارد؟
برای آغاز کار در مهندسی معکوس، میتوانید با یادگیری مفاهیم پایه مثل زبانهای برنامهنویسی، ساختار سیستمهای رایانهای و معماری نرم افزار آشنا شوید. همچنین، یادگیری تکنیکهای مختلف برای تحلیل و بازسازی سیستمها و نرم افزارها نیز بسیار مفید است.
- تسلط به assembly در معماری هدف که معمولا IA64 می باشند، و ARM و MIPS برای موبایل ها و embbeded سیستم ها.
- برنامه نویسی C و ++C
خب بهتره اول از همه بپردازیم به اینکه کامپایل کردن چیست؟ کامپایل کردن درست مثل ترجمه کردن است، در کامپایل کردن یک کد برنامه کامپایلر اون کد رو نسبت به ساختارهای تعریف شده تبدیل به یک ساختار قابل فهم برای cpu میکنه. بعد از اون لینکر قطعات ترجمه شده رو به هم وصل میکنه و پک کننده نتیجه رو به یک فایل اجرایی در میاره.
از طریق ابزارها شما میتونید اون محتویات رو به شکل قابل درک تری شامل segment های مختلف، آدرس ها و کد اسمبلی اون برنامه رو ببینید، که البته اون کد رو خود ابزارها میسازن و hint میدن. برای مهندسی معکوس شما باید اون کدها و داده ها و متاداده ها رو بخونید و طرح control flow برای آن کد ترسیم کرده و اون رو درک کنید. چند سگمنت خیلی مهم وجود دارن که از همه پرکاربردترن:
- .text: که کد به زبان ماشین در اینجا ذخیره میشه
- .data: که داده ها در اینجا ذخیره میشن
- .bss: که حافظه برای متغیرهای global و uninitialized می باشد
- .plt: که نام و آدرس routine ها رو نگه میداره.
همیشه یه آدرس بعنوان entry point قرار داده میشه که اغلب با برچسب یا همون label بنام _start شناخته میشه. در برنامه های C که کامپایل میشن توی این قسمت کارهایی از قبیل load کردن کتابخونه ها، تخصیص و init حافظه و یکسری کارهای دیگه انجام میشه و بعد تابع main شما صدا زده میشه.
برای مهندسی معکوس کردن به شخصه معمولا یطرف صفحه کد assembly یا شبه کد C که با ابزارها گرفتم رو میزارم و یه طرف دیگه یه ادیتور (vim!!!) باز میکنم شروع میکنم یه شبه کد خوانا و قابل درک برای خودم بنویسم یا نکات رو یادداشت کنم. به شما هم همین پیشنهاد رو میکنم.
کاربردهای مهندسی معکوس چی هست؟
میتوان گفت یکی از شاخه های پرکاربرد و غیر تکراریه علم سایبری، مهندسی معکوس هست که هر روزه نیاز به آن بیشتر احساس میشود.
- Malware reverse engineering (کاربرد در فارنزیک بدافزارها)
- Software reverse engineering (شکستن الگوریتم های رمزنگاری نرم افزار ها)
- Frimware reverse engineering (دستکاری واسط بین سخت افزار و نرم افزار )
- Hardware reverse engineering (برای بهبود کارایی سخت افزاری)
- Vulnerability Research (کشف آسیب پذیری ها)
ابزار های پرکاربرد در مهندسی معکوس
برای انجام دادن هر کاری به صورت فوری و به شکل صحیح، قطعا باید از ابزارهایی استفاده کنیم که مخصوص همون کار درست شده اند.
ابزار objdump
همونطور که از اسمش پیداست اطلاعات در مورد فایل باینری رو دامپ میکنه و میتونین کد اسمبلی هم ازش بگیرین.
ابزار gdb
اصولا یک دیباگر هست، ولی بدرد مهندسی معکوس و کشف اسیب پذیری ها هم کاربرد دارد.
ابزار IDA
ابزاری بسیار قوی و گرافیکی برای مهندسی معکوس که قابلیت دیباگ، ادیت، نقشه control flow کشیدن و خیلی امکانات دیگه رو داره.
ابزار GHIDRA
برنامه ای که اخیرا سازمان NSA در دسترس عموم قرار داده، که البته بنده هنوز باهاش کار نکردم.
ابزار radare2
درست مثل IDA بسیار قوی هستش، هدف از ساختش کارهای فارنزیک بوده که بعدا تبدیل شده به یک ابزار فوق العاده قوی برای مهندسی معکوس و دیباگ. البته هنوز هم برای manipulation روی هر فایل باینری میتونین ازش استفاده کنین.
ابزار readelf
همونطور که از اسمش پیداست برای تحلیل فایل های ELF بکار میره، باهاش میتونین تمام داده ها و متاداده های یک فایل elf رو نگاه کنید.
ابزار hexedit
یک ابزار خیلی خوب برای خواندن و ویرایش فایل در حالت باینری. بعضی وقت ها باید توی 0 و 1 ها رفت…
نمونه ای از مهندسی معکوس
به عنوان مثال برای مهندسی معکوس سخت افزاری، میتونیم به پهباد RQ170 آمریکایی اشاره کنیم که توسط سپاه پاسداران انقلاب اسلامی ایران به زمین نشانده شد و در حال حاضر چندین مورد از آن به صورت مهندسی معکوس طراحی و ساخته شده اند.
به عنوان مثال مهندسی معکوس نرم افزاری، میتوانیم به تمامی برنامه های پولی اشاره کنیم که امروزه ما از آنها به صورت رایگان استفاده میکنیم. اکثر این نرم افزارها برای فعال سازی خود نیاز به لایسنس یا … دارند که از طریق مهندسی معکوس راه فعال سازی نرم افزار را پیدا میکنند.
منابع پیشنهادی برای یادگیری
- کتاب Reversing از Eldad Eliam
- کتاب Hacking: the art of exploitation فصل های اول
- ساختار فایل elf
- یادگیری از مثال ها و نمونه ها: ctf writeups
- منابع تمرین: چالش های سایت root-me.org
در نهایت، کشف دنیای جذاب مهندسی معکوس، نیازمند صبر، پشتکار و تمرین مستمر است. با یادگیری مفاهیم پایه و بهرهمندی از ابزارها و تکنیکهای مورد استفاده در این حوزه، میتوانید به دنیای شیرین و جذاب مهندسی معکوس وارد شوید.