Reverse engineering NOR Flash (VI)

Analizar el contenido de la memoria NOR y NAND Flash nos permitirá conocer mejor el sistema y sus posibles modificaciones. Para ello vamos a realizar ingeniería inversa en ambas memorias.

El primer análisis que podemos realizar, es utilizar el comando file con cada una de las partes del contenido de la memoria NOR flash, de esta manera conoceremos el tipo y formato de cada archivo en cuestión.

sergio@N130:~/proyectos/STB7007/flash_dev/NOR_Flash$ file cfe.bin
cfe.bin:        data
sergio@N130:~/proyectos/STB7007/flash_dev/NOR_Flash$ 

Repetimos el mismo comando con el resto de archivos.

cfe_config.bin: data

hdcp:           data

MAC_address:    data

reserve:        DOS executable (device driver)

secure_storage: DOS executable (device driver)

Para obtener más información acerca del contenido, utilizaremos los comandos hexdump y strings.

Con hexdump realiza un volcado completo del archivo a formato hexadecimal. Mientras que strings, busca e imprime secuencias de caracteres imprimibles del contenido del archivo.

Volcar el contenido del archivo a formato hexadecimal y guardar la información en un fichero la salida.

sergio@N130:~/proyectos/STB7007/flash_dev/NOR_Flash$ hexdump -C cfe.bin > cfe.dump
sergio@N130:~/proyectos/STB7007/flash_dev/NOR_Flash$ 

Buscar y extraer cadenas de texto y guardar en un fichero la salida.

sergio@N130:~/proyectos/STB7007/flash_dev/NOR_Flash$ strings -n 10 cfe.bin > cfe_strings.out
sergio@N130:~/proyectos/STB7007/flash_dev/NOR_Flash$ 

cfe

Mediante los strings de cfe, se puede apreciar gran parte del texto de la secuencia de arranque, la petición de un reset después de cargar el splash y el punto más importante. El cifrado del bootloader mediante un certificado público.

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA2PBIzgmzEKfPNYiXy1b4OLI8Ji2wpqOY3BMsgWvCKjIc9LViwi5q
Al+z0vLd3LPR04Blw+lwERak6Hvt5cKNU9iVN2/VY2xZZjrK5uwbgyezFJU7cV04
W9rewsLsl/yv71W+fjhNwI0/KHxDh3ajr7nEjjmTC12wlp8+EOZGvu19jNUj2crd
ycRvudeMQ5r9c64b3QYZC2JOl12FdQjmLkMiXpTUhXrCeBc6IzAeKX096jLSO3qX
MOdbEu+7sdWPLW4QFnjDX4/+M0Joz3NWfMU+Lz9pYiUONA/nZ/PwTh36pgZgKAqK
u2cdZi4R9zoPwLAaHJM+ommn7P/czkgI6QIDAQAB
-----END RSA PUBLIC KEY-----

Descarga el certificado certificado.cer

Repetimos el proceso con cada uno de los archivos, en algunos casos la salida de strings es 0, quiere decir que no ha encontrado caracteres imprimibles.

cfe_config.bin

Cuando arranca el bootloader, identifica 5 particiones mtd11 a mtd15 que son las utilizadas por el sistema.

