هک پروگرامر ST-Link: نفوذ به بوت لودر!

0
749
هک پروگرامر ST-Link
هک پروگرامر ST-Link

در قسمت قبلی آموزش هک پروگرامر ST-Link چهار ایده را برای انجام این هک مطرح‌کردیم؛ دو روش نخست که درواقع از ابتدایی‌ترین روش‌ها هستند را بررسی‌کردیم که متأسفانه یا خوشبختانه، هیچ‌کدام نتیجه نداد. اگر قسمت اول مقاله را مطالعه نکرده‌اید توصیه می‌کنیم که پیش از خواندن این مقاله، قسمت پیشین را حتماً بخوانید. در این قسمت از مقاله سعی داریم بااستفاده‌از بوت لودر نشان‌دهیم که چطور می‌توان به firmware دست پیدا کرد. با ما همراه باشید.

چرا نفوذ به بوت لودر؟

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

  1. احتمالاً نرم‌افزار به‌روزرسانی باید حاوی فایل موردنظر جهت به‌روزرسانی پروگرامر باشد.
  2. رصدکردن اطلاعات تبادل‌شده بین کامپیوتر و پروگرامر

هنگام به‌روزرسانی با کمی‌دقت در این دو روش، متوجه می‌شویم که هردوروش درواقع مربوط‌به قسمت بوت لودر هستند. اول باید بررسی‌کنیم و ببینیم آیا نرم‌افزاری که جهت به‌روزرسانی پروگرامر ST-Link توسط شرکت ST ارائه شده‌است، تا چه اندازه می‌تواند ما را به هدف، یعنی هک ST-Link کمک کند.

بوت لودر چیست؟

بوت لودر STN32
بوت لودر STN32

 

ممکن‌است برایتان سؤال شده‌باشد که بوت لودر چیست و چه‌کاری انجام می‌دهد. بوت لودر درواقع یک برنامه است که برروی حافظه میکروکنترلر پروگرام می‌شود. این برنامه ممکن‌است توسط هرکسی نوشته‌شده‌باشد و این‌طور نیست که حتماً ازطریق شرکت سازنده چیپ ارائه‌شده‌باشد. بوت لودر نقش حیاتی در به‌روزرسانی و ارتقاء یک محصول بازی می‌کند؛ چراکه به تولیدکننده این امکان را می‌دهد که از راه دور و از طریق مصرف‌کننده firmware محصول به‌روزرسانی شود.
به زبان ساده، بوت لودر برنامه‌ای است که در قسمت مشخصی از حافظه ریخته می‌شود و وظیفه اصلی آن تغییر برنامه پردازنده است و این تغییر برنامه را از طریق پورت‌های استاندارد که کاربر در اختیار دارد (مثل USB یا سریال ) انجام می‌دهد.
فرض‌کنید شما محصولی را تولیدکرده‌باشید و به تعداد زیاد در بازار به فروش رسانده‌باشید. پس‌از گذشت مدتی مشخص می‌شود که در شرایطی‌خاص، دستگاه موردنظر عملکرد مورد انتظار را ندارد (مثلاً وجود باگ). اولین گام، رفع باگ موردنظر است و در گام دوم دستگاه‌های فروخته‌شده باید به‌روزرسانی شوند. درصورتی‌که فرض‌کنیم بوت لودر وجود نداشته‌باشد، شما باید تمام دستگاه‌ها را فراخوانی کنید یا خود در محل نصب دستگاه حاضر شوید و دستگاه‌ها را بااستفاده‌از پروگرامر آپدیت کنید. اما فرض‌کنید که بوت لودر داشته‌باشید، firmware را دراختیار خریداران می‌گذارید و کاربران بااستفاده‌از یک رابط استاندارد مثل USB، دستگاه خود را آپدیت می‌کنند. همان‌طورکه حدس می‌زنید امروزه بیشتر دستگاه‌های الکترونیکی مانند گوشی‌های هوشمند، تلویزیون‌های هوشمند، سینمای خانگی و … بوت لودر دارند.

بوت لودر پروگرامر ST-Link چطور کار می‌کند؟

