
لدي صديق يعمل في إصلاح الحديد السيارات. لقد أحضرني بطريقة ما إلى متحكم ملحوم من وحدة التحكم في السخان المستقلة. قال إن مبرمجه لا يأخذ ذلك ، ويود أن يكون قادرًا على نقل البرامج الثابتة ذهابًا وإيابًا ، لأن هناك العديد من القطع ، في الحديد غالبا ما تكون هي نفسها ، ولكن الوحدات التي يسيطرون عليها مختلفة. ويبدو أن هناك كتلة بدلاً من واحدة معيبة ، ولكن البرنامج مختلف ولا يمكنك استبداله. منذ المهمة كانت مثيرة للاهتمام ، قررت البحث في جميع أنحاء. إذا كان الموضوع مثيرًا لك ، من فضلك ، تحت القط ...
كان الموضوع M306N5FCTFP. هذا هو متحكم لمجموعة M16C / 6N5. تم تطوير M16C / 60 الأساسية بواسطة Mitsubishi ، و منذ عام 2003 ، أصبحت رينيساس خلفًا لهذه الشركة من حيث MK ، والآن أصبحت هذه المتحكمات الدقيقة معروفة تحت هذه العلامة التجارية.
قليلا عن متحكم نفسه
حصاة هو متحكم 16 بت في حزمة QFP 100 دبوس. يحتوي kernel على 1 ميغا بايت من مساحة العنوان ، وتردد الساعة من 20 ميغاهرتز لأداء السيارات. مجموعة الأجهزة الطرفية واسعة جدًا أيضًا: مؤقتان 16 بت وإمكانية توليد PWM ثلاثي الطور للتحكم في المحركات ، جميع أنواع UART ، SPI ، I2C بشكل طبيعي ، قناتين DMA ، يوجد جهاز تحكم CAN2.0B مدمج ، بالإضافة إلى PLL. في رأيي ، إنه جيد جدًا للرجل العجوز. فيما يلي مخطط نظرة عامة من الوثائق:

نظرًا لأن مهمتي هي تمزيق البرنامج ، فهي أيضًا مهتمة جدًا بالذاكرة. تم إنتاج MK هذا في نسختين: ملثمين وفلاش. حصلت ، كما ذكر أعلاه ، على M306N5FCTFP. عنه ، يقول الوصف ما يلي:
- نسخة ذاكرة فلاش
- 128 كيلوبايت + 4K (4K إضافية - ما يسمى بلوك A كهدية للمستخدم لتخزين البيانات ، ولكن يمكن أيضًا تخزين البرنامج)
- V-الاصدار. (نسخة السيارات مع مجموعة من + 125 درجة مئوية)
كيفية السحب من الجهاز ما جر المطورين
من الطبيعي فقط أن تبدأ في محاولة الحصول على شيء من المتحكم الدقيق من خلال دراسة الآليات التي تم دمجها بواسطة مطور الشرائح لمهام برمجة الذاكرة. ينص الدليل على أن الشركة المصنّعة تفضلت بوضع محمل الإقلاع في الذاكرة لتلبية احتياجات البرمجة داخل الدائرة.

