ورود به دنیای مهندسی معکوس

ورود به دنیای مهندسی معکوس و باینری

مهندسی معکوس چیست؟

مهندسی معکوس یکی از مقوله های بسیار مهم برای تست نفوذ می باشد، زیرا برای (به اصطلاح) هک کردن هر چیزی، اول باید بدونیم که چطوری کار میکنه.
مهندسی معکوس فرآیندی برای درک نحوه ی کار کرد داخلی و ساخت یک چیز می باشد، حالا چه یک جاروبرقی باشد، چه یک cpu، چه یک سیستم عامل و چه یک برنامه ای مثل Chrome Browser. در دنیای سایبری مهندسی معکوس معمولا به معکوس کردن یک برنامه کامپایل شده برای درک کردن نحوه دقیق کارکرد داخلی آن گفته میشود. در این پست به برنامه هایی که با زبان C نوشته میشن اکتفا میکنیم و بیشتر در لینوکس. به موارد اختصاصی ویندوز، سایر زبان های برنامه نویسی در پست های دیگه خواهیم پرداخت.

مهندسی معکوس به چه پیش زمینه هایی نیاز دارد؟

  1. تسلط به assembly در معماری هدف که معمولا IA64 می باشند، و ARM و MIPS برای موبایل ها و embbeded سیستم ها.
  2. برنامه نویسی 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

ابزار objdump

همونطور که از اسمش پیداست اطلاعات در مورد فایل باینری رو دامپ میکنه و میتونین کد اسمبلی هم ازش بگیرین.

ابزار gdb

ابزار gdb

اصولا یک دیباگر هست، ولی بدرد مهندسی معکوس و کشف اسیب پذیری ها هم کاربرد دارد.

ابزار IDA

ابزار IDA

ابزاری بسیار قوی و گرافیکی برای مهندسی معکوس که قابلیت دیباگ، ادیت، نقشه control flow کشیدن و خیلی امکانات دیگه رو داره.

ابزار GHIDRA

ابزار GHIDRA

برنامه ای که اخیرا سازمان NSA در دسترس عموم قرار داده، که البته بنده هنوز باهاش کار نکردم.

ابزار radare2

ابزار radare2

درست مثل IDA بسیار قوی هستش، هدف از ساختش کارهای فارنزیک بوده که بعدا تبدیل شده به یک ابزار فوق العاده قوی برای مهندسی معکوس و دیباگ. البته هنوز هم برای manipulation روی هر فایل باینری میتونین ازش استفاده کنین.

ابزار readelf

ابزار readelf

همونطور که از اسمش پیداست برای تحلیل فایل های ELF بکار میره، باهاش میتونین تمام داده ها و متاداده های یک فایل elf رو نگاه کنید.

ابزار hexedit

ابزار hexedit

یک ابزار خیلی خوب برای خواندن و ویرایش فایل در حالت باینری. بعضی وقت ها باید توی 0 و 1 ها رفت…

نمونه ای از مهندسی معکوس

به عنوان مثال برای مهندسی معکوس سخت افزاری، میتونیم به پهباد RQ170 آمریکایی اشاره کنیم که توسط سپاه پاسداران انقلاب اسلامی ایران به زمین نشانده شد و در حال حاضر چندین مورد از آن به صورت مهندسی معکوس طراحی و ساخته شده اند.

به عنوان مثال مهندسی معکوس نرم افزاری، میتوانیم به تمامی برنامه های پولی اشاره کنیم که امروزه ما از آنها به صورت رایگان استفاده میکنیم. اکثر این نرم افزارها برای فعال سازی خود نیاز به لایسنس یا … دارند که از طریق مهندسی معکوس راه فعال سازی نرم افزار را پیدا میکنند.

منابع پیشنهادی برای یادگیری

  • کتاب Reversing از Eldad Eliam
  • کتاب Hacking: the art of exploitation فصل های اول
  • ساختار فایل elf
  • یادگیری از مثال ها و نمونه ها: ctf writeups
  • منابع تمرین: چالش های سایت root-me.org

 

4 دیدگاه
  1. arman می گوید

    سلام آیا آموزش فارسی موجود هست

    1. یوسف وفایی می گوید

      سلام
      باید جستجو کنید.

    2. سید محسن میرکریمی می گوید

      سلام، مطمئن نیستم، اما اکثرا منابع انگلیسی کاملترن.

  2. rezareza می گوید

    ممنون از مطالب خوبتون
    واقعا بهترین هستید

نوشتن دیدگاه

آدرس ایمیل شما منتشر نخواهد شد.