عكس محول USB-SATA (تاريخ المتدرب واحد)

قبل التاريخ


التدريب الداخلي هو عملية اكتساب المعرفة والخبرة. يعتقد فريق أمان الراكون لدينا أن تحسين أمن المعلومات للأجهزة والبرامج من حولنا أمر مستحيل دون نقل هذه المعرفة والخبرة إلى أجيال المستقبل من المتخصصين. هذا هو السبب في أننا نقوم بتنظيم دورات تدريبية فردية للطلاب الموهوبين والخريجين لسنوات عديدة.


البحوث الأمنية هي مهارة لا يتم تدريسها في الجامعة. يمكنك معرفة ذلك من خلال أمثلة ملموسة وتوجيه من الموجهين ذوي الخبرة. كل عام ، يقوم المتدربون لدينا بحل المشكلات الفنية المعقدة ، وتحقيق أهدافهم والمضي قدمًا ، وتوسيع آفاقهم المهنية وجعل العالم أكثر أمانًا. كل واحد منهم لديه قصته الخاصة من أن يصبح متخصصا ، وتحت القص - بداية واحدة منهم.



مقدمة


في أكتوبر من العام الماضي ، جئت للتدريب الفني في شركة NTC Vulkan. تم توجيه اهتمامي إلى مجال الهندسة العكسية. كنت أعرف ما كان عليه ، لقد حاولت بالفعل إجراء بحث مستقل عن crackme تحت x86 ، لكنني فهمت أن أكثر الأشياء إثارة للاهتمام تكمن بالتحديد في تقاطع البرامج والأجهزة. لم تكن لدي خبرة في هذا المجال ، لكنني كنت أرغب في تجربة يدي.


لم يكن لدي أي توقعات محددة من هذا الحدث - الأصدقاء والمعارف يتحدثون غالبًا عن التدريب الفني في العديد من الشركات المعروفة. وعندما عُرض عليّ تجربة يدي في البحث عن محول USB-SATA ، كنت سعيدًا بالفرصة الجديدة لتعلم شيء ما. إن الخبرة المكتسبة والنتيجة التي حققتها جعلت من الممكن التحقق من صحة اختيار مكان التدريب ومهنة المستقبل.


وبدأت الدراسة بالحصول على محول USB-SATA منتظم في متناول اليد. هنا هو ما فعلته بعد ذلك.


تحليل الدوائر البصرية


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



USB إلى محول SATA. عرض أعلى



USB إلى محول SATA. عرض أسفل


بعد قضاء بعض الوقت في Google ، اكتشفت وجود محولين للجهد على اللوحة: أحدهما ب 3.3 فولت والآخر ب 1.2 فولت. كما أنه من السهل جدًا تحديد ذاكرة الفلاش المثبتة على اللوح. يعمل ROM على واجهة SPI ، وتبلغ سعة الذاكرة 512 كيلو بايت في الثانية.


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


USB


عند الاتصال بجهاز كمبيوتر ، يظهر المحول كجهاز تخزين USB. قررت أن معرفة أعمق بـ USB من المحتمل أن تكون مفيدة لبحثي ، وبالتالي فإن الساعات القليلة القادمة قضيت في دراسة الواجهة.
بشكل عام ، يمكن أن تكون أجهزة USB من فئات مختلفة ، اعتمادًا على وظائفها. على سبيل المثال ، محركات الأقراص المحمولة هي جهاز التخزين كبير السعة ، ولوحة المفاتيح وأجهزة الماوس هي جهاز واجهة الإنسان (HID) . ولأن المحول الخاص بي مرئي في إدارة الأجهزة كجهاز تخزين ، فهذا يعني أنه تم تعريفه على أنه مخزن كبير السعة ويجب أن يعمل مع أوامر SCSI.



قراءة الذاكرة من ROM


نظرًا لعدم معرفة أي شيء عن ASM1051 المثبت على اللوحة ، فقد اعتبرت الذاكرة من ROM الإجراء الأكثر وضوحًا. انتقلت إلى المختبر. قام بفصل رقاقة ذاكرة الفلاش بمجفف شعر لحام وربطها ببرمجية ChipProg-48 USB. لم تكن هناك مشاكل في القراءة ، وكان لدي ملف ثنائي على يدي. في ذلك الوقت ، لم أستطع تحديد ما كان موجودًا على محرك الأقراص المحمول ، وبدأت في تحليل البيانات.


تحليل ملف ثنائي


بادئ ذي بدء ، قمت بفتح ملف تفريغ ذاكرة من ROM باستخدام WinHex ، ولكن يمكنك استخدام أي محرر HEX. بدأ النظر في البايتات:



بداية تفريغ ذاكرة قراءة من ROM


لقطة الشاشة أعلاه هي لقطة شاشة من المحرر. الخط ASMT1051 ، الذي يبدأ بعنوان 0x44 ، واضح على الفور. يمكنك أيضًا رؤية السطر asmedia من العنوان 0x18. لتحليل البيانات الأولي ، استخدمت أداة تحليل التردد ، وهي متوفرة في WinHex.



رسم بياني لتحليل تردد ذاكرة ROM


يعرض الرسم البياني البايتات الأكثر شيوعًا في الملف. بالإضافة إلى الكومة 0x00 و 0xFF (الأعمدة القصوى على الرسم البياني) ، غالبًا ما توجد البايتات التالية في الذاكرة:


  • 0x02.
  • 0x74.
  • 0x90.
  • 0xA3.
  • 0xE0.
  • 0xF0.

سيكون من الممكن تأكيد افتراضي بوجود برامج ثابتة في ROM. إحدى الطرق السهلة للقيام بذلك هي محاولة مقارنة أكواد opcodes من أبنية مختلفة مناسبة لأجهزة التحكم الدقيقة (المشار إليها فيما يلي - MC) مع وحدات البايت التي غالبًا ما توجد في الذاكرة.


إذا تم تقديره تقريبًا ، في كثير من الأحيان في أي رمز في المجمّع يجب أن يفي بالأوامر مثل:


  • وسائل التحقق،
  • أحزاب اللقاء المشترك.
  • دعوة.
  • متقاعد.

بالطبع ، في هذه البنى المختلفة ، قد يكون لهذه الأوامر أشكال مختلفة ، لكن هناك حاسة واحدة مشتركة.


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


  • 0x02 - LJMP addr16 ؛
  • 0x74 - MOV A ، #immed ؛
  • 0x90 - MOV DPTR ، #immed ؛
  • 0xA3 - INC DPTR؛
  • 0xE0 - MOVX A ،DPTR ؛
  • 0xF0 - MOVXDPTR ، A.

يبدو حقا أن هناك البرامج الثابتة ل MK في ROM. يمكن للمرء أن يحمّل الثنائي على الفور إلى مفكك IDA Pro ، لكن في الغداء سأل أحد الزملاء:


"هل أنت متأكد من أن الكود الموجود في الذاكرة يبدأ بالضبط من الصفر؟"

وبالفعل ، يجب أن تأخذ في الاعتبار أن بعض "البيانات المهملة" أو البيانات من العنوان 0x00 يمكن أن تكون في الذاكرة.


بشكل عام ، واجهت مهمة تحديد عنوان البدء للرمز. لتحقيق هذا الهدف ، كان من الأفضل استخدام محاكي EM100 SPI. يحل المحاكي محل رقاقة الذاكرة على اللوحة ، حيث لا توجد حاجة إلى لحام ذاكرة الوصول العشوائي في كل مرة مع البرامج الثابتة ، بالإضافة إلى ذلك ، يمكن لجهاز EM100 تسجيل سجل وصول إلى الذاكرة. بالنظر إلى أن البرنامج الثابت من ROM قد تمت قراءته بالفعل ، يمكنك الآن تنزيله على محاكي SPI. بعد ذلك ، تحتاج إلى لحام المحاكي في لوحة المحول وتسجيل سجل عند توصيل المحول عبر USB بجهاز كمبيوتر.