حال‌که با مفهوم بوت لودر آشنا شدیم قبل‌از نفوذ به بوت لودر باید بررسی کنیم که بوت لودر ST-Link چطور کار می‌کند و از چه بستری برای انتقال اطلاعات استفاده می‌کند. ممکن‌است سریع پاسخ‌دهید که از USB، بله اما منظور سخت‌افزارِ کانکشن نیست، منظور لایه‌های نرم‌افزاری است. همان‌طورکه می‌دانید رابط USB بسته‌به تنظیماتی که روی آن اعمال می‌شود قادربه پشتیبانی استانداردهای مختلفی نظیر CDC ، HID ، Bulk و … است. قبل‌از هر اقدامی لازم‌است بررسی‌کنیم که بوت لودر از چه لایه نرم‌افزاری استفاده می‌کند. برای بررسی این موضوع کافی‌ست که به درایورهای ST-Link نگاه کنیم. لینوکس که تقریباً نیازی به درایور ندارد ولی می‌توانیم فایل‌های درایور ویندوز مخصوص پروگرامر ST-Link که توسط سایت ST منتشرشده‌است را بررسی‌کنیم.

بوت لودر ST-Link
بوت لودر ST-Link

 

بعداز دانلود و بازکردن فایل درایور، دو فایل مشخص‌شده، سرنخ‌های خوبی را در اختیار ما می‌گذارند. فایل stlink_VCP.inf که درواقع رابط پورت USB به سریال است مشخص می‌کند که احتمالاً یکسری ST-Link وجود دارد که دارای پورت سریال نیز هستند اما چه دستگاه‌هایی؟ بادقت‌به بخش‌زیر از فایل درمی‌یابیم که حداقل ۴مدل ST-Link وجود دارد که داری مبدل سریال نیز هستند:

%DeviceNameVCP% =USB_InstallVCP, USB\VID_0483&PID_374A&MI_02
%DeviceNameVCP% =USB_InstallVCP, USB\VID_0483&PID_374B&MI_02
%DeviceNameVCP% =USB_InstallVCP, USB\VID_0483&PID_374E&MI_02
%DeviceNameVCP% =USB_InstallVCP, USB\VID_0483&PID_374F&MI_02

 

پس تا اینجا میدانیم که حداقل 4 firmware مجزا برای پروگرامر ST-Link وجود دارد که همه ۴مدل مختلف دارای مبدل USB به سریال نیز هستند. واضح‌است‌که احتمالاً باید انواع بیشتری firmware وجودداشته‌باشد؛ چراکه مدل‌های موجود از پروگرامر ST-Link در بازار ایران، دارای این مبدل نیستند. پس به سراغ فایل دوم یعنی stlink_dbg_winusb.inf که شامل اینترفیس‌های زیر است می‌رویم:

%DeviceName% =USB_Install, USB\VID_0483&PID_3748
%DeviceName% =USB_Install, USB\VID_0483&PID_374A&MI_00
%DeviceName% =USB_Install, USB\VID_0483&PID_374B&MI_00
%DeviceName% =USB_Install, USB\VID_0483&PID_374E&MI_00
%DeviceName% =USB_Install, USB\VID_0483&PID_374F&MI_00
%DeviceNameRW% =USB_InstallRW, USB\VID_0483&PID_374A&MI_01
%DeviceNameUsbLoader% =USB_Install, USB\VID_0483&PID_374D

 

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

%DeviceNameUsbLoader% =USB_Install, USB\VID_0483&PID_374D

 

تمام حالت‌های توصیف‌شده در فایل درایور، احتمالاً درحالت Bulk تعریف شده‌اند. کلاس Bulk، درواقع‌از استاندارد تعریف‌شده‌ای پشتیبانی نمی‌کند و برنامه کامپیوتری باید به‌صورت مستقیم با اندپویت‌های تعریف‌شده در ارتباط باشد. البته احتمالاً باید از دستورات DFU برای بوت لودر استفاده‌شده‌باشد.

بررسی نرم‌افزار آپدیتر پروگرامر ST-Link

دانلود ST-Link
دانلود ST-Link

 

گام بعدی برای شناخت نحوه کارکردن بوت لودر و درادامه هک پروگرامر ST-Link، بررسی نرم‌افزار آپدیتر این پروگرامر است که توسط شرکت ST برای به‌روزرسانی پروگرامر ارائه‌شده‌است. برای دانلود آخرین نسخه از نرم‌افزار ST-Link می‌توانید به این آدرس مراجعه‌کنید. خوشبختانه شرکت ST این نرم‌افزار را در دو ورژن ویندوز و مولتی پلتفرم ارائه‌کرده‌است. نرم‌افزار ارائه‌شده برای مولتی پلتفرم با جاوا نوشته‌شده‌است و این جای بسی خوشحالی‌است چراکه همان‌طورکه می‌دانید جاوا یک زبان میانی است و کد درواقع به معنای واقعی کامپایل نمی‌شود و با صرف مقداری وقت می‌توان سورس‌های اولیه را استخراج کرد. بعداز بازکردن نرم‌افزار، فایل‌های‌زیر توجه‌ما را به خود جلب می‌کنند:

