extrair initramfs incorporados

9

Eu tenho um kernel no qual um initramfs está incorporado. Eu quero extrair.

Eu tenho a saída x86 boot sectorquando eu façofile bzImage

Eu tenho o arquivo System.map para esta imagem do kernel.

Existe alguma maneira de extrair a imagem initramfs incorporada deste kernel com ou sem a ajuda do arquivo System.map ?

A seqüência interessante encontrada no arquivo de mapa do sistema é: (Apenas no caso de ajudar)

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

Respostas:

14

Há alguma informação sobre isso no wiki do gentoo: https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging

Ele recomenda o uso de binwalkque funciona extremamente bem.

Vou dar uma rápida explicação com um exemplo:

primeiro extraia o arquivo bzImage com binwalk:

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

Acabei com três arquivos: 47B4, 47B4.xze951C38.xz

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

Agora vamos executar o binwalk novamente em 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>

Isso voltou com uma longa lista de caminhos encontrados e vários arquivos potencialmente interessantes. Vamos dar uma olhada.

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

file E9B348é um arquivo cpio (já descompactado), exatamente o que estamos procurando! Bingo!

Para descompactar o arquivo cpio descompactado (seu initramfs!) No diretório atual, basta executar

> cpio -i < E9B348

Isso foi quase fácil demais. binwalké absolutamente a ferramenta que você está procurando. Para referência, eu estava usando a v2.1.1 aqui.

freaker
fonte
Bingo !!! Você acertou em cheio!
SHW
2

Até onde eu sei, o arquivo initramfs cpio está apenas vinculado ao kernel.

Portanto, isso deve funcionar:

  1. use ddpara extrair o intervalo entre c17fd8ccec19d7b90
  2. descompacte os dados resultantes usando um descompactador CPIO.
Multisync
fonte