محاكي SPI ملحوم بلوحة محول USB-SATA


أنا ملحوم الأسلاك من المحاكي إلى منصات من ذاكرة الفلاش وامض المحاكي مع عدد قليل من البرامج الثابتة. الآن يبقى أن نرى ما إذا كان MK يعالج الذاكرة ، وإذا كان الأمر كذلك ، فما هي العناوين.



ROM من الوصول إلى ذاكرة ROM (تم الحصول عليها باستخدام برنامج محاكي SPI)


يوضح الشكل أعلاه أنه عند توصيل الطاقة بالمحول ، ترسل وحدة التحكم ASM1051 المثبتة على اللوحة عدة أوامر 0x03 (قراءة البيانات).


أولاً ، يقرأ ASM1051 بايت 0x80 ، بدءًا من 0x0000. فيما يلي وحدتي بايت ، بدءًا من العنوان 0x0080 ، ثم وحدتي بايت أخريين من العنوان 0x8082. ثم يقرأ معظم الذاكرة من ROM ، بدءًا من العنوان 0x0082.


يمكننا أن نفترض أن عددًا كبيرًا من وحدات البايت التي تتم قراءتها من ROM ، بدءًا من العنوان 0x0082 ، هو على الأرجح الرمز. ماذا ولماذا مطلوب قبل هذا ليس واضحا بعد. من المعروف فقط أنه استجابةً للطلب الأول ، سيتلقى ASM1051 خطوطًا من ذاكرة الفلاش المميزة في الشكل أعلاه. كانت موجودة فقط في أول 0x80 بايت.


لقد حان الوقت للتحقق من أن الذاكرة الخارجية على اللوحة تحتوي على برامج ثابتة لنظام MK مع kernel 8051 ، ويقع الكود نفسه من العنوان 0x0082. افتح ملف تفريغ الذاكرة في IDA Pro ، وحدد نوع المعالج Intel 8051 وإزاحة الرمز 0x0082.



فتح ملف ثنائي في IDA Pro مع إزاحة 0x82


لم تكن هناك مشاكل في فتح الثنائي في المفكك.


الاستنتاجات:


  1. MK ASM1051 لديها هندسة معمارية 8051.
  2. يوجد في ROM رمز يبدأ بالعنوان 0x82. هناك شيء آخر إلى جانب الرمز.
  3. البايت 0x80 الأول جذب الانتباه.

تحليل الكود


الآن وبعد التأكد من تحميل الشفرة في المؤسسة الدولية للتنمية بشكل صحيح ، يمكنك البدء في تحليلها والتعليق عليها بالتوازي.


أثناء دراسة الكود ، تم العثور على وظائف بسيطة ، مثل طرح أرقام 32 بت ، تم العثور على معالجات مختلفة ، على غرار switch () في S. Melkali ، ووظائف بسيطة للغاية ، مثل تخزين القيمة من R7 في الذاكرة في بعض العناوين. أهم الاكتشافات التي سأصفها أدناه.


العثور على رقم 1


ومن المثير للاهتمام ، استجابةً لطلب الاستفسار ( أمر SCSI ) ، تلقيت ردًا يحتوي على سطرين رأيناهما في بداية ذاكرة ROM. بالطبع ، لقد قمت على الفور بتغيير هذه الأسطر في ذاكرة المحاكي ، في انتظار طلب التحقيق لمعرفة ما كتبته. هذا الحلم الساذج انهار بسرعة. الآن ، استجابةً للأمر ، رأيت سطرًا آخر ، لم يطلب ASM1051 معظم الذاكرة من ذاكرة القراءة فقط. MK قراءة فقط أول 0x80 بايت وجميع. في بنية 8051 ، يمكن استخدام البرنامج الثابت للقناع (الأجهزة) ، على ما يبدو ، بدأ ASM1051 في التمهيد منه.