كما ترون من الصورة أعلاه ، تنقسم الذاكرة إلى قسمين: منطقة المستخدم ، ومنطقة أداة تحميل التشغيل. في الثانية ، يتم تحميل أداة تحميل التشغيل الافتراضية من المصنع ، الذي يمكنه كتابة أو قراءة أو محو ذاكرة المستخدم ويتواصل عبر واجهة غير متزامن أو متزامن أو CAN. يشار إلى أنه يمكن إعادة كتابتها بنفسك ، أو قد لا تتم إعادة كتابتها. في النهاية ، يمكن التحقق من ذلك بسهولة من خلال محاولة الضغط على محمل الإقلاع القياسي على الأقل من خلال UART ... التطلع إلى الأمام: لم تهتم الشركة المصنعة للتسخين بمحمل الإقلاع الخاص بها ، لذلك يمكنك التنقيب أكثر في هذا الاتجاه. تحفظ فوراً على أنه لا يزال هناك طريقة برمجة متوازية ، لكن منذ ذلك الحين لم يكن لدي مبرمج لهذا ، لم أفكر في هذا الخيار.
يتم توفير الدخول إلى وضع تشغيل أداة تحميل التشغيل من خلال مجموعة معينة في المدخلات CNVSS و P5_0 و P5_5 أثناء إعادة ضبط الجهاز. بعد ذلك ، إما كتابة الأداة المساعدة الخاصة بك لنسخ محتويات الذاكرة ، أو استخدام الأداة النهائية. توفر Renesas الأداة المساعدة الخاصة بها ، والتي يطلق عليها "M16C Flash Starter" ، لكن لديها وظيفة قراءة مخفضة. لا يحفظ ما يقرأه على القرص ، لكنه يقارنه بملف من القرص. أي في الواقع ، هذه ليست القراءة ، ولكن التحقق. ومع ذلك ، هناك أداة مساعدة ألمانية مجانية تسمى M16C-Flasher ، والتي يمكنها قراءة البرامج الثابتة. بشكل عام ، تم اختيار مجموعة الأدوات الأولية.
حول حماية القراءة

سيكون كل شيء بسيطًا جدًا إذا لم يوفر أداة تحميل التشغيل الحماية ضد الوصول غير المصرح به. سأقدم فقط ترجمة مجانية من الدليل.
وظيفة التحقق من الهوية
المستخدمة في وسائط التبادل التسلسلي و CAN. تتم مقارنة المعرف الذي يرسله المبرمج بالمعرف المسجل في ذاكرة الفلاش. في حالة عدم تطابق المعرفات ، لن يتم قبول الأوامر المرسلة من قبل المبرمج. ومع ذلك ، إذا كانت 4 بايت من متجه إعادة التعيين هي FFFFFFFFh ، فلن تتم مقارنة المعرفات ، مما يسمح بتنفيذ جميع الأوامر. المعرف هو 7 بايت يتم تخزينه بالتتابع ، بدءًا من البايت الأول ، في العناوين 0FFFDFh و 0FFFE3h و 0FFFEBh و 0FFFEFh و 0FFFF3h و 0FFFF7h و 0FFFFBh.وبالتالي ، من أجل الوصول إلى البرنامج ، تحتاج إلى معرفة 7 بايت العزيزة. مرة أخرى ، واستشرافًا للمستقبل ، قمت بالاتصال بـ MK باستخدام نفس "M16C Flash Starter" وتأكدت من أن مجموعات الأصفار و FF لم تنجح وأن هذه المشكلة يجب حلها بطريقة أو بأخرى. ظهرت فكرة مع الهجوم من خلال قنوات الطرف الثالث على الفور هنا. بدأت بالفعل في التظاهر بأنني أرتدي الحجاب في رأسي ، مما يسمح لي بقياس التيار في دائرة الطاقة ، لكنني قررت أن الإنترنت كبير وأن معظم الدراجات قد تم اختراعها بالفعل. بعد إجراء بعض عمليات البحث ، وجدت بسرعة على hackaday.io مشروع Serge 'q3k' Bazanski ، بعنوان "Reverse engineering Toshiba R100 BIOS". وفي إطار هذا المشروع ، حل المؤلف بشكل أساسي المشكلة نفسها بالضبط: استخراج البرامج الثابتة من MK M306K9FCLR. علاوة على ذلك - في ذلك الوقت تم بالفعل حل المهمة بنجاح من قبله. من ناحية ، كنت منزعجًا قليلاً - لم يحل لغزًا مثيرًا للاهتمام. من ناحية أخرى ، تحولت المهمة من البحث عن الضعف ، إلى استغلالها ، والتي وعدت بحل أسرع بكثير.
باختصار ، بدأت Q3k ، بنفس المنطق تمامًا ، الدراسة بتحليل الاستهلاك الحالي ، في هذا الصدد كانت في ظروف أكثر ملاءمة ، لأن كان لديه ChipWhisperer ، ما زلت لم أحصل على هذا الشيء. لكن منذ ذلك الحين تبين أن أول تحقيق له لإزالة تيار الاستهلاك غير مناسب وأنه لم يستطع عزل شيء مفيد عن الضوضاء ، فقرر تجربة هجوم بسيط على وقت الاستجابة. الحقيقة هي أن أداة تحميل التشغيل تسحب إخراج BUSY أثناء تنفيذ الأمر لإعلام المضيف أنه مشغول أو جاهز لتنفيذ الأمر التالي. وفقًا لافتراض q3k ، فإن قياس الوقت من إرسال آخر جزء من المعرف إلى إزالة العلامة المزدحمة يمكن أن يكون مصدرًا للمعلومات أثناء التعداد. عند التحقق من هذا الافتراض عن طريق تعداد البايت الأول من المفتاح ، تم العثور على انحراف زمني في حالة واحدة فقط - عندما كانت البايتة الأولى تساوي FFh. من أجل راحة قياس الوقت ، أبطأ المؤلف عضو الكنيست من خلال إيقاف تشغيل مرنان الكوارتز وتطبيق موجة مربعة قدرها 666 كيلو هرتز على مدخلات الساعة لتبسيط إجراءات القياس. بعد ذلك ، تم تحديد المعرف بنجاح واسترداد البرنامج.
أول فطيرة - أشعل النار
ها! لقد فكرت ... الآن ، قمت بسرعة بتثبيت البرنامج على STM32VLDiscovery c STM32F100 على متن الطائرة ، والذي سيرسل الكود ويقيس وقت الاستجابة ، ويبصق نتائج القياس في الجهاز. لأن تم توصيل السبورة المزودة بوحدة التحكم الهدف مسبقًا بجهاز الكمبيوتر عبر محول USB-UART ، حتى لا نغير أي شيء على اللوح ، سنعمل في وضع غير متزامن.

