
Una herramienta para recuperar un .ELF totalmente analizable desde un kernel en bruto, mediante la extracción de la tabla de símbolos del kernel (kallsyms)
Esta herramienta permite obtener un archivo .ELF completamente analizable a partir de una imagen de kernel vmlinux/vmlinuz/bzImage/zImage (ya sea un blob binario sin procesar o un archivo .ELF existente pero sin símbolos), con los símbolos de funciones y variables recuperados.
Para ello, escanea el kernel en busca de una tabla de símbolos del kernel (kallsyms), una tabla de símbolos comprimida que está presente en casi todos los kernels, prácticamente sin alterar.
Debido a que la tabla de símbolos en cuestión está originalmente comprimida, debería recuperar cadenas que no son visibles en el binario original.
Produce un archivo .ELF que puedes analizar con IDA Pro y Ghidra. Por lo tanto, esta herramienta es útil para la ingeniería inversa de sistemas embebidos.
Uso:
# Command line:
vmlinux-to-elf <input_kernel.bin> <output_kernel.elf>
# Command line, list symbol addresses only:
kallsyms-finder <input_kernel.bin> # If installed with uv
vmlinux-to-elf.kallsyms-finder # If installed with snap
# Command line, just decompress the kernel:
vmlinuz-decompressor <input_kernel.bin> <output_kernel.bin> # If installed with uv
vmlinux-to-elf.vmlinuz-decompressor # If installed with snap
# Graphical:
vmlinux-to-elf-gui # If installed with uv
vmlinux-to-elf.gui # If installed with snap
flatpak run re.fossplant.vmlinux-to-elf # If installed with flatpak
Instalación:
# Install CLI+GUI with Snap (recommended on Ubuntu)
sudo snap install vmlinux-to-elf
# Install CLI+GUI with yay (recommended on Arch, Manjaro)
yay -S vmlinux-to-elf libadwaita python-gobject
# Install CLI+GUI with uv (example with Fedora)
sudo dnf install -y uv glib2-devel libadwaita-devel gtk4-devel \
gobject-introspection-devel python3-gobject-devel \
python3-devel cairo-devel @development-tools
uv tool install vmlinux-to-elf[gui]
vmlinux-to-elf-gui --install-metadata # Install .desktop file
# Install CLI with uv and GUI with Flatpak (recommended on
# distributions with libadwaita < 1.6)
sudo dnf install -y uv flatpak @development-tools
uv tool install vmlinux-to-elf
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install re.fossplant.vmlinux-to-elf
Configuración del entorno de desarrollo local:
sudo snap install --classic astral-uv
sudo apt install git
git clone [email protected]:marin-m/vmlinux-to-elf.git
# Dependencies for the GTK-4 GUI
sudo apt install libgirepository-2.0-dev libadwaita-1-dev \
gir1.2-adw-1 gir1.2-gtk-4.0 python3-dev blueprint-compiler
cd vmlinux-to-elf
cp -a .github/hooks/* .git/hooks/
# Download Python modules and initialize virtualenv (creates ".venv",
# call "source .venv/bin/activate" to set up)
uv sync --extra gui
# Add vmlinux-to-elf to $PATH, so that the commands are callable
# system-wide (creates a symlink to the source in "~/.local/bin")
uv tool install -e .[gui]
boot.img de Android, que comienzan con la firma mágica ANDROID! o UNCOMPRESSED_IMG [OK]Puede encontrarse una breve historia de la tabla de símbolos "kallsyms" al principio del archivo "kallsyms.py". Brevemente, esta se introdujo en el kernel de Linux hacia 2004 en su forma actual y se utiliza, entre otras cosas, para imprimir los mensajes de "Kernel oops".
Contiene tuplas de "nombre del símbolo", "dirección del símbolo", "tipo del símbolo" (los tipos de símbolo se designan con una sola letra, de forma similar a la utilidad nm), y esta información está empaquetada de forma compacta con un sencillo algoritmo de compresión.
El esquema siguiente muestra cómo se serializa esta información en el kernel; el desplazamiento de cada estructura respectiva es detectado por vmlinux-to-elf mediante heurísticas: