Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Filesystem aus Kernelimage extrahieren?

58 views
Skip to first unread message

Georg Schwarz

unread,
Mar 14, 2021, 4:11:19 PM3/14/21
to
Ich habe hier ein Update-Binary für einen Router, der unter Linux läuft
und Uboot verwendet.
Binwalk zeigt an, dass im Update-Binary ein uImage (Linux/MIPS)
enthalten ist mit 64 Byte Header, und dass dieses Image mit lzma
komprimiert ist. 64 Byte später findet binwalk konsequenterweise ein
lzma-Image. Dabei dürfte es sich um das komprimierte Kernel-Image
handeln.
binwalk extrahiert dieses und entpackt es automatisch.
Die resultierende Datei sollte das unkomprimierte Kernel-Image sein.
Diese sollte ein Filesystem enthalten (initfs?).
Wenn man mittels strings das komprimierte Kernel-Image anschaut, findet
man dort in der Tat Text, den man in Dateien des Routers erwartet (z.B.
für dessen HTML-Frontend).
Wenn man binwalk erneut auf diese Datei anwendet, erkennt es darin
HTML-Header und PNG-Bilder.
Ich kann also davon ausgehen, dass in der entpackten Datei das
Filesystem des Routers unkomprimiert enthalten ist (zweimal komprimieren
wäre auch unsinnig).
Die Frage ist nun, wie man es extrahiert. Wie kann man aus einem
(entkomprimierten) Linux-Kernel-Image ein eingebettetes Filesystem
extrahieren? In welchem Format wird es wohl sein? DEr

Ich kann alternativ das uImage auch händisch aus der Originaldatei
extrahieren. Wenn ich darauf dumpimage -l anwende, kommt die Ausgabe
GP Header: Size xxxxx LoadAddr xxxxxxx
hilft aber auch nicht, oder?

Sven Hartge

unread,
Mar 14, 2021, 4:13:06 PM3/14/21
to
Georg Schwarz <georg....@freenet.de> wrote:

> Die Frage ist nun, wie man es extrahiert. Wie kann man aus einem
> (entkomprimierten) Linux-Kernel-Image ein eingebettetes Filesystem
> extrahieren? In welchem Format wird es wohl sein?

Die üblichen initramfs sind ein cpio-Archiv.



--
Sigmentation fault. Core dumped.

Marc Haber

unread,
Mar 14, 2021, 4:58:38 PM3/14/21
to
Sven Hartge <sh-...@svenhartge.de> wrote:
>Georg Schwarz <georg....@freenet.de> wrote:
>
>> Die Frage ist nun, wie man es extrahiert. Wie kann man aus einem
>> (entkomprimierten) Linux-Kernel-Image ein eingebettetes Filesystem
>> extrahieren? In welchem Format wird es wohl sein?
>
>Die üblichen initramfs sind ein cpio-Archiv.

Vorne dran ist im Zweifel noch der CPU-Microcode.

Grüße
Marc
--
-------------------------------------- !! No courtesy copies, please !! -----
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " |
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834

Georg Schwarz

unread,
Mar 14, 2021, 4:59:52 PM3/14/21
to
Sven Hartge <sh-...@svenhartge.de> wrote:

> Die üblichen initramfs sind ein cpio-Archiv.

ja, das habe ich auch gelesen, und dass dieses mit einem Hex-String von
0x07 0x07 0x01 begänne. Dieses Bytemuster finde ich allerdings nicht
darin.

Georg Schwarz

unread,
Mar 14, 2021, 5:00:54 PM3/14/21
to
Marc Haber <mh+usene...@zugschl.us> wrote:

> >Die üblichen initramfs sind ein cpio-Archiv.
>
> Vorne dran ist im Zweifel noch der CPU-Microcode.

mit Sicherheit; es sollte ja ein komplettes Kernel-Image sein.

Marc Haber

unread,
Mar 15, 2021, 9:36:17 AM3/15/21
to
Im initramfs ist kein Kernel-Image.

Georg Schwarz

unread,
Mar 15, 2021, 1:47:12 PM3/15/21
to
Marc Haber <mh+usene...@zugschl.us> wrote:

> georg....@freenet.de (Georg Schwarz) wrote:
> >Marc Haber <mh+usene...@zugschl.us> wrote:
> >
> >> >Die üblichen initramfs sind ein cpio-Archiv.
> >>
> >> Vorne dran ist im Zweifel noch der CPU-Microcode.
> >
> >mit Sicherheit; es sollte ja ein komplettes Kernel-Image sein.
>
> Im initramfs ist kein Kernel-Image.

aber im Kernelimage ein initramfs? Und wie erkennt man, wo es anfängt,
und wie extrahiert man es?

Marc Haber

unread,
Mar 15, 2021, 4:43:07 PM3/15/21
to
georg....@freenet.de (Georg Schwarz) wrote:
>Marc Haber <mh+usene...@zugschl.us> wrote:
>
>> georg....@freenet.de (Georg Schwarz) wrote:
>> >Marc Haber <mh+usene...@zugschl.us> wrote:
>> >
>> >> >Die üblichen initramfs sind ein cpio-Archiv.
>> >>
>> >> Vorne dran ist im Zweifel noch der CPU-Microcode.
>> >
>> >mit Sicherheit; es sollte ja ein komplettes Kernel-Image sein.
>>
>> Im initramfs ist kein Kernel-Image.
>
>aber im Kernelimage ein initramfs?

Nein, das sind zwei unterschiedliche Dateien;

>Und wie erkennt man, wo es anfängt,
>und wie extrahiert man es?

|2 [2/5551]mh@drop:~ $ ls -al /boot/*5.11.6*
|-rw-r--r-- 1 root root 197K Mär 11 18:26 /boot/config-5.11.6-zgws1
|-rw-r--r-- 1 root root 34M Mär 12 08:09 /boot/initrd.img-5.11.6-zgws1
|-rw-r--r-- 1 root root 3,8M Mär 11 18:26 /boot/System.map-5.11.6-zgws1
|-rw-r--r-- 1 root root 4,9M Mär 11 18:26 /boot/vmlinuz-5.11.6-zgws1
|[3/5552]mh@drop:~ $

Das ist ein wenig eine Falle, denn:

|[14/5570]mh@drop:/tmp/tmp $ file /boot/initrd.img-5.11.6-zgws1
|/boot/initrd.img-5.11.6-zgws1: ASCII cpio archive (SVR4 with no CRC)
|[15/5571]mh@drop:/tmp/tmp $ < /boot/initrd.img-5.11.6-zgws1 cpio -i
|6768 blocks
|[16/5572]mh@drop:/tmp/tmp $ find
|.
|./kernel
|./kernel/x86
|./kernel/x86/microcode
|./kernel/x86/microcode/GenuineIntel.bin
|./kernel/x86/microcode/.enuineIntel.align.0123456789abc
|[17/5573]mh@drop:/tmp/tmp$

Das sieht aus wie man ein initramfs erwartet, und dann ist nur der
Microcode drin. Wenn man weiß, dass da ein cpio-archive und danach ein
gzipped cpio ist, hilft diese Shell-Magie:

|( cpio -i; zcat | cpio -i ) < /boot/initrd.img-5.11.6-zgws1

(wo nichtmal meine bevorzugte Notation mit dem redirect vor dem
Kommando funktioniert).

Es gibt wohl auch Lösungen mit binwalk, das aber auf so gut wie keinem
Rescuesystem verfügbar ist. Das ist alles wenig schön; ich frage mich,
ob das das Ergebnis eines Wettbewerbs für das ekelhafteste Dateiformat
ist.

Georg Schwarz

unread,
Mar 15, 2021, 5:37:39 PM3/15/21
to
Marc Haber <mh+usene...@zugschl.us> wrote:

> >aber im Kernelimage ein initramfs?
>
> Nein, das sind zwei unterschiedliche Dateien;

gut, vielleicht muss ich die Frage anders stellen: gibt es eine
Möglichkeit, dass in einem vmlinux Image (u.a.) ein Dateisystem
enthalten ist? Das Linux Image stellt den einzigen Bestandteil eines
uboot Images dar, es gibt keine weiteren Bestandteile mehr.

> Das sieht aus wie man ein initramfs erwartet, und dann ist nur der
> Microcode drin. Wenn man weiß, dass da ein cpio-archive und danach ein

in diesem Fall schon, und das ist wohl so üblich bei Linux. Man könnte
dort aber auch viel mehr reinpacken. Wird das nicht möglicherweise bei
einem embedded-Gerät wie einem Router gemacht?

> gzipped cpio ist, hilft diese Shell-Magie:
>
> |( cpio -i; zcat | cpio -i ) < /boot/initrd.img-5.11.6-zgws1

das Image ist in meinem Fall definitiv nicht komprimiert; ich sehe darin
Strings und ganze HTML-Dokumente im Klartext. Es war einmalig mit lzma
komprimiert; das reicht ja auch. Wenn ich cpio -i drauf anwende, kommen
nur Fehlermeldungen.

Ich sehe in der Datei auch keinen Code 0x07 0x07 0x01, der wohl ein
cpio-Image einleitet. Daher denke ich dass das Dateisystem darin in
einem anderen Format sein muss.

>
> (wo nichtmal meine bevorzugte Notation mit dem redirect vor dem
> Kommando funktioniert).

nach dem Motto: wieso einfach, wenn es auch kompliziert geht? :-)

>
> Es gibt wohl auch Lösungen mit binwalk, das aber auf so gut wie keinem
> Rescuesystem verfügbar ist. Das ist alles wenig schön; ich frage mich,
> ob das das Ergebnis eines Wettbewerbs für das ekelhafteste Dateiformat
> ist.


was hat das jetzt mit Rescuesystem zu tun?

Juergen Ilse

unread,
Mar 15, 2021, 6:20:43 PM3/15/21
to
Hallo,

Marc Haber <mh+usene...@zugschl.us> wrote:
> georg....@freenet.de (Georg Schwarz) wrote:
>>Marc Haber <mh+usene...@zugschl.us> wrote:
>>
>>> georg....@freenet.de (Georg Schwarz) wrote:
>>> >Marc Haber <mh+usene...@zugschl.us> wrote:
>>> >
>>> >> >Die üblichen initramfs sind ein cpio-Archiv.
>>> >>
>>> >> Vorne dran ist im Zweifel noch der CPU-Microcode.
>>> >
>>> >mit Sicherheit; es sollte ja ein komplettes Kernel-Image sein.
>>>
>>> Im initramfs ist kein Kernel-Image.
>>
>>aber im Kernelimage ein initramfs?
>
> Nein, das sind zwei unterschiedliche Dateien;

Ess gibt auf embedded Systemen durchaus Kernel-images mit embedded
initranfs. Ich habe dazu bei einer schnellen Recherche diese beiden
URLs gefunden, die moeglicherweise dem OP weiterhelfen koennten (ich
habe sie mir allerdings nicht komplett durchgelesen):
https://unix.stackexchange.com/questions/157211/extract-embedded-initramfs
https://reverseengineering.stackexchange.com/questions/23547/repacking-an-embedded-initramfs

Nicht alles auf der Welt ist ein handelsueblicher X86 PC ...

Tschuess,
Juergen Ilse (jue...@usenet-verwaltung.de)

Marc Haber

unread,
Mar 16, 2021, 2:55:37 AM3/16/21
to
georg....@freenet.de (Georg Schwarz) wrote:
>Marc Haber <mh+usene...@zugschl.us> wrote:
>
>> >aber im Kernelimage ein initramfs?
>>
>> Nein, das sind zwei unterschiedliche Dateien;
>
>gut, vielleicht muss ich die Frage anders stellen: gibt es eine
>Möglichkeit, dass in einem vmlinux Image (u.a.) ein Dateisystem
>enthalten ist? Das Linux Image stellt den einzigen Bestandteil eines
>uboot Images dar, es gibt keine weiteren Bestandteile mehr.

Meine Banana Pis booten mit kernel und initramfs. Anders habe ich das
nie gesehen. Aber das muss ja nichts heißen.

>> (wo nichtmal meine bevorzugte Notation mit dem redirect vor dem
>> Kommando funktioniert).
>
>nach dem Motto: wieso einfach, wenn es auch kompliziert geht? :-)

Unsinn, auf dem Niveau gibt es von mir keine Zeitaufwand mehr.

>> Es gibt wohl auch Lösungen mit binwalk, das aber auf so gut wie keinem
>> Rescuesystem verfügbar ist. Das ist alles wenig schön; ich frage mich,
>> ob das das Ergebnis eines Wettbewerbs für das ekelhafteste Dateiformat
>> ist.
>
>was hat das jetzt mit Rescuesystem zu tun?

Tja, ich könnte Dir das jetzt erklären. mach ich aber nicht, siehe
oben.

Marc Haber

unread,
Mar 16, 2021, 2:56:39 AM3/16/21
to
Juergen Ilse <ne...@usenet-verwaltung.de> wrote:
>Nicht alles auf der Welt ist ein handelsueblicher X86 PC ...

Dass es hier um eine embedded Nischenlösung geht, hatte ich überlesen.
Bitte um Entschuldigung.

Helmut Waitzmann

unread,
Mar 16, 2021, 6:06:57 AM3/16/21
to
Marc Haber <mh+usene...@zugschl.us>:
>|( cpio -i; zcat | cpio -i ) < /boot/initrd.img-5.11.6-zgws1
>
>(wo nichtmal meine bevorzugte Notation mit dem redirect vor dem
>Kommando funktioniert).

(
exec < /boot/initrd.img-5.11.6-zgws1 &&
{ cpio -i; zcat | cpio -i; }
)

Marc Haber

unread,
Mar 16, 2021, 6:21:40 AM3/16/21
to
Das ist aber _NICHT_ schöner.

Georg Schwarz

unread,
Mar 16, 2021, 5:24:53 PM3/16/21
to
Marc Haber <mh+usene...@zugschl.us> wrote:

>
> Dass es hier um eine embedded Nischenlösung geht, hatte ich überlesen.
> Bitte um Entschuldigung.

keine Ursache. Es geht um einen Router mit MIPS CPU.

Georg Schwarz

unread,
Mar 16, 2021, 5:25:04 PM3/16/21
to
Juergen Ilse <ne...@usenet-verwaltung.de> wrote:

> Ess gibt auf embedded Systemen durchaus Kernel-images mit embedded
> initranfs. Ich habe dazu bei einer schnellen Recherche diese beiden URLs
> gefunden, die moeglicherweise dem OP weiterhelfen koennten (ich habe sie
> mir allerdings nicht komplett durchgelesen):
> https://unix.stackexchange.com/questions/157211/extract-embedded-initramfs
> https://reverseengineering.stackexchange.com/questions/23547/repacking-an-
> embedded-initramfs

vielen Dank.
Wenn ich mir https://en.wikipedia.org/wiki/Initial_ramdisk ansehe,
vermute ich dass es sich hier um initrd, nicht initramfs handelt.
Von initramfs finde ich keine Strings, ebensowenig die Startbytes 07 07
01 von cpio.

Die Dateien, die ich im Image identifizieren kann, haben einen mit /
beginnenden Namen, der Null-terminiert ist, danach kommt direkt der
Dateiinhalt. Danach kommen zwei bis vier Null-Bytes (Padding?) und dann
der Dateiname der nächsten Datei (mit / am Anfang).
Da es sich bei einigen Dateien um HTML-Dateien handelt, kann ich sie gut
identifizieren. Keine Ahnung, um was für ein Dateisystemformat es sich
handelt und woran erkannt wird, wann eine Datei zuende ist. Ggfs. gibt
es ja auch Dateitabelle, in der Längen stehen oder sowas.
Außer html-Dateien und Bilddateien kann ich keine weiteren Dateien
erkennen. Kann es sein, dass der httpd (nennt sich mini-httpd) direkt im
Kernel läuft?
Aber vielleicht haben die Binaries auch so unauffällige Dateinamen, dass
ich sie im Hexeditor nicht erkenne.
Das ganze ist wie bereits geschrieben ein uboot-Image.
In dem finde ich Hinweise auf "legacy multi-component image format".

Christian Garbs

unread,
Mar 16, 2021, 6:32:53 PM3/16/21
to
Mahlzeit!

Georg Schwarz <georg....@freenet.de> wrote:

> Es geht um einen Router mit MIPS CPU.

Ich meine mich zu erinnern, dass ich mal bei OpenWRT und/oder einer
FritzBox sowas gesehen habe: Kernel-Image direkt gefolgt von einem
Dateisystem, das wird dann als Firmware geflashed.

Ich glaube, ich habe sowas auch mal auseinanderknoten wollen und das
war nicht spaßig. Finde aber keine Aufzeichnungen mehr dazu.

Du könntest als Inspiration mal das Buildsystem von OpenWRT
durchsuchen, wie da ein Factory-Image zusammengebaut wird.
https://openwrt.org/docs/techref/image.format

(Spontan finde ich im Wiki nichts besseres, das Wiki haben die
irgendwann in den letzten zwei Jahren einmal komplett umgebaut :-/)

Gruß
Christian
--
....Christian.Garbs....................................https://www.cgarbs.de
Q: Why do people who live near Niagara Falls have flat foreheads?
A: Because every morning they wake up thinking "What *is* that noise?
Oh, right, *of course*!
0 new messages