مهندسی معکوس

مهندسی معکوس

القصه در این چمن چو بید مجنون      می‌بالم و در ترقیِ معکوسم!

عده‌ای این طور ادعا می‌کنند که زبان آلمانی‌، زبان فلسفه است و فرانسوی زبان عشق و شاعری است. این بار گذر ما به زبان اسمبلی افتاده است. همان عده‌ی مذکور مدعی هستند که این زبان، کلید هر نرم‌افزار متن‌بسته‌ای است! یعنی اگر شما می‌توانید اسمبلی بخوانید، دیگر متن‌بسته بودن یک شوخی کودکانه است و همه چیز برای شما متن‌باز است و می‌توانید عملکردش را بفهمید! 😎

هوم، البته باید عرض کنم که کار دشواری است. یعنی این طور عرض کنم که صد رحمت به زبان ژاپنی و چینی! اما می‌خواهیم در این منزل، الفبای این کار را یاد بگیریم و از این به بعد، هر بار به کد هم‌گذاری (همان اسمبلی!) برنامه‌ای رسیدید و به کد منبع آن دسترسی نداشتید، آن برنامه‌ را مثل گلابی تحلیل کنید و سر از کارش دربیاورید!

قبل از هرچیزی، تلاش کردیم مهم‌ترین ابزارهایی را که در این راه دشوار به آن‌ها نیاز خواهید یافت، به شما معرفی کنیم و مختصری از مفاهیم مهندسی معکوس را شرح بدهیم. بدین منظور، دل خویش به دریا فکنید و ویدیوی زیر را ببینید

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

شفاف‌سازی: در ویدیو مقدمه سیستم رونی زمانی‌که در حال تست ابزار Pin است دچار فروپاشی می‌شود و این بخش از ویدئو را بعدا اصلاح کرده‌ایم!

و اما ابزارهایی که در این ویدئو معرفی شده است:

  • رادار

    عجیب است که چنین ابزار گل و عزیزی رایگان است! پروژه‌ی رادار، تجلی هنر برنامه‌نویسی دقیق، توسعه‌ی گروهی نرم‌افزار متن‌باز و خلاصه خفن بودن است. به نظر می‌رسد کاری نیست که آدمیزاد بخواهد در رادار انجام بدهد و نتواند! شاید روزی برای شاگردان خود در کلاس‌های درس مهندس معکوس، بگویید که آن ایام قدیم یک بسم الله می‌گفتیم و یک ترمینال باز می‌کردیم و می‌پریدیم توی r2 و دیگر بقیه‌اش آسان بود! (یا می‌توانید بگویید سخت بود البته به نظرم واقعا سخت هم هست! هر جور دوست دارید خاطره را تعریف کنید.) به هر حال نکته‌ی مهم این است که رادار رایگان است!

  • رادار ۲
  • The radare2 bible
  • رادار۳ [404]
  • اسکریپت‌نویسی پایتون برای رادار۲ [1] [2]
  • اسکریپت‌نویسی سایر برنامه‌ها برای رادار۲
  • بسته‌های دیکامپایلر برای رادار۲ [Ghidra!] [r2dec]

    همچنین می‌توانید با استفاده از عبارت 'r2pm search dec' هر بسته‌ای را ببینید.

  • cutter
  • objdump (from binutils)
  • ltrace
  • strace
  • gdb (The King)
  • hexedit
  • ghex
  • pin
  • IDA pro (cracked!)

گفتی که صبور باش، هیهات!

مثال اولی که به آن می‌پردازیم، در مسابقه‌ی Codegate Quals 2014 مطرح شده است. شما می‌توانید پرونده‌ی مربوط به این سوال را از اینجا دریافت کنید.

پیشنهاد ویژه داریم که حتما قبل از دیدن این ویدئو، خودتان تلاش کنید سوال را حل نمایید.

وز گوشه‌ی صبر بهترم نیست

سوال دوم از مسابقه‌ی CSASW Finals 2018 هست. شما می‌توانید پرونده‌ی مربوط به این سوال را از اینجا دریافت کنید. باز هم توصیه می‌کنیم اول خودتان تلاش کنید سوال را حل کنید.

اکنون که طریق دیگرم نیست

به‌روزرسانی: با توجه به اتمام مهلت ارسال پاسخ، مشروح راه‌حل مربوط به دو سوال مسابقه را می‌توانید در اینجا و اینجا ببینید.

مهندسی معکوس بسیار جذاب است و خیلی حوصله می‌خواهد. خیلی زیاد. خیلی زیاد تمرین هم می‌خواهد و حوزه‌ی بسیار مهمی است. در سایر زمینه‌های امنیت مثل بهره‌جویی از پرونده‌های دودویی، مهندسی معکوس اهمیت پیدا می‌کند.

اکنون در صفحه‌ی پرچم‌گیری چالش جدیدی پیش روی شماست. این چالش، نسبتا آسان‌تر‌ است.بعد از روز ۲۶ام، چالش دیگری که نسبتا سخت‌تر است پیش روی شما قرار خواهد گرفت که برای فرستادن پرچم هر دو سوال تا ۳ آبان مهلت دارید.

در بازه‌ی متناظر با ارسال پرچم، می‌توانید مشروح راه‌حل آن سوال را هم ارسال کنید تا هم امتیازتان در جدول بیشتر شود هم امکان کسب جایزه‌ی سوال را داشته باشید.

مشروح راه‌حل خود را در قالب Markdown بنویسید و آن را از طریق ایمیل برای ما ارسال کنید.

موضوع ایمیل خود را به این شکل بنویسید: RE :: TaskX که به جای X عدد 1 یا 2 قرار می‌گیرد که مشخص می‌کند راه‌حل کدام سوال نوشته شده است.

حرف آخر

مهندسی معکوس یعنی حدس زدن چگونگی عمل‌کرد هر سامانه‌ای. اما هر حدسی که قابل اعتنا نیست! برای این که بشود در مهندسی معکوس قوی شد، بایستی مدام در پی اندوختن تجربه‌های بیشتر بود تا بتوان حدس‌های پخته‌تری زد!

یک راه مناسب برای کسب تجربه، به چالش کشیدن خود است. یعنی چیزی را بسازیم و بعد ببینیم که آیا می‌توانیم حاصل کار خودمان را معکوس کنیم؟

پس باید دست به کار شویم. مثلا یک تکه‌کد ساده به زبان C بنویسیم و آن را به زبان معماری مثلا x86_64 ترجمه کنیم. به شکل‌های مختلف gcc را فراخوانی کنیم و ببنیم در پرونده‌ی اجرایی حاصل، چه تغییراتی ایجاد می‌شود. سپس همان کد را پیچیده‌تر کنیم و هر بار همین روند را تکرار کنیم و تکرار کنیم تا با الگوهای متداول در زبان هم‌گذاری (بله منظورمان اسمبلی است!) آشنا شویم. بعد از این، می‌توان سراغ ترجمه‌کردن زبان‌های دیگر رفت و یا به معماری‌های دیگری ترجمه کرد!

راستی، دیگر بیش از این سفارش نکنیم، ناامید نشوید!

بنشینم و صبر پیش گیرم
دنباله‌ی کار خویش گیرم