عند بدء تشغيل أداة تحميل التشغيل ، يتم سحب الإدخال CLK1 إلى الأرض ، ويدرك أنه يريد اتصالًا غير متزامن منه. لهذا السبب اعتدت على ذلك - لقد كان اللحام ملحومًا بالفعل وقمت فقط بتوصيل اللوحين بأسلاك: ديسكفري واللوحة المستهدفة M306.
ملاحظة حول تنسيق المستويات:
لأن نظرًا لأن M16 يحتوي على مستويات TTL على الأجهزة الطرفية ، وأن STM32 لديها LVTTL (مبسطة ، راجع ورقة البيانات للحصول على التفاصيل) ، ثم تكون مطابقة المستوى ضرورية. لأن هذا ليس جهازًا ، مثل البطارية المعروفة ، يجب أن يعمل ويعمل ويعمل ، لكنه في الحقيقة يتصل مرة واحدة على الطاولة ، ثم لم أكن قلقًا من المترجمين التحريريين: مستويات الإخراج التي تم هضمها بقدرة 5 فولت من STM ، بمعنى 3 فولتات تعتبرها "1" ، يتم تغذية المخرجات من M16 إلى مدخلات STM32 المتسامحة 5V بحيث لا تشعر بالسوء ، ونحن لا ننسى وضع الساق التي تدفع RESET M16 إلى وضع الصرف المفتوح. لقد نسيت ، وهذا هو + 2 ساعات إلى البنك أصبع من الوقت الضائع.
هذا الحد الأدنى يكفي لفهم الغدد بعضها البعض.منطق برنامج الهجوم كما يلي:
- نحن تأسيس اتصال مع وحدة تحكم. للقيام بذلك ، يجب أن تنتظر حتى تكتمل إعادة التعيين ، ثم ترسل 16 حرفًا بفاصل زمني يزيد عن 20 مللي ثانية. هذا من أجل تحديد الخوارزمية لتحديد سعر الصرف تلقائيًا ، لأن الواجهة غير متزامنة ، ولا يعرف عضو الكنيست شيئًا عن ترددها. يجب أن تكون سرعة انطلاق جهاز الإرسال 9600 باود ، وبهذه السرعة يحسب المحمل. بعد ذلك ، إذا رغبت في ذلك ، يمكنك طلب سعر صرف مختلف من أصل خمسة في النطاق 9600-115200 (على الرغم من أن المحمل رفض في حالتي العمل على 115200). لا أحتاج إلى تغيير السرعة ، لذلك طلبت إصدار أداة تحميل التشغيل للتحكم في المزامنة. نمر FBh ، يستجيب المحمل بخط مثل "VER.1.01".
- نرسل الأمر "فتح" ، الذي يحتوي على التكرار الحالي للمفتاح ، وقياس الوقت حتى يتم مسح العلامة مشغول.

يتكون الأمر من كود F5h ، وثلاث وحدات بايت من العنوان حيث تبدأ منطقة المعرف (في حالتي ، بالنسبة لـ M16C kernel ، يكون 0FFFDFh) ، وطول (07 h) ، والمعرف نفسه.
- نقيس الوقت بين إرسال آخر جزء من المعرف وإزالة العلامة المزدحمة.
- نقوم بزيادة بايت المفتاح التي يتم فرزها (KEY1 في المرحلة الأولية) ، ونعود إلى الخطوة 2 حتى يتم فرز جميع قيم البايت الحالية البالغ عددها 255.
- نقوم بإعادة تعيين الإحصائيات إلى الجهاز (جيدًا ، أو نقوم بإجراء التحليل "على متن الطائرة").
للتواصل مع MK المستهدف ، استخدمت USART في STM32 ، لقياس الوقت - مؤقت في وضع التقاط الإدخال. الشيء الوحيد ، بالنسبة للبساطة ، لم أقم بقياس الوقت بين آخر جزء من المفتاح وإزالة العلم ، ولكن بين بداية الإرسال والعلم. كان السبب هو أنه يمكن تغيير البت الأخير ، وفي الوضع غير المتزامن لم يكن هناك شيء نعلقه على إدخال الالتقاط. في نفس الوقت ، UART عبارة عن أجهزة ووقت الإرسال متطابق بشكل أساسي ويجب ألا يكون هناك أي أخطاء ملموسة.
نتيجة لذلك ، بالنسبة لجميع القيم ، كانت النتائج متطابقة. متطابقة تماما. كان تردد ساعة الموقت 24 ميجا هرتز ، على التوالي ، دقة الوقت 41.6 نانوثانية. حسنا ، حسنا ، لقد حاولت إبطاء الهدف MK. لم يتغير شيء. هنا طرح السؤال في رأسي: ماذا أفعل الخطأ ، كما فعلت Q3k؟ بعد المقارنة ، تم العثور على الفرق: يستخدم واجهة تبادل متزامن (SPI) ، وأنا غير متزامن (UART). وفي مكان ما هنا ، لفتت الانتباه إلى اللحظة التي فاتني في البداية. حتى على المخططات السلكية لأنماط أداة تحميل التشغيل المتزامن وغير المتزامن ، يتم تسمية الإخراج الجاهز بشكل مختلف:

في متزامن هو "مشغول" ، في غير متزامن هو "مراقب". ننظر إلى الجدول "وظائف الإخراج في وضع الإدخال / الإخراج التسلسلي القياسي":
"Semyon Semenych ..."التافه ، التي ضاعت في البداية ، جلبت المكان الخطأ. في الواقع ، إذا كان هذا في الوضع المتزامن هو بالضبط علامة مشغول بووتلوأدر ، ثم في الوضع غير المتزامن (الذي وضع I / O التسلسلي 2) هو مجرد "وميض" للإشارة إلى العملية. ربما ، بشكل عام ، إشارة الأجهزة استعداد جهاز الإرسال والاستقبال ، وبالتالي دقة مذهلة من رفعه.
بشكل عام ، نحن نلحِم المقاوم الموجود على دبوس SCLK من الأرض إلى VCC ، ونلحم السلك هناك ، ونربطه جميعًا بـ SPI ونبدأ من جديد ...
النجاح!

