extraer initramfs incrustado

9

Tengo un núcleo en el que está incrustado un initramfs. Quiero extraerlo

Obtuve la salida x86 boot sectorcuando lo hagofile bzImage

Tengo el archivo System.map para esta imagen del kernel.

¿Hay alguna forma de extraer la imagen initramfs incrustada de este kernel con o sin la ayuda del archivo System.map ?

La cadena interesante que se encuentra en el archivo de mapa del sistema es: (en caso de que ayude)

57312:c17fd8cc T __initramfs_start
57316:c19d7b90 T __initramfs_size
SHW
fuente

Respuestas:

14

Hay información sobre esto en la wiki de gentoo: https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging

Recomienda el uso de los binwalkcuales funciona extremadamente bien.

Daré un recorrido rápido con un ejemplo:

Primero extraiga el archivo bzImage con binwalk:

> binwalk --extract bzImage
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Microsoft executable, portable (PE)
18356         0x47B4          xz compressed data
9772088       0x951C38        xz compressed data

Terminé con tres archivos: 47B4, 47B4.xzy951C38.xz

> file 47B4
47B4: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=aa47c6853b19e9242401db60d6ce12fe84814020, stripped

Ahora corramos binwalk nuevamente en 47B4:

> binwalk --extract 47B4
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             ELF, 64-bit LSB executable, AMD x86-64, version 1 (SYSV)
9818304       0x95D0C0        Linux kernel version "4.4.6-gentoo (root@host) (gcc version 4.9.3 (Gentoo Hardened 4.9.3 p1.5, pie-0.6.4) ) #1 SMP Tue Apr 12 14:55:10 CEST 2016"
9977288       0x983DC8        gzip compressed data, maximum compression, from Unix, NULL date (1970-01-01 00:00:00)
<snip>

Esto regresó con una larga lista de rutas encontradas y varios archivos potencialmente interesantes. Echemos un vistazo.

> file _47B4.extracted/*
<snip>
_47B4.extracted/E9B348:     ASCII cpio archive (SVR4 with no CRC)

El archivo E9B348es un archivo cpio (ya descomprimido), ¡justo lo que estamos buscando! ¡Bingo!

Para descomprimir el archivo cpio sin comprimir (¡sus initramfs!) En su directorio actual simplemente ejecute

> cpio -i < E9B348

Eso fue casi demasiado fácil. binwalkes absolutamente la herramienta que estás buscando. Como referencia, estaba usando v2.1.1 aquí.

freaker
fuente
Bingo !!! Lo lograste !
SHW
2

Hasta donde yo sé, el archivo initramfs cpio solo está vinculado al núcleo.

Por lo tanto, esto debería funcionar:

  1. utilizar ddpara extraer el rango entre c17fd8ccyc19d7b90
  2. Desempaquete los datos resultantes usando un desempacador CPIO.
Multisync
fuente