BOOT_IMAGE=0
PACKAGE0_NAME=Flash - Image - Usr - NAND - Telefonica - Broadcom - ComtrendCT7007
PACKAGE0_FILENAME=/[nandwrite]/dev/mtd12
PACKAGE1_NAME=Flash - Image - Usr - Local - NAND - Telefonica - Broadcom - ComtrendCT7007
PACKAGE1_FILENAME=/[nandwrite]/dev/mtd13
PACKAGE2_NAME=Flash - Image - Usr - MediaBrowser - NAND - Telefonica - Broadcom - ComtrendCT7007
PACKAGE2_FILENAME=/[nandwrite]/dev/mtd14
PACKAGE3_NAME=Flash - Image - Usr - MediaServer - NAND - Telefonica - Broadcom - ComtrendCT7007
PACKAGE3_FILENAME=/[nandwrite]/dev/mtd15
PACKAGE4_NAME=Flash - Image - RomFS - NAND - Telefonica - Broadcom - ComtrendCT7007
PACKAGE4_FILENAME=/[nandwrite]/dev/mtd11
PACKAGE4_EXTENT=3798205
PACKAGE_COUNT=5
FIRST_BOOT=0
PACKAGE0_VERSION=1000026
PACKAGE0_ID=Flash-Image-Usr-NAND-Telefonica-Broadcom-ComtrendCT7007-1.0.0r26
PACKAGE0_SIZE=3395584
PACKAGE0_EXTENT=3396792
PACKAGE1_VERSION=1000020
PACKAGE1_ID=Flash-Image-Usr-Local-NAND-Telefonica-Broadcom-ComtrendCT7007-1.0.0r20
PACKAGE1_SIZE=12828672
PACKAGE1_EXTENT=12829894
PACKAGE2_VERSION=4111812
PACKAGE2_ID=Flash-Image-Usr-MediaBrowser-NAND-Telefonica-Broadcom-ComtrendCT7007-4.11.18r12
PACKAGE2_SIZE=11804672
PACKAGE2_EXTENT=11805910
PACKAGE3_VERSION=1000030
PACKAGE3_ID=Flash-Image-Usr-MediaServer-NAND-Telefonica-Broadcom-ComtrendCT7007-1.0.0r30
PACKAGE3_SIZE=1015808
PACKAGE3_EXTENT=1017042
PACKAGE4_VERSION=2061836
PACKAGE4_ID=Flash-Image-RomFS-NAND-Telefonica-Broadcom-ComtrendCT7007-2.6.18r36
PACKAGE4_SIZE=3796297

Con el sistema iniciado y en la consola, si utilizamos el comando "cfe_config -p" aparece la misma información.

[root@stb:/] $ cfe_config -p
Variable Name        Value
-------------------- --------------------------------------------------
          BOOT_IMAGE 0
       PACKAGE0_NAME Flash - Image - Usr - NAND - Telefonica - Broadcom - ComtrendCT7007
   PACKAGE0_FILENAME /[nandwrite]/dev/mtd12
       PACKAGE1_NAME Flash - Image - Usr - Local - NAND - Telefonica - Broadcom - ComtrendCT7007
   PACKAGE1_FILENAME /[nandwrite]/dev/mtd13
       PACKAGE2_NAME Flash - Image - Usr - MediaBrowser - NAND - Telefonica - Broadcom - ComtrendCT7007
   PACKAGE2_FILENAME /[nandwrite]/dev/mtd14
       PACKAGE3_NAME Flash - Image - Usr - MediaServer - NAND - Telefonica - Broadcom - ComtrendCT7007
   PACKAGE3_FILENAME /[nandwrite]/dev/mtd15
       PACKAGE4_NAME Flash - Image - RomFS - NAND - Telefonica - Broadcom - ComtrendCT7007
   PACKAGE4_FILENAME /[nandwrite]/dev/mtd11
     PACKAGE4_EXTENT 3798205
       PACKAGE_COUNT 5
          FIRST_BOOT 0
    PACKAGE0_VERSION 1000026
         PACKAGE0_ID Flash-Image-Usr-NAND-Telefonica-Broadcom-ComtrendCT7007-1.0.0r26
       PACKAGE0_SIZE 3395584
     PACKAGE0_EXTENT 3396792
    PACKAGE1_VERSION 1000020
         PACKAGE1_ID Flash-Image-Usr-Local-NAND-Telefonica-Broadcom-ComtrendCT7007-1.0.0r20
       PACKAGE1_SIZE 12828672
     PACKAGE1_EXTENT 12829894
    PACKAGE2_VERSION 4111812
         PACKAGE2_ID Flash-Image-Usr-MediaBrowser-NAND-Telefonica-Broadcom-ComtrendCT7007-4.11.18r12
       PACKAGE2_SIZE 11804672
     PACKAGE2_EXTENT 11805910
    PACKAGE3_VERSION 1000030
         PACKAGE3_ID Flash-Image-Usr-MediaServer-NAND-Telefonica-Broadcom-ComtrendCT7007-1.0.0r30
       PACKAGE3_SIZE 1015808
     PACKAGE3_EXTENT 1017042
    PACKAGE4_VERSION 2061836
         PACKAGE4_ID Flash-Image-RomFS-NAND-Telefonica-Broadcom-ComtrendCT7007-2.6.18r36
       PACKAGE4_SIZE 3796297
[root@stb:/] $ 

hdcp

No aparecen strings que permitan identificar algún contenido.

MAC_address

Tiene grabada la dirección MAC Address 4 veces.

00000000  00 00 00 00 00 00 00 84  00 00 00 00 64 68 0c 99  |............dh..|
00000010  88 77 00 00 64 68 0c 99  88 77 00 00 64 68 0c 99  |.|..dh...|..dh..|
*
00000040  88 77 00 00 64 68 0c 99  88 77 00 00 ff ff ff ff  |.|..dh...|......|
00000050  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000080  ff ff ff ff ff ff ff ff  ff ff ff ff c4 c4 ff ff  |................|
00000090  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
0001f800

reserve

Todo el contenido esta a ff.

secure_storage

Input configuration: 544C464E 335A7A6F 71324334 61313945 32343739

Data Section Value:    000000000000000000000000544c464e335a7a6f713243346131394532343739

CRC for DS =    5d7bc48e

Se trata de una comprobación de CRC para una entrada determinada, esta entrada podría ser los diferentes CRC de cada archivo, pero no es así.

CRC de cada archivo.

72fa09c4    cfe.bin
a702aa51    cfe_config.bin
cf63d352    hdcp
bb12aaf8    MAC_address
d64cd5de    reserve
0d2d27ed    secure_storage

Después de este análisis, parece complicado realizar modificaciones en el bootloader, está deshabilitado el prompt del CFE y cifrado. Tal vez se pueda hacer alguna cosa con la configuración cfe_config y el comando cfe_config

4 comentarios:

Lucas dijo...

Muy buena la información que publicaste Sergio, también es posible analizar los archivos con un editor hexadecimal (eso fue lo que yo hice), pero los comandos que mencionaste me gustan más ya que facilitan el trabajo.

En mi equipo no pude sacar tanta información ya que no dispongo de tantos archivos relacionados con el bootloader, estas son todas mis particiones:

mtd0: kernel
mtd1: rootfs
mtd2: kernel_2
mtd3: rootfs_2
mtd4: config
mtd5: splash
mtd6: splash2
mtd7: cfe
mtd8: macadr
mtd9: nvram
mtd10: dual_boot

mi archivo config no tiene nada que ver con el CFE, es un archivo de alrededor de 46 MB que se monta como parte de la RootFS, el archivo nvram solamente contiene la linea de arranque de la cual hablé en un comentario, el archivo dual_boot solamente contiene FF y 00, el único archivo relacionado es el mismo CFE.

En mi caso el equipo no reconoce el comando cfe_config, pero analizando el CFE pude encontrar esta parte que parece ser un hash MD5:

MD5 signature:
Y*5<|M>[qc
e1qr6?3KnY@~
+p~]F$@64ls

No estoy seguro de que será ya que ninguno de mis archivos contiene un hash parecido, dejo mi CFE por si alguien está interesado en analizarlo:

https://drive.google.com/open?id=0Bw5a_iEQmO-0SG03RHJBZFFXaFE

Lucas dijo...

Por cierto Sergio, tendrías que probar a escribir mi CFE en tu equipo, es caso de que funcione al menos podrás acceder al prompt del CFE (no se puede hacer mucho pero al menos lo tendrás funcionando)

Gustavo dijo...

Interesantes los comandos que muestras para analizar archivos, conoces otros? no tengo el STB pero me podrían ser de utilidad con los firmware de un par de routers que tengo.

Saludos.

Sergio dijo...

Hola, disculpad por tarde en responder pero no se por que blogger no me ha notificado los comentarios.

Lucas ya probé a cargar otros CFE pero sin éxito, veo que cada equipo es un mundo por mucho que sea el mismo STB.
Gustavo, existe una herramienta llamada binwalk muy buena por cierto.

Saludos,

Publicar un comentario