با توجه به پیشرفتهایی که در زمینه ی هوش مصنوعی صورت گرفته، این حوزه تبدیل به ابزاری کاربردی برای سایر رشته ها، از جمله امنیت سایبری شده. برای مثال قبلا در این پست، با استفاده از پلاگین Aidapal و هوش مصنوعی، کدهای دیکامپایل شده توسط IDA Pro رو به متن تبدیل کردیم.
در این پست، تحقیق اخیر محققای Ptsecurity رو بررسی کردیم که با استفاده از چت باتهای هوش مصنوعی، اپکدهای PHP رو به کدهای PHP تبدیل کردن.
برخی اوقات موقع جستجوی آسیب پذیری ها، با کدهای PHP محافظت شده روبرو میشیم. این کار اغلب با انکدرهای (Encoder) تجاری انجام میشه. این انکدرها یک کار ساده انجام میدن: سورس کد رو بصورت بایت کدهای Zend Engine کامپایل میکنن و بعدش اونو انکد میکنن. نتیجه مبهم سازی، یک چیزی مثله شکل زیر میشه:
متاسفانه ابزار متن باز یا رایگانی برای دیکد کردن، اسکریپتهای محافظت شده PHP، با انکدرهای تجاری وجود نداره. همونطور که دیکامپایلری برای بایت کدهای Zend VM وجود نداره. با این وجود آیا میشه کاری کرد؟ در این تحقیق این قضیه رو بررسی میکنیم.
نگاهی به Zend Engine:
Zend Engine نقش کلیدی در اجرای اسکریپتهای PHP بازی میکنه، این موتور هم بعنوان کامپایلر و هم بعنوان محیط اجرا، عمل میکنه. اجرای یک اسکریپت PHP با تجزیه سورس کدهای اون شروع میشه و بعدش به یک Abstract Syntax Tree (AST) تبدیل میشه. در ادامه، AST به اپکدهای (Opcode) ماشین مجازی Zend تبدیل و در نهایت اجرا میشه.
درخت نحو انتزاعی (Abstract Syntax Tree) یا به اختصار AST، یک ساختار داده درختی هستش که برای نمایش ساختار نحوی یک برنامه استفاده میشه. این ساختار، یک نمایش انتزاعی از سورس کد هستش و جزئیات سطح پایینی مانند علائم نگارشی و فاصلهها رو حذف میکنه.
برای مثال، کد PHP زیر رو در نظر بگیرید:
1 |
$X=2+3 |
AST این کد، ممکنه به این صورت باشه:
1 2 3 4 5 |
= / \ + X / \ 3 2 |
همونطور که بالا اشاره شد، انکدرهای تجاری، به غیر از مرحله ی آخر که اجرای اپکدها هستش، همه ی مراحل رو انجام میدن. به جای این کار، اونارو همراه با متادیتاهاشون سریالایز میکنن، blob حاصل رو انکد میکنن و اونارو در یک اسکریپت بوت استرپ قرار میدن.
هنگام اجرای اسکریپت انکد شده، عملیات معکوس رخ میده: دیکد و سریالایز کردن blob، بارگذاری اپکدها و متادیتاهای اونا در ماشین مجازی Zend و در نهایت، اجرای اپکدها.
در حقیقت کدهای PHP (قسمت 1)، تبدیل به اپکدها میشن و این اپکدها هم به بایت کدها که بصورت هگز هستن (قسمت 3) تبدیل میشن. از طریق ابزار OPcache میتونید بایت کدها رو ببینید، از طریق ابزارهای دیس اسمبلر VLD (Vulcan Logic Disassembler) میتونید این بایت کدهارو آنالیز کنید و اپکدها رو مشاهده کنید.
دیکد و دیس اسمبل کردن:
پس از درک اصل کار، انکدرهای تجاری، قدم بعدی ما اینه که چطوری اپکدها و متادیتاهای اونارو از یک blob انکد شده استخراج کنیم. نویسنده این چالش رو به عهده ی خواننده گذاشته. برای این منظور اینجارو چک کنید.
در این مطالعه، محقق لودر یکی از پرکاربردترین انکدرهای تجاری PHP رو آنالیز کرده و تونسته ابزاری توسعه بده که امکان استخراج و دیس اسمبل کردن، اپکدهای Zend Engine از اسکریپتهای PHP انکد شده رو فراهم میکنه.
سورس کد:
1 2 3 4 5 6 7 |
<?php function get_hello_text($name) { return "Hello, " . $name; } echo get_hello_text("PT SWARM"); |
استخراج و پیاده سازی اپکدها از کدهای انکد شده ی بالا :
محقق اعلام کرده که همین کار، برای کشف آسیب پذیری و آنالیز کافیه، اما برای اینکه کار رو ساده تر کنه، خواسته این کدهارو هم تبدیل به کد معمولی PHP کنه.
مرحله ی دیکامپایل کردن:
توسعه ی دیکامپایلر، برای ماشین مجازی Zend، یک کار دشواری هستش. بیش از 200 اپکد وجود داره که کار توسعه رو سخت میکنه.
محقق گفته برای این کار میتونستم از زبان SLEIGH در Ghidra استفاده کنم، چیزی که اینجا برای v8 انجام دادن، اما دنبال یک راه ساده تر بوده.
Ghidra یک ابزار قدرتمند مهندسی معکوس هستش که توسط آژانس امنیت ملی آمریکا (NSA) توسعه داده شده. SLEIGH یک زبان توصیفی هستش که در Ghidra، برای توصیف ساختار و رفتار انواع مختلف پردازندهها و فرمتهای فایل استفاده میشه. با استفاده از SLEIGH، میشه به Ghidra آموزش داد تا کدهای ماشین رو بصورت نمادین نمایش بده و تحلیل کنه.
هوش مصنوعی:
محقق برای سرگرمی، از چت بات Copilot مایکروسافت، خواسته تا اپکدهای Zend Engine رو دیکامپایل کنه.
و نتیجه ای که گرفته:
با توجه به اینکه، کدها ساده بودن، محقق خواسته یک چیز پیچیده تری رو بررسی کنه.
برای این کار، یک تابع تصادفی از وردپرس رو انتخاب کرده، اونو انکد کرده و در ادامه به اپکدها دیکامپایل و دیس اسمبلر کرده. در نهایت اپکدهای Zend Engine رو به چت بات فرستاده و خواسته تا اونارو به کدهای PHP تبدیل کنه.
و نتیجه ای که گرفته:
همین کار رو با تابع RC4 هم انجام داده :
و نتیجه ای که گرفته:
محقق برای اینکه مطمئن بشه، کدهای دیکامپایل شده توسط هوش مصنوعی رو اجرا کرده :
در نهایت محقق اعلام کرده که کیفیت کدهای دیکامپایل شده توسط چت باتهای مختلف متفاوت بوده. در برخی موارد دقت 100 درصدی داشتن و در برخی موارد کدها مشکلاتی داشتن. همچنین چالش دیگه محدود بودن اندازه ی داده های ارسالی به چت باتها بوده. اگه کدهای ارسالی شما طولانی باشه، با توجه به این محدودیت اندازه، همه ی کدهای شما دیکامپایل نمیشن. برای حل این مشکل میتونید اونارو به قسمتهای کوچک تقسیم کنید، یا فقط قسمتهای مهم رو برای دیکامپایل کردن بفرستید.
با همه ی این مشکلات، به دلیل استفاده ی ساده، این ابزارهای هوش مصنوعی، ارزش وقت گذاشتن رو دارن.