لذلك أصبح من الواضح أن وحدات البايت 0x80 الأولى مهمة جدًا ، ولن يؤدي تغييرها إلى النجاح. قررت أن أدرس بمزيد من التفصيل الطلبات التي تقدمها MK على SPI قبل تنزيل الكود.



طلب بيانات SPI في ROM


طلبان من وحدتي بايت يبدو للاهتمام. أسفر البحث في IDA 0x00 و 0x80 و 0xEB عن عدد كبير من النتائج التي لم أقم بتحليلها ، لكن البايتات 0x5A صادفتها مرات أقل.



مقارنة مع البايت 0x5A. عد المجموع الاختباري -8


حرفيا النقر السادس قادني إلى قسم الكود الموضح في الشكل أعلاه. يمكن ملاحظة أن القيمة من السجل مع العنوان 0x80 7E تتم مقارنتها مع 0x5A. ثم يتم قراءة المجموع الاختباري -8 للقيم الموجودة من العنوان 0x80 04 إلى 0x80 7E . بعد ذلك ، تتم مقارنة القيمة عند 0x80 7F بالمبلغ الذي تم استلامه مسبقًا.



بداية الذاكرة في ROM


تشبه هذه الإزاحات بداية تفريغ ذاكرة من ROM. يوضح الشكل أعلاه أن العنوان 0x7E يحتوي على البايت 0x5A. وإذا عدت المجموع الاختباري -8 للبايت من الموضع 0x04 إلى 0x7E ، فسنحصل على 0xA7 ، وهذه القيمة تكمن فقط في العنوان 0x7F.


بطريقة مماثلة ، تمكنا من العثور على حساب مجموع التدقيق للبايت من العنوان 0x0082 إلى 0x807F (يبدو أن هذا هو الرمز بالكامل) ، والذي يتم التحقق منه مع البايت على العنوان 0x8083. وفي 0x8082 مرة أخرى تكمن القيمة 0x5A.


نعم ، هذا أكثر تعقيدًا من مجرد تغيير الخطوط في الذاكرة. لقد غيرتها أيضًا ، لكنني قمت أيضًا بحساب وكتب مبالغ الاختيار للملف الجديد في الأماكن الصحيحة. بعد ذلك ، استجابةً لأمر SCSI INQUIRY ، رأيت خطوطي.


الاستنتاجات:


  1. أثناء التمهيد ، يحاول ASM1051 تنزيل رمز من ROM.
  2. أولاً ، يقارن ASM1051 بايت المجموع الاختباري -8 من العنوان 0x04 إلى 0x7E مع القيمة في 0x7F.
  3. إذا نجحت المقارنة بين مجموع الشيكات للديباجة ، فيمكننا النظر في ذلك من أجل "الرمز" (العناوين من 0x0082 إلى 0x807F). يقارن ASM1051 هذا المبلغ بالقيمة في العنوان 0x8083 ويتحقق من وجود البايت 0x5A في العنوان 0x8082.
  4. إذا كانت جميع الاختبارات صحيحة ، فسيتم تحميل ASM1051 من ROM ، وإلا فإنه يستخدم البرنامج الثابت للقناع.

البحث عن رقم 2


أثناء مراجعة الوظائف والتعليق عليها ، وجدت أنه في كثير من الأحيان يتم استخدام وظيفة PRINTF في الكود (أطلق عليها ذلك). الشيء المثير للاهتمام هو أنه قبل أن يتم استدعاؤها ، يتم كتابة حرف مطبوع في سجل R7.



وظيفة PRINTF في IDA Pro