firmware جدید
firmware جدید

 

نام‌گذاری و فرمت مورداستفاده به خوبی مشخص می‌کند که این فایل‌ها، احتمالاً firmware جدید هستند. ازقبل هم می‌دانیم که احتمالاً چند مدل ST-Link مختلف باید وجودداشته‌باشد که وجود این فایل‌ها نظریه را تأیید می‌کند. البته خیلی‌بعید است که به‌این راحتی توانسته‌باشیم فایل firmware پروگرامر را پیدا کرده باشیم. یکی‌از احتمالات قوی این است که فایل‌های مذکور کدگذاری شده باشند؛ چراکه معمولاً شرکت‌های بزرگ و حرفه‌ای نکات امنیتی را در محصولات خود لحاظ می‌کنند و دور از ذهن است که فایل‌های موردنظر به شکل بدون کدگذاری در درون برنامه قرار گرفته باشد.

نکته امنیتی: اگر از بوت لودر برای به‌روزرسانی دستگاه‌های خود استفاده می‌کنید به‌یاد داشته‌باشید که فایل firmware را حتماً با روشی ایمن کدگذاری کنید. اینکار مانع مهندسی معکوس محصول شما خواهد شد.

خب از کجا می‌توانیم متوجه‌شویم که فایل‌های مذکور کدگذاری شده‌اند یا خیر؟ یکی‌از شیوه‌های متداول بررسی پراکندگی داده‌است: در یک فایل firmware معمولاً تعداد صفر زیادی وجود دارد یا بایت کدهای اسمبلی معمولاً کوچک هستند و به‌ندرت از عدد ۱۹۲بزرگ‌تر می‌شوند. اما اگر فایل کد شده باشد، این الگو به هم خواهد ریخت و فراوانی تمام اعداد در حد یکسانی خواهد بود. پس با بررسی فراوانی به‌راحتی میتوان متوجه‌شد که فایل مذکور کدگذاری شده‌است یا خیر.

پراکندگی داده‌ها
پراکندگی داده‌ها

 

همان‌طورکه در تصویرفوق مشاهده می‌کنید، پراکندگی داده‌ها (تعداد صفرها، یک‌ها، دوها …تا ۲۵۵) در فایل firmware به نمایش گذاشته شده‌است. تقریباً تمام داده‌ها به تعداد یکسانی تکرار شده‌اند. این بدان معناست که این فایل کدگذاری شده‌است و برای دسترسی به داده‌های آن لازم‌است ابتدا قفل آن باز شود و دیکد شود. در این مرحله دو سؤال اساسی مطرح می‌شود: اول اینکه داده‌ها براساس چه الگوریتمی کدگذاری شده‌اند و دوم، از چه کلیدی برای رمزگذاری آن استفاده‌شده‌است؟ درپاسخ‌به سؤال اول باید بگوییم که خیلی پیچیده نیست؛ الگوریتم‌هایی که معمولاً برای کدگذاری داده‌ها در سیستم‌های Embeded استفاده می‌شوند، زیاد نیستند و باتوجه‌به الگوی پراکندگی و فاصله قله‌ها می‌توان حدس زد که احتمالاً از نوع AES-128 باشد. اما پیداکردن کلید، شاید سخت‌ترین قسمت ممکن است. اگر به عکس محیط نرم‌افزار توجه‌کنید قسمتی‌است که نشان می‌دهد آخرین ورژن firmware چند است (یعنی نرم‌افزار پروگرامر شما را به چه ورژنی آپدیت خواهد کرد) مانند عکس زیر:

چک کردن ورژن
چک کردن ورژن

 

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

 

 

 

منبع: سیسوگ

مطلب قبلیآموزش میکروکنترلر STM32 قسمت سوم: چالش تأخیر
مطلب بعدیقسمت چهارم STM8 CubeMX

پاسخ دهید

لطفا نظر خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید