Xác định MCU phần sụn từ hình ảnh nhị phân
Vấn đề khó khăn - cố gắng thiết kế ngược một bộ điều khiển CANBUS mà tôi có thể tải xuống phần sụn (theo như tôi có thể nói, hình ảnh nhị phân, không phải ELF) nhưng tôi không biết MCU nó sử dụng là gì. binwalk
, r2
không cung cấp cho tôi bất cứ điều gì hữu ích. Các mã opcodes trùng khớp với mipsel nhưng chữ ký hàm là rác.
Tôi có thể làm gì để xác định MCU từ phần sụn?
Trả lời
Nó có vẻ là mã máy MIPS 32-bit nhỏ.
Đầu tiên, tệp được chuyển đổi từ .hex sang nhị phân thông qua
$ objcopy --input-target=ihex --output-target=binary FORD_P5_STEER_RevA_v1.2.0.hex FORD_P5_STEER_RevA_v1.2.0.bin
Sau khi xem xét một biểu binwalk
đồ entropy và một kết xuất hex, tôi đã cắt bỏ những 0x00021330
byte đầu tiên , bởi vì gần như mọi thứ sau đó chỉ là 0x00 byte.
000212f0 5f 50 35 20 53 74 65 65 72 00 00 00 20 24 00 00 |_P5 Steer... $..|
00021300 00 04 08 10 14 18 00 00 08 00 e0 03 00 60 62 41 |.............`bA|
00021310 08 00 e0 03 20 60 62 41 08 00 e0 03 00 00 00 00 |.... `bA........|
00021320 08 00 e0 03 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00021330 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| <--\
* |-- Huge gap
00071e40 01 00 00 00 02 00 00 00 00 00 00 00 46 4f 52 44 |............FORD| <--/
00071e50 20 50 35 20 53 74 65 65 72 69 6e 67 20 45 6d 75 | P5 Steering Emu|
00071e60 6c 61 74 6f 72 20 28 46 4f 52 44 5f 50 35 5f 53 |lator (FORD_P5_S|
00071e70 54 45 45 52 29 20 52 65 76 41 00 00 00 00 00 00 |TEER) RevA......|
00071e80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
02bf9e80 00 9d 1f 3c 70 79 ff 37 08 00 e0 03 00 00 00 00 |...<py.7........|
02bf9e90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
02bfce70 ff ff ff 3e d9 79 f9 ff 5b 0e 66 ff ff ff ff 7f |...>.y..[.f.....|
02bfce80
ISAdetect kết quả:
{
"prediction": {
"wordsize": 32,
"endianness": "little",
"architecture": "mips"
},
"prediction_probability": 0.81
}
Để xác nhận, tôi đã trích xuất mã máy từ phần và so sánh nó với một tài liệu tham khảo:
Các phân phối giá trị byte phù hợp chặt chẽ.
Nó thực sự là mã litte-endian MIPS hợp lệ:
seg000:1D0121F0 A8 FF BD 27 addiu $sp, -0x58 seg000:1D0121F4 04 00 A1 AF sw $at, 0x58+var_54($sp) seg000:1D0121F8 08 00 A2 AF sw $v0, 0x58+var_50($sp) seg000:1D0121FC 0C 00 A3 AF sw $v1, 0x58+var_4C($sp) seg000:1D012200 10 00 A4 AF sw $a0, 0x58+var_48($sp) seg000:1D012204 14 00 A5 AF sw $a1, 0x58+var_44($sp) seg000:1D012208 18 00 A6 AF sw $a2, 0x58+var_40($sp) seg000:1D01220C 1C 00 A7 AF sw $a3, 0x58+var_3C($sp) seg000:1D012210 20 00 A8 AF sw $t0, 0x58+var_38($sp) seg000:1D012214 24 00 A9 AF sw $t1, 0x58+var_34($sp) seg000:1D012218 28 00 AA AF sw $t2, 0x58+var_30($sp) seg000:1D01221C 2C 00 AB AF sw $t3, 0x58+var_2C($sp) seg000:1D012220 30 00 AC AF sw $t4, 0x58+var_28($sp) seg000:1D012224 34 00 AD AF sw $t5, 0x58+var_24($sp) seg000:1D012228 38 00 AE AF sw $t6, 0x58+var_20($sp) seg000:1D01222C 3C 00 AF AF sw $t7, 0x58+var_1C($sp) seg000:1D012230 40 00 B8 AF sw $t8, 0x58+var_18($sp) seg000:1D012234 44 00 B9 AF sw $t9, 0x58+var_14($sp) seg000:1D012238 48 00 BF AF sw $ra, 0x58+var_10($sp) seg000:1D01223C 12 40 00 00 mflo $t0
seg000:1D012240 4C 00 A8 AF sw $t0, 0x58+var_C($sp)
seg000:1D012244 10 40 00 00 mfhi $t0 seg000:1D012248 50 00 A8 AF sw $t0, 0x58+var_8($sp) seg000:1D01224C 01 9D 1A 3C+ li $k0, 0x9D012CA4
seg000:1D01224C A4 2C 5A 27
seg000:1D012254 00 00 00 00 nop
seg000:1D012258 00 68 04 40 mfc0 $a0, Cause # Cause of last exception seg000:1D01225C 00 60 05 40 mfc0 $a1, SR # Status register
seg000:1D012260 09 F8 40 03 jalr $k0
seg000:1D012264 00 00 00 00 nop
Tôi nghi ngờ thiết bị đang sử dụng thứ gì đó từ dòng PIC32 của Microchip .