تم تقديم الوظيفة نفسها في الشكل أعلاه. دعونا نتعامل معها. بادئ ذي بدء ، تحتاج إلى نقل القيمة من السجل مع العنوان 0x7F6 إلى البطارية. إذا كان هناك صفر ، ثم الخروج من الوظيفة. يحدث الشيء الأكثر إثارة للاهتمام إذا لم يكن هناك صفر. ثم يتم نقل قيمة السجل R7 إلى السجل بالعنوان 0xC001 ، وكما نذكر ، قبل استدعاء هذه الوظيفة ، تتم كتابة حرف مطبوع على R7. بعد ذلك ، تحقق مما إذا كانت القيمة في R7 تساوي رمز الحرف "." أو "-" ، إن لم يكن ، فقم بإنهاء الوظيفة. ولكن إذا تحولت المقارنة إلى نجاح ، فإن الوظيفة تأخذ القيمة من السجل بالعنوان 0x16A وتنقلها إلى 0xC001 ، ولكنها صعبة. على سبيل المثال ، بدلاً من البايت 0x41 (الحرف "A" في ASCII) ، ستنتقل الوظيفة إلى 0xC001 البايت 0x34 (الحرف "4" في ASCII) ، ثم 0x31 (الحرف "1" في ASCII). الخروج من الوظيفة مرة أخرى.


اكتشفت أنه لا يمكن تمرير التحقق في بداية الوظيفة ، حيث تتم تهيئة السجل الذي يحمل العنوان 0x7F6 إلى الصفر ، ثم لا يتغير في التعليمات البرمجية. هذا هو ، يتم تعطيل هذه الوظيفة من قبل مبرمج ، على الرغم من أنها تبقى مترجمة. تشير حقيقة أن وحدات البايت تتم كتابتها فقط إلى سجل 0xC001 (وأحيانًا اثنان على التوالي) ، إلى أن هذا هو الأرجح تسجيل أجهزة.


كل هذا يشبه UART. لمعرفة ما إذا كان الأمر كذلك ، يجب عليك القيام بما يلي:


  1. حدد الأرجل على ASM1051 حيث يتم إخراج UART.
  2. تحديد معلمات UART (السرعة ، التكافؤ ، عدد بتات التوقف).
  3. سيكون من الجميل تمكين UART في التعليمات البرمجية (على ما يبدو ، تم إيقاف تشغيله).

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


"لتمكين" هذه الوظيفة ، يمكنك كتابة الأصفار بدلاً من الأسطر الثلاثة الأولى ، حيث يتم تحديد القيمة في السجل باستخدام العنوان 0x7F6. للقيام بذلك ، أنا مرة أخرى فتح البرامج الثابتة في WinHex.



يتم تخصيص ستة بايت لإعادة تعيين.


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


كما كتبت أعلاه ، من أجل العثور على الساقين Rx و Tx اللازمة ، يمكنك إلقاء نظرة على محلل المنطق الواحد تلو الآخر. ومع ذلك ، افترضت أن Rx و Tx على ASM1051 في نفس المكان مثل ASM1053 - الساقين 40 و 41 ، على التوالي. أضع مسبار محلل على الرقم 41 (المفترض Tx) وأرى شيئًا مشابهًا للإشارة المرغوبة:



مخطط التوقيت مع الساق 41 - TX


من أجل توصيل محول USB-UART ومراقبة الأحرف المطبوعة الواردة في الجهاز ، كان عليّ أن أقوم بتوصيل سلكين نحيفين مباشرة بلوحة المحول وإصلاحه بالغراء الساخن.



اثنين من الأسلاك ملحوم إلى RX و TX


لقد درست الرسم البياني من الشكل "مخطط التوقيت من الساق 41 - TX" قليلاً: وقت النبضة الواحدة ، على ما يبدو ، 1 μs ، وستة بتات - 6.3 μs. بعد إعادة حساب القيمة بالباود ، تلقيت حوالي 950،000 باود ، وأقرب سرعة UART قياسية هي 921600 باود. أعتقد أنه تم الحصول على هذا التناقض بسبب خطأ القياس من قبل المحلل المنطقي ، ولم أكن الجهاز الأكثر قيمة ، ولكن "الطفل" الصيني. بعد تعيين المعلمات في إطار برنامج Terminal 1.9b ، تمكنت من مراقبة البايتات الواردة من ASM1051 MK أثناء تشغيله.



