
في هذه الجلسة التدريبية، سنستخرج البرنامج الثابت من شاحن المركبات الكهربائية، ونتعمق في البرنامج الثابت، ثم نحاكيه في النهاية لنتمكن من التفاعل مع الخدمات في الوقت الفعلي.
انضم إلينا في هذا العرض العملي لـ Unblob، أداة استخراج البرامج الثابتة المرنة. خلال جلسة ورشة العمل هذه، سنستخرج البرامج الثابتة من شاحن مركبات كهربائية، ونحفر في البرامج الثابتة، ثم نحاكيها في النهاية لنتمكن من التفاعل مع الخدمات في الوقت الفعلي. يعمل Unblob على كل من النسخ المادية والنسخ القابلة للتنزيل من البرامج الثابتة، لذا لدينا بيئة غنية بالأهداف. لا حاجة لخبرة سابقة، هذه الجلسة مناسبة لجميع مستويات المهارة، ونتطلع إلى رؤيتكم هناك.
هدفنا هو وحدة تحكم في محطة شحن المركبات الكهربائية من فينيكس كونتاكت. يمكنك العثور على مزيد من التفاصيل حولها هنا.
CHARX control modular، وحدة تحكم شحن AC، مع نظام Embedded Linux، IEC 61851-1، وضع التشغيل: Stand-Alone، Client، Server،
الواجهات:
- Ethernet (2x)
- الاتصال الخلوي (4G/2G)
- ناقل نظام CHARX control modular
- MICRO-USB type C
بروتوكولات الاتصال:
- OCPP 1.6J
- Modbus/TCP
- MQTT
الأجهزة الطرفية القابلة للتوصيل:
- عداد الطاقة
- RFID
- كشف تيار التسرب المتبقي DC
- تركيب على سكة DIN
هناك بعض الأدوات التي نحتاجها في ورشة العمل هذه. يمكنك تثبيتها عن طريق
تشغيل سكربت install-prerequisites كما يلي:```sh
./install-prerequisites
## الحصول على البرنامج الثابت
يمكن الحصول على البرنامج الثابت من موقع البائع. يوجد نص برمجي باسم
`download-firmware` في هذا المستودع يمكنك استخدامه لسحب البرنامج الثابت
بدون الحاجة إلى فتح متصفح.
تركيزنا اليوم على البرنامج الثابت المقدم من البائع لأنه يحتوي على كل ما
نحتاجه. لكن يمكن تطبيق سير عمل مشابه على تفريغ ذاكرة مستخرج من
جهاز حقيقي. الشيء المثير هنا هو أننا نستطيع الاستخراج والاستكشاف والمحاكاة
حتى دون الحاجة إلى جهاز حقيقي.
## الاستخراج باستخدام Unblob
لنبدأ بالتأكد من توفر جميع التبعيات:```
unblob --show-external-dependencies
The following executables found installed, which are needed by unblob:
7z ✓
debugfs ✓
jefferson ✓
lz4 ✓
lziprecover ✓
lzop ✓
sasquatch ✓
sasquatch-v4be ✓
simg2img ✓
ubireader_extract_files ✓
ubireader_extract_images ✓
unar ✓
zstd ✓
الآن يمكننا استخراج البرنامج الثابت باستخدام unblob:``` unblob CHARXSEC3XXXSoftwareBundleV190.raucb
يستغرق الاستخراج حوالي 3 دقائق على جهاز كمبيوتر لائق. يجب أن ترى شريط تقدم يتحرك للأعلى:

بمجرد اكتمال الاستخراج، يجب أن يكون دليل باسم
`CHARXSEC3XXXSoftwareBundleV190.raucb_extract` مرئيًا. يمكنك الدخول
إليه وسرد المحتوى.
### المقاطع، المقاطع غير المعروفة
يعمل Unblob عن طريق تحديد مقاطع البيانات داخل الملفات. إذا كان المقطع
دفقًا مضغوطًا، يتم فك ضغطه. إذا كان نظام ملفات أو أرشيفًا، يتم استخراجه.
إذا نجح الاستخراج أو فك الضغط، يتم حذف المقطع الذي تم عزله على القرص
لتوفير المساحة.
هنا، تم عزل مقطع SquashFS الإصدار 4 ذو النهاية الصغرى على القرص، واستخراجه،
وحذفه. تتم تسمية الملفات (وبالتالي أدلة الاستخراج) وفقًا لتسمية
`{start_offset}-{end_offset}.{type}`.
يمكننا أن نرى أن 11 كيلوبايت من مقطع "unknown" تظهر بعد نظام ملفات squashfs.```
./0-132173824.squashfs_v4_le_extract
./132173824-132184833.unknown
يمكنك تشغيل binwalk عليه لمعرفة ما يحتويه:```
binwalk 132173824-132184833.unknown
0 0x0 Object signature in DER format (PKCS header length: 4, sequence length: 10997 58 0x3A Certificate in DER format (x509 v3), header length: 4, sequence length: 4372 4434 0x1152 Certificate in DER format (x509 v3), header length: 4, sequence length: 4387
يمكنك التحقق من الشهادات باستخدام openssl:```
dd if=132173824-132184833.unknown bs=1 skip=58 | openssl x509 -in /dev/stdin -inform der -noout -text
dd if=132173824-132184833.unknown bs=1 skip=4434 | openssl x509 -in /dev/stdin -inform der -noout -text
هذا يعني أن البرامج الثابتة موقّعة على الأرجح باستخدام المفتاح الخاص للمورّد حتى تتمكن الأجهزة من التأكد من صحتها.
تلك إحدى مزايا unblob، إذ تحوّل المجهولات المجهولة إلى مجهولات معروفة يمكن التحقيق فيها.
لنلقِ نظرة على محتوى نظام الملفات squashfs لدينا:``` ls -al 0-132173824.squashfs_v4_le_extract total 460532 drwxrwxr-x 4 kali kali 4096 dec 5 09:51 . drwxrwxr-x 3 kali kali 4096 dec 5 09:51 .. -rw-rw-r-- 1 kali kali 20971520 sep 8 09:59 bootimg.vfat drwxrwxr-x 3 kali kali 4096 dec 5 09:51 bootimg.vfat_extract -rwxrwxr-x 1 kali kali 2654 sep 19 2022 hook -rw-rw-r-- 1 kali kali 442 sep 8 09:59 manifest.raucm -rw-rw-r-- 1 kali kali 450584576 sep 8 09:59 root.ext4 drwxrwxr-x 22 kali kali 4096 sep 8 09:57 root.ext4_extract
يمكننا رؤية قائمة نصية عادية، وسكربت شل، وMBR واحد، ونظام ملفات EXT4:```
find -maxdepth 1 -type f -exec file {} \;
./manifest.raucm: ASCII text
./hook: a /usr/bin/env sh script, ASCII text executable
./bootimg.vfat: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, reserved sectors 4, root entries 512, sectors 40960 (volumes <=32 MB), Media descriptor 0xf8, sectors/FAT 40, sectors/track 63, heads 255, hidden sectors 163158016, reserved 0x1, serial number 0xd09aad9c, label: "KERNEL ", FAT (16 bit)
./root.ext4: Linux rev 1.0 ext4 filesystem data, UUID=8ed19606-02c4-42e7-9cfb-1a2839f93ec4 (extents) (large files) (huge files)
تمت معالجة كل من bootimg.vfat وroot.ext4 واستخراجهما بواسطة unblob.
يحتوي قسم VFAT على كل ما يتعلق بالإقلاع ونظام التشغيل (نواة لينكس، DTB، TEE):```
oftree: Device Tree Blob version 17, size=27469, boot CPU=0, string block size=1657, DT structure block size=25756
tee.bin: data
zImage: Linux kernel ARM boot executable zImage (little-endian)
zImage-imx6ul-ksp0632.dtb: Device Tree Blob version 17, size=27469, boot CPU=0, string block size=1657, DT structure block size=25756
سترى أن unblob جشع بعض الشيء وسيستخرج ملف ELF وأرشيف CPIO
من نواة لينكس (`zImage`)، وهذان يتوافقان مع
النواة الدنيا وقرص الرام.
يحتوي نظام ملفات EXT4 على نظام الملفات الجذر الذي تقوم نواة لينكس
بتركيبه عند الإقلاع:```
ls -alh root.ext4_extract
total 88K
drwxrwxr-x 22 kali kali 4,0K sep 8 09:57 .
drwxrwxr-x 4 kali kali 4,0K dec 5 09:51 ..
drwxrwxr-x 2 kali kali 4,0K dec 5 09:51 bin
drwxrwxr-x 3 kali kali 4,0K dec 5 09:51 boot
drwxrwxr-x 16 kali kali 4,0K sep 8 09:56 data
drwxrwxr-x 2 kali kali 4,0K jul 18 00:09 dev
drwxrwxr-x 53 kali kali 4,0K dec 5 09:51 etc
drwxrwxr-x 18 kali kali 4,0K sep 8 09:56 home
drwxrwxr-x 2 kali kali 4,0K jul 18 03:13 identity
drwxrwxr-x 9 kali kali 4,0K dec 5 09:51 lib
drwxrwxr-x 2 kali kali 4,0K jul 18 03:14 log
drwxrwxr-x 2 kali kali 4,0K sep 8 09:57 lost+found
drwxrwxr-x 2 kali kali 4,0K jul 18 00:09 media
drwxrwxr-x 2 kali kali 4,0K jul 18 00:09 mnt
drwxrwxr-x 2 kali kali 4,0K jul 18 00:09 proc
drwxrwxr-x 2 kali kali 4,0K sep 8 09:57 run
drwxrwxr-x 2 kali kali 4,0K dec 5 09:51 sbin
drwxrwxr-x 2 kali kali 4,0K jul 18 03:14 sdcard
drwxrwxr-x 2 kali kali 4,0K jul 18 00:09 sys
drwxrwxrwx 2 kali kali 4,0K jul 18 00:09 tmp
drwxrwxr-x 11 kali kali 4,0K sep 8 09:56 usr
drwxrwxr-x 11 kali kali 4,0K dec 5 09:51 var