مسیر موضوعی
مهندسی معکوس
Reverse Engineering
برنامهی کامپایلشدهای را که خودتان ساختهاید بخوانید: فایل را پارس کنید، دستورالعملها را رمزگشایی نمایید، آنها را به شبهکد ارتقا دهید (lift)، شواهد را ثبت کنید و اثبات نمایید که بازسازی نهایی یکسان است؛ سپس مفاهیم پیرامون این پایپلاین را به همراه ابزارهای اصلی آن یاد بگیرید.
- ۱۴ درس
- ۳۲ ساعت و ۲۵ دقیقه زمان درسها
پیش از شروع
- پایتون، مبنای شانزده (هگزادسیمال) و خط فرمان: شما میتوانید کدهای Python را بخوانید، دستورات را اجرا کنید و تبدیل بین هگزادسیمال و دهدهی را انجام دهید. هیچ تجربهی پیشینی در زبان اسمبلی یا تحلیل باینری نیاز نیست.
- نسخهی Python 3.10 یا بالاتر: تمام بخشهای خواندن فایل، رمزگشایی، ارتقا به شبهکد و دفاتر ثبت (ledger) در این مسیر تنها از کتابخانهی استاندارد Python استفاده میکنند. مجموعهدادههای نمونهی کامپایلشده در مخزن موجود هستند.
- ابزار clang برای بازسازی مجموعهدادههای نمونه و درس 36: ابزار clang مجموعهدادههای نمونه را از سورس بازسازی کرده و درایور مقایسهای درس 36 را کامپایل میکند. بدون آن، درس 36 اشیای commit شده را میخواند و وضعیت رفتاری آنها را ناشناخته (unknown) گزارش میدهد.
- تنها برنامههایی را تحلیل کنید که خودتان ساختهاید یا مجاز به تحلیل آنها هستید: پیش از آزمایشگاه درس 32، مطمئن شوید که تمام اهداف تحلیلی، برنامههایی هستند که خودتان نوشته و کامپایل کردهاید، یا برای آنها مجوز کتبی دارید. درس 32 با قوانین حقوقی و چارچوبهای کسب مجوز آغاز میشود.
شروع سریع (۱۰ دقیقه): یک آبجکت کامپایلشده را که بایتهایش را بهصورت دستی ننوشتهاید پارس کنید و بخشها (sections)، نمادها (symbols) و بازآدرسدهیهای آن را نام ببرید. شروع ←
درسها به ترتیب
- کالبدشناسی فایل باینری: ساخت خوانشگر ELF از صفر با پایتون
- دیساسمبلی و جریان کنترل: از بایتها تا ساخت گراف در x86-64
- تبدیل اسمبلی به شبهکد: پیادهسازی IR، فرم SSA و ساختاربندی از صفر
- شواهد، سطح اطمینان و مجهولات در تحلیل باینری
- بازسازی و اثبات برابری کدهای دیکامپایلشده: تست تفاضلی و مقایسه بایت
- اکوسیستم مهندسی معکوس: تاریخچه، خانواده ابزارها و معماری دیکامپایلرها
- شیوههای فراخوانی و فریمهای پشته: System V، ویندوز x64 و AArch64
- اصطلاحات کامپایلر: بهینهسازی چگونه کد را دگرگون میکند و چطور آن را رمزگشایی کنیم
- پیوند، بارگذاری و باینریهای استریپشده: سازوکار PLT، GOT و شناسایی توابع
- بازیابی دادهها و ساختار نوعها: استراکتها، آرایهها، اشیاء ++C و DWARF 5
- تحلیل پویای برنامه با دیباگرها، ردگیری و ارزیابی ادعاهای ایستا
- مهندسی معکوس بایتکد پایتون، JVM، داتنت و WebAssembly
- تفاضلگیری باینری و اجرای نمادین: تطابق توابع و حل متغیرهای ورودی
- مهندسی معکوس با هوش مصنوعی: دکامپایلرها، ایجنتها و دادهی واقعی