في الوضع المتزامن ، يكون كل شيء متشابهًا تقريبًا ، ولا يلزم إجراء أولي لإنشاء اتصال ، وتبسيط المزامنة ، ويمكن إجراء التقاط الوقت بشكل أكثر دقة. إذا اخترت هذا الوضع فورًا ، فسوف أوفر الوقت ... لم أقم مرة أخرى بتعقيد وقياس الوقت من آخر بت ، لكنني بدأت الموقت قبل بدء نقل آخر بايت من المفتاح ، أي نقوم بتشغيل الموقت وإرساله إلى مرسل KEY7 (في لقطة الشاشة أعلاه ، من محلل المنطق ، يمكنك رؤية المسافة بين المؤشرات. هذه هي الفترة الزمنية المحسوبة).
كان هذا أكثر من كافٍ لتحديد ناجح. هنا هو تعداد بايت واحد:

على المحور س ، لدينا عدد التهم المنفصلة ، على المحور ص ، على التوالي ، قيمة المفتاح المرسلة. تعد نسبة الإشارة إلى الضوضاء حتى أنه لا توجد عوامل تصفية مطلوبة ، تمامًا كما هو الحال في المدرسة في درس المعلوماتية: نجد الحد الأقصى في الصفيف وننتقل إلى اختيار البايت التالي. يتم تحديد البايتات الستة الأولى بسهولة وبسرعة ، وهو أمر أكثر صعوبة بقليل مع الخيار الأخير: هناك مجرد خرق وقح لا يعمل ، تحتاج إلى إعادة تعيين "الضحية" قبل كل محاولة. نتيجة لذلك ، يستغرق البحث حوالي 400 مللي ثانية لكل محاولة ، ويكون البحث في أسوأ الحالات ، في منطقة دقيقة ونصف. لكن هذا هو الأسوأ. بعد كل محاولة ، نطلب حالة ، وبمجرد أن نتخيل ، توقف. في البداية ، تخطيت المعرف بالأقلام بسرعة ، حيث أدخلت وحدة التحكم في التفوق وأرسمت الرسم البياني ، كل هذا كان مهمة لمرة واحدة ، لكن بالنسبة للمقال ، قررت إضافة تكرار تلقائي ، من أجل وحدة تحكم جميلة ...

بالطبع ، إذا قام المطور بمسح أداة تحميل التشغيل (حل محله جهازه الخاص) ، فلن يكون من السهل الخروج ، ولكن في إلكترونيات السيارات ، لا يتم إغلاق عضو الكنيست مطلقًا. على وجه الخصوص ، في وحدة التحكم من سخان آخر ، حيث تم تثبيت V850 من نفس Renesas ، تم تحديد كل شيء عن طريق لحام زوج من الأسلاك ونسخ البرامج الثابتة مع الأداة المساعدة القياسية. هذا هو محرك cryptocurrency بأكمله في عالم ECU. يبدو أن المصنّعين لا يحبون ظاهرة ضبط الرقاقة وأنواع التداخل الأخرى ... على الرغم من أن هذا يشبه سباق الدروع والقذائف - تكون الغدد أكثر انحدارًا وأغلى ثمناً ، لكن لا يوجد فائز ...
المراجع:
- https://www.dataman.com/media/datasheet/Renesas/M16C6N5Group.pdf
- https://hackaday.io/project/723-reverse-engineering-toshiba-r100-bios/log/51302-ec-firmware-dumped
- https://q3k.org/slides-recon-2018.pdf