آخرین اخبار
همهٔ اخبار
گزارش‌ها و تحلیل‌ها گزارش بحرانیت ۳/۱۰

تحلیل و مهندسی معکوس WebAssembly: بازیابی نام توابع در فایل‌های WAMR .aot

تحلیل و مهندسی معکوس WebAssembly: بازیابی نام توابع در فایل‌های WAMR .aot

در فرآیند مهندسی معکوس (Reverse Engineering) فایل‌های باینری، مواجهه با صدها تابع بدون نام (Anonymous Functions) یکی از چالش‌برانگیزترین مراحل است. در محیط WebAssembly Micro Runtime (WAMR)، فایل‌های .aot حاوی کدهای ماشین بومی (Native Code) هستند که برای اجرا روی CPUهای خاص کامپایل شده‌اند. برای تبدیل این کدهای خام به یک تحلیل معنادار، بازیابی نام توابع و ایجاد یک جدول نمادها (Symbol Table) ضروری است.

تحلیل بخش EXPORT: منبع نام‌ها

بخش EXPORT در ساختار فایل‌های AOT، نقش نقشه‌برداری از نام‌ها به ایندکس‌های تابع را دارد. ساختار این بخش شامل تعداد ورودی‌ها و سپس لیستی از entries است که هر کدام شامل یک ایندکس، نوع (Kind) و نام تابع هستند. نکته فنی مهم در این بخش، نحوه ذخیره‌سازی رشته‌ها (Strings) است؛ WAMR از فرمت خاصی استفاده می‌کند که در آن ابتدا طول رشته (u16) ذخیره شده و کاراکتر پایان رشته (NUL) نیز جزئی از این طول محسوب می‌شود. برای بازیابی صحیح نام‌ها، باید این طول خوانده شده و کاراکتر انتهایی برای سازگاری با رشته‌های C حذف شود.

تحلیل بخش FUNCTION: تعیین جغرافیا

در حالی که بخش EXPORT نام‌ها را ارائه می‌دهد، بخش FUNCTION مکان دقیق هر تابع در بخش TEXT (جایی که کد ماشین قرار دارد) را مشخص می‌کند. این بخش شامل آرایه‌هایی از آفست‌ها (Offsets) است که نقطه شروع هر تابع را نشان می‌دهند.

یکی از پیچیدگی‌های این تحلیل، عدم ذخیره مستقیم تعداد توابع (func_count) در این بخش است. برای حل این مشکل، می‌توان از روش تخمین و اعتبارسنجی (Guess and Validate) استفاده کرد. با توجه به اینکه WAMR ممکن است از ساختارهای متفاوتی برای پشتیبانی از Stack-frame استفاده کند، ابزار تحلیل باید چندین لایه (Layout) احتمالی را بررسی کند. یک لایه زمانی پذیرفته می‌شود که:

  • اندازه بخش بر اندازه هر ورودی بخش‌پذیر باشد.
  • تمام آفست‌های استخراج شده در محدوده بخش TEXT باشند.
  • آفست‌ها به صورت صعودی مرتب شده باشند.

ترکیب داده‌ها و ایجاد جدول نمادها

با ترکیب اطلاعات استخراج شده از دو بخش EXPORT و FUNCTION از طریق ایندکس تابع، می‌توان یک جدول نمادهای کامل ایجاد کرد. این جدول هر تابع بومی را به یک نام مشخص، یک آفست دقیق در فایل و اندازه تابع (تفاضل دو آفست متوالی) متصل می‌کند.

این خروجی به تحلیل‌گر اجازه می‌دهد تا مستقیماً در یک ویرایشگر Hex یا ابزارهای Disassembler به سراغ تابع مورد نظر برود. برای مثال، تبدیل یک «بلاک کد ناشناخته در آفست 0x150» به «تابع fib با اندازه 56 بایت در آفست 0x170».

محدودیت‌ها و نکات تکمیلی

یک نکته حیاتی در این تحلیل، تعداد توابع وارد شده (import_func_count) است. در ماژول‌های مستقل، ایندکس تابع تعریف شده با ایندکس کلی برابر است. اما در محیط‌های واقعی (مانند Firmwareها) که توابع میزبان یا WASI وارد شده‌اند، این ایندکس‌ها جابه‌جا می‌شوند. برای دقت کامل در نمونه‌های پیچیده، استخراج import_func_count از بخش INIT_DATA ضروری است.

در مراحل پیشرفته‌تر، تحلیل بخش RELOCATION امکان بازیابی ارجاعات متقاطع (Cross-references) بین توابع را فراهم می‌کند که در نهایت منجر به ساخت یک Loader برای ابزارهایی مانند Ghidra می‌شود تا فایل‌های .aot را با تمام نمادها و ساختارها بازسازی کند.