Moin zusammen,
ich habe mir vor Kurzem eines meiner Fanvil X6 VoIP-Phones zerschossen,
als ich mir das aktuellste Firmware-Upgrade vom Hersteller gezogen habe,
das aber wohl mit falschen Hardware IDs bestückt war und eigentlich für
ein anderes Modell ist. Das Telefon hat die Firmware-Datei aber
gefressen und brav ins NAND geflasht (beinhaltet 2 Firmware-Stände, das
aktuell aktive und das Update überschreibt den inaktiven Firmware-Stand
und markiert anschließend diesen als aktiv ab dem nächsten Reboot), nach
dem Neustart war dann tote Hose am Telefon.
Nachdem ich auf das Mainboard die UART-Schnittstelle mit Pins bestückt
habe, konnte ich zumindest sehen, dass der Bootprozess (BOOT1, BOOT2)
noch tut und bis zum Entpacken des (leider falschen) Kernels passt.
Interessant ist hier die kurze Pause beim Output "Press any key to enter
download mode ...", hier springt er beim Senden eines Chars über die
UART mit folgender Ausgabe in den download-Modus:
1 | Entered UART loader mode
|
2 | Please disconnect terminal and run download.sh
|
Hier bleibt der dann auch stehen und wartet wohl auf irgendwelche
Kommandos, Kernel über die UART oder irgendwelche Firmware-Bestandteile.
Leider ist Fanvil nicht Willens (oder deren Support nicht fähig), die
download.sh herauszurücken. Bleibt also nur noch das Reverse Engineering
des Bootloader-Codes um zu verstehen, welchen Input er im download-Modus
erwartet.
Die Boot-Partitionen (BOOT1, BOOT2) konnte ich von meinem zweiten
Telefon ziehen, über die UART landet man hier netterweise in einer
Terminal-Session im Linux ohne Passwort und mit uid 0 :)
Leider hört bei mir das Wissen auf, mit Ghidra konnte ich das
ARMv7-Firmware-File analysieren und auch feststellen, dass das an
Adresse 0x4000 geladen wird (damit passen auch die Referenzen auf die
ganzen Strings), die Funktion mit den ensprechenden Strings zur
download.sh habe ich auch gefunden. Ebenfalls konnte ich mutmaßen, über
welche Funktion Chars/Strings über die UART ein- und ausgegeben werden.
Allerdings hört hier dann mein Wissen auf und auch stundenlanges
Mnemonic- und C-Code-Lesen brachte mir hier keine Erleuchtung, was der
nun im download-Modus an Eingabeparameter erwarten könnte.
Eventuell findet sich hier jemand, der ARM-Erfahrung hat und mir hier
aus der Patsche helfen kann. Den NAND-Flash will ich erst mal nicht vom
Mainboard holen, weil TSOP48 mit 0.5mm Pitch - und dann müsste ich auch
erst mal überlegen, was ich wo (und wie) im NAND reinschreiben will.
Den Dump der relevanten Partition habe ich angehängt.
Hier noch das Bootlog bis zum CPU-Crash wegen des falschen Kernels:
1 | BRCM boot1.UNKNOWN
|
2 | STICKYBITS=0x00000080
|
3 | STRAPS=0x2c000040
|
4 | NAND: ID: 0xef 0xf1
|
5 | (B)
|
6 |
|
7 | Found valid partition table at 0x00000000
|
8 | (C)
|
9 | (D)
|
10 | magic 0x0000babe
|
11 | size 0x00009b24
|
12 | Checksum PASSED: 0x003ec067
|
13 | imageType 0x00000080
|
14 | encryptType 0x00000000
|
15 | OTP14:0x00000000
|
16 | OTP key length 0x00000000
|
17 | (E)
|
18 | (I)
|
19 | (M)
|
20 | No DSA Key. No authentication required.
|
21 | (N)
|
22 | Image not encrypted
|
23 | (S)
|
24 | disPerh 0x00000028
|
25 | (b)
|
26 | Erasing ARAM
|
27 |
|
28 | Broadcom Linux NAND boot2.UNKNOWN
|
29 | NAND: (DMA) ID: 0xef 0xf1
|
30 | CFG_GLOBAL_FLASH_SIZE_MB: 128
|
31 | Strap Extra Addr Cycle: 0
|
32 | Strap Page Size Bits: 11 (2K)
|
33 | Strap Block Size Bits: 17 (128K)
|
34 |
|
35 | Press any key to enter download mode or bring up the menu[................]
|
36 | Skipping download mode
|
37 |
|
38 | FLASH (MB): 0x00000080
|
39 |
|
40 | Found valid partition table at 0x00000000
|
41 |
|
42 | Reading OTA Control block...
|
43 | Control Block Contents
|
44 | ActiveImage=0
|
45 | Hdr0 <============================================== Active Image (Next Reboot)
|
46 | kcrc = 0x970ec400
|
47 | ksize = 0x00261018
|
48 | fcrc = 0x2f92d83a
|
49 | fsize = 0x02580000
|
50 | date = Mon Sep 28 15:04:44 2020
|
51 | name = ota_BCM911188SV_x6_v6_5_.bin
|
52 | hdr crc = 0x7058a441 (from side header field)
|
53 | = 0x7058a441 (by crc'ing side header data)
|
54 | Hdr1
|
55 | kcrc = 0xca78f9f8
|
56 | ksize = 0x00223864
|
57 | fcrc = 0xa1d4c10c
|
58 | fsize = 0x02240000
|
59 | date = Mon Aug 17 16:44:14 2020
|
60 | name = ota_BCM911198SV_x6_v6_3_3.bin
|
61 | hdr crc = 0xf88fec33 (from side header field)
|
62 | = 0xf88fec33 (by crc'ing side header data)
|
63 |
|
64 | ota ctrl block hdr crc = 0xb5ad32d7 (from block hdr field)
|
65 | = 0xb5ad32d7 (by crc'ing block hdr data)
|
66 | Booting side 0
|
67 |
|
68 | Booting Linux...
|
69 | Kernel magic OK
|
70 | kernelPartition 0x07
|
71 | kstart 0x0d000000
|
72 | kend 0x0d261018
|
73 | kcopysize 0x00261018
|
74 | kernelStart 0x0d000000
|
75 | Copying kernel to SDRAM ...................
|
76 | completed
|
77 | Branch to kernel at 0x0d000000
|
78 | memstart 0x00200000
|
79 | memrsvd 0x00200000
|
80 | memsize 0x03e00000
|
81 | Constructed command line 'console=ttyAMA0,115200n8 vmalloc=256m mtdparts=bcm_umi-nand:0x000a0000(boot1),0x000a0000(boot2),0x000a0000(ctrl),0x00220000(nvdata),0x00080000(logo1),0x00080000(logo2),0x00f00000(userdata),0x00300000(k0),0x00300000(k1),0x03000000(root0),0x03000000(root1) ubi.mtd=9,2048 root=ubi0:rootfs rootfstype=ubifs rw bootmemheap'
|
82 | MM_IO_BASE_GPIO0 = 80004000
|
83 | 0x80015000 = 70007
|
84 | 0x80015004 = 20002
|
85 | 0x80015008 = 0
|
86 | 0x8001500c = 30003
|
87 | 0x80015010 = c000c
|
88 | 0x80015014 = 20002
|
89 | 0x80015018 = 80008
|
90 | 0x8001501c = 0
|
91 | 0x80015020 = 0
|
92 | 0x80015024 = 0
|
93 | Testing LOGO ~~~~~~
|
94 | calculatedCheck sum = 8776; read checksum=ffffffff;
|
95 | LOGO found
|
96 | logoHdr->areaSize = 1024
|
97 | logoHdr->startX = 0
|
98 | logoHdr->startY = 0
|
99 | logoHdr->width = 128
|
100 | logoHdr->height = 64
|
101 | logoHdr->selected = 0
|
102 | Machine ID is 0x00000a2c
|
103 | Uncompressing Linux... done, booting the kernel.
|