Forum: Mikrocontroller und Digitale Elektronik Fanvil X6 VoIP-Telefon zerflasht, suche Recovery-Möglichkeit


von Fan[vil]boy (Gast)


Angehängte Dateien:

Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.