إطار البرنامج 1.9b المحطة الطرفية أثناء تشغيل المحول


الاستنتاج:


يحتوي ASM1051 MK على وحدة أجهزة UART. السجل لإرسال البيانات لديه عنوان 0xC001. معدل البيانات هو 921600 باود. هناك واحد وقف قليلا. Leg 41 هي Tx و Leg 40 هي Rx (رغم أن هذا ليس دقيقًا).


البحث عن رقم 3


بالتمرير خلال الكود الموجود في أداة فك الشفرة ، وإضافة التعليقات ، يمكنك أن تجد الإنشاءات أكثر صعوبة من كتابة رقم في السجل. لذا صادفت معالجًا مثيرًا للاهتمام ، جزء منه في C ، بدا وكأنه switch () .



معالج الأوامر من السجل مع العنوان 0x800F


مع العلم أنه في مكان ما يجب معالجة أوامر SCSI ، بدأت في البحث عن وحدات البايت التي تتم مقارنة محتويات السجل بها مع العنوان 0x800F في الشكل أعلاه. اتضح أن الفروع الأربعة الأولى تحقق من أوامر القراءة (10) ، الكتابة (10) ، القراءة (16) ، الكتابة (16). ليس هناك شك في أن هذا هو معالج أوامر SCSI. بعد ذلك ، نظرت إلى وظيفة تسمى إذا كان الأمر الذي جاء ليس القراءة / الكتابة (u_Switch). بناءً على البايت الموجود في السجل مع العنوان 0x16A (القيمة مأخوذة من 0x800F) ، فإنه يقرأ العنوان الذي سنحصل عليه عند الخروج من هذه الوظيفة. هذا مشابه switch () .



تبديل أوامر SCSI


نظرًا لأنني حددت بالفعل البايتة التي أقارن بها أمر SCSI الذي جاء في المحول ، فقد قمت بسرعة بترتيب مراسلات العناوين حسب الأوامر. لذلك ، على سبيل المثال ، في الشكل أعلاه ، يمكن ملاحظة أنه إذا كانت البايت 0x1A في السجل مع العنوان 0x16A ، فبعد الخروج من دالة u_Switch ، ننتقل إلى معالجة 0x1B85. ومن المثير للاهتمام ، أنه لم يتم تعريف جميع وحدات البايت مقارنةً بـ u_Switch في معيار SCSI. بمعنى ، يمكن للمحول معالجة البايتات 0xE6 أو 0xDF ، لكن لا يتم حلها حسب المعيار.


كما ترون ، يمكن للمحول تنفيذ الأوامر المخصصة وهناك وظائف معالج لهم.



صفحة 13 من فئة التخزين الشامل للحافلة التسلسلية


انتبه إلى الإزاحة 0x0F نسبة إلى العنوان 0x8000. قبل المعالج ، يتم قراءة أمر SCSI من السجل بعنوان 0x800F. إذا كنت تقرأ بعناية الجدول في الشكل أعلاه ، يمكنك أن ترى أنه في التفاف كتلة الأوامر (CBW) ، يحتوي حقل CBWCB أيضًا على إزاحة 0x0F . اتضح أن عناوين ذاكرة الوصول العشوائي ASM1051 ، التي تبدأ بـ 0x8000 ، يمكن أن تكون مخزن مؤقت USB ، كما هو موضح في الجدول أدناه.


عنوان الذاكرةوصف
0h8000-0h8003dCBWSignature (USBC - في حالة تلقي حزمة)
0h8004-0h8007dCBWTag
0h8008-0h800BdCBWDataTransferLength
0h800CbmdCBWFlag
0h800DbCBWLUN
0h800EbCBWCBLength
0h800F-0h801FCBWCB - أمر SCSI ومعلماته

يوضح الشكل أدناه قسم الكود حيث تحدث المقارنة مع سلسلة USBC (مثل يجب أن يكون توقيع dCBWSignature) ويقع التوقيع المقترح من 0x8000. أعتقد أن هذا يكفي للتأكد من وجود المخزن المؤقت لـ USB في ذاكرة RAM بدءًا من 0x8000.



تحقق مجال dCBWSignature لمطابقة مع سلسلة USBC


الاستنتاجات:


  1. MK ASM1051 لا يمكنه التعامل مع أوامر SCSI فقط ، والتي تم وصفها في المعيار.
  2. عنوان بدء المخزن المؤقت USB هو 0x8000. يوجد أمر SCSI في السجل مع العنوان 0x800F ، مما يعني أنه ستكون هناك بيانات / وسيطات أخرى للأوامر.

البحث عن رقم 4


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


أمر SCSIوصف الفريق
0xE0يسمح لك بقراءة البايتات 0x80 الأولى من ROM. في المستقبل ، سأدعو هذا الجزء من الذاكرة الديباجة (نعم ، نفس وحدات البايت 0x80 التي توجد بها خطوط asmedia و ASM1051 )
0hE1يكتب 0x80 بايت الأولى إلى ROM
0hE3يكتب إلى ذاكرة ROM من 0x80 يعالج أي عدد من وحدات البايت. الوسيطة (كما اتضح فيما بعد) هي حجم الحزمة
0hE4يقرأ كتلة البايت من ذاكرة الوصول العشوائي ASM1051. كحجة ، يأخذ عنوان البداية وعدد البايتات التي نقرأها
0hE5يكتب بايت واحد لذاكرة الوصول العشوائي في
0hE7يقرأ الحزمة المستلمة الأخيرة في المخزن المؤقت ATA.
0hE8يعيد تشغيل الجهاز

أعترف أنني لم أحدد كل الأوامر من خلال قراءة وظائف في المؤسسة الدولية للتنمية. بعد أن ارتطمت بالحائط أثناء البحث ، تذكرت أنني رأيت البرامج والعديد من البرامج الثابتة لجهاز ASM1051 عندما كنت أبحث عن وثائق عليه. باستخدام البرنامج الموجود ، يمكنك تحديث البرامج الثابتة وإعادة تشغيل الجهاز. لذلك قررت أن الوقت قد حان لاستخدام Device Monitoring Studio ومعرفة ما يرسل الكمبيوتر إلى المهايئ أثناء التحديث.


وبالتالي ، كان من الممكن فهم كيفية حدوث عملية تحديث البرنامج الثابت: أولاً يتم إرسال الديباجة (مع الأمر 0xE1) ، ثم يتم كتابة التعليمات البرمجية باستخدام الأمر 0xE3 ، ثم يتم تلميع كل هذا بإعادة التشغيل (الأمر 0xE8). للحصول على تحديث سريع ومريح ، كتبت سيناريو Python يدرج الأسطر اللازمة في المقدمة ، ثم يقرأ مجاميع الشيكات ويقوم بتحديث الجهاز. الآن لم أعد أحتاج إلى محاكي ، لقد أتيحت لي الفرصة لتحميل البرامج الثابتة إلى ASM1051 عبر USB ، ويمكنك إعادة ROM الأصلي إلى اللوحة.


النتائج


لتحديث البرنامج الثابت ، يجب تنفيذ ثلاثة أوامر SCSI بالتتابع: 0xE1 و 0xE3 و 0xE8.


البحث عن رقم 5


بالإضافة إلى الأوامر غير الموثقة ، كان من المثير للاهتمام أن ننظر إلى معالجات الأوامر القياسية.



نقل البت الثالث من التسجيل 0xC884 إلى البت السابع للتسجيل 0x8002


يوجد اختبار واحد مثير للاهتمام في معالج الأمر SCSI MODE SENSE (10). يوضح الشكل أعلاه جزءًا من رمز الوظيفة. يمكن ملاحظة أن البت الثالث قيد القراءة من سجل 0xC884 . ثم يتم تعيين قيمة هذا البت في السجل في 0x8002.


ما يثير الاهتمام هنا هو أن سجل 0xC884 لم تتم تهيئته في أي مكان في الكود ، مما يعني أنه على الأرجح أجهزة.



جدول 362 من دليل مرجع أوامر SCSI


بالإضافة إلى ذلك ، إذا نظرت إلى وثائق أمر SCSI 0x5A (MODE SENSE) ، يصبح من الواضح أن محول USB-SATA يجب أن يستجيب لطلب MENE SENSE. تحتوي البايتة الثالثة من الاستجابة على الجزء السابع من WP (حماية الكتابة - الحماية من الكتابة). بالمناسبة ، لقد رأيت بالفعل بت السابعة في 0x8002 ، والإزاحة من بداية المخزن المؤقت USB (0x8000) هو بالضبط 3 هنا .


الاستنتاج:


يقرأ مهايئ USB-SATA الذي تم اختباره البت الثالث من سجل الأجهزة على 0xC884 ويرسله إلى مضيف USB باعتباره بت WP.


البحث عن رقم 6


يشبه سجل الأجهزة الموجود أثناء التحقيق في معالج أمر MODE SENSE SCSI إلى حد كبير GPIO. لتأكيد هذا ، قررت أن أتطرق إلى ASM1051 أرجل بمقاوم مباشر وقراءة قيمة التسجيل (أمر SCSI 0xE4) بعنوان 0xC884 . للقيام بذلك ، كتبت برنامج نصي Python باستخدام أوامر SCSI مخصصة تراقب القيمة في سجل 0xC884 وتعرضها على الكمبيوتر.


بت 0xC88476543210
الساق ASM1051--37-9104544

بعد إجراء مثل هذه التجربة ، قمت بتجميع جدول عرضت فيه البتات في سجل 0xC884 التي تغيرت عندما لمست المقاوم ASM1051 الأرجل. اتضح أن السجل قيد الدراسة مرتبط بشكل وثيق بـ GPIO ، لكن محاولة الكتابة إليه (باستخدام SCSI-command 0xE5) لم تنجح - لم تتغير القيمة.


ثم قررت أن هذا السجل إما للقراءة فقط أو الكتابة في مكان ما محظور على مستوى الأجهزة. على سبيل المثال ، إذا تم إعداد أرجل MK في البداية للقراءة فقط ، فمن المحتمل أن تكون الكتابة إلى السجل 0xC884 غير متوفرة.


بشكل عام ، من أجل العثور على السجلات المرتبطة بـ GPIO ، ذهبت إلى رمز التهيئة MK. كتبت جميع السجلات التي عناوينها قريبة من 0xC884 . حصلت على حوالي 10 منهم ، وأذكركم بأن المحطة العاشرة من MK متصلة بالمصباح الموجود على اللوحة ، وهي تقابل البتة الثانية في السجل 0xC884 . – 0880 , (, ). , , 0880 (/), 0884 , - .


0880 , 0884 . 0884 . ASM1051.


:


GPIO ASM1051. 0880 / I/O. 0884 I/O.


№ 5.


GPIO- , 45- 0884 . WP , USB. 45- , HDD, , .



HDD, 45-


. GND 45- , HDD. .



45- ASM1051 HDD.



USB-SATA-. ASM1051. , - , . , GPIO. – ASM1051 , HDD. , , (« »), , , USB-SATA- ASM1051.


, footprint ASM1051, datasheet ASM1053. , ASM1051 .



ASM1051


, 3D- , .



3D-


WP . GPIO ASM1051 , UART. , SATA, HDD. USB 3.0 Micro-B Type-C. HDD USB, HDD 3.5" +12 , 12 21 . .




استنتاج


, .


-, , . « «», . , .


, (, ) embedded-. , , . , , , , .


, datasheets, , . , !



Raccoon Security – «» , , , .
, , . .

Source: https://habr.com/ru/post/ar485966/


All Articles