L'immagine del kernel linux presente nel firmware, e memorizzata sulla flash, è compressa tramite l'algoritmo LZMA.
E' possibile estrarre tale immagine applicando la seguente procedura:
Innanzitutto procuratevi l'immagine del kernel compresso (Se non sapete come fare consultate la pagina relativa al reverse_engineering_del_dump).
Tale immagine che per comodità a partire da questo punto chiamerò kernel.bin è così strutturata:
4 byte | Indirizzo iniziale di memoria in cui il CFE deve caricare il kernel |
---|---|
4 byte | ???? - Sembra essere un indirizzo di memoria anche questo |
4 byte | Dimensione del file - 12 (Dimensione dell'header) = Dimensione dei dati compressi lzma |
Per poter decomprimere il kernel si rende quindi necessario rimuovere l'intestazione che lo precede:
dd if=kernel.bin of=kernel.compresso bs=12 skip=1
A questo punto abbiamo ottenuto un file kernel.compresso che in via teorica dovrebbe poter essere decompresso con l'utility lzma (lzma.exe se vi trovate in ambiente Windows). Purtroppo il formato dell'header non viene accettato correttamente dalle utility di decompressione lzma e lzma.exe (LZMA SDK 4.27). Vediamone il perchè:
Il nostro file (kernel.compresso) è composto da:
5D 00 00 40 - DATI COMPRESSI
invece le utility ricavate a partire dai sorgenti LZMA SDK 4.27 pretendono che il file sia così formato:1)
5D 00 00 40 - 00 - Dimensione del file decompresso su 7 byte - DATI COMPRESSI
In definitiva, per decomprimere con lzma o lzma.exe bisognerà modificare l'header pre-esistente di kernel.compresso. Inoltre va sottolineato che non conoscendo la dimensione finale del file decompresso possiamo limitarci a indicare una dimensione sufficentemente grande (es: 0xFFFFFF). Verrà segnalato un errore in fase di decompressione, ma verrà comunque estratto tutto il file.
5D 00 00 40 - 00 FF FF FF - 00 00 00 00 - DATI COMPRESSI
A questo punto non ci resta che eseguire:
./lzma d kernel.compresso kernel.decompresso
se siete sotto linux
lzma.exe d kernel.compresso kernel.decompresso
se siete sotto windows.