Ausführen eine flache Binärdatei unter Linux
Frage
Gibt es eine Möglichkeit, eine flache Binärbild in Linux auszuführen, unter Verwendung einer Syntax etwas wie:
nasm -f bin -o foo.bin foo.asm
runbinary foo.bin
Lösung
Gibt es einen Grund, warum Sie wollen nicht „-f elf“ anstelle von „-f ist“?
verwenden,Ich denke, Linux wird nicht ein binäres ausführen, die nicht in ELF-Format ist. Ich kann nicht ein Werkzeug finden, das flache Binärdateien ELF konvertiert, aber man kann betrügen, indem Sie die ELF Informationen in foo.asm setzen, unter Verwendung der Technik hier :
Wir können an der ELF aussehen Spezifikation und /usr/include/linux/elf.h und ausführbare Dateien von der Norm erstellt Werkzeuge, um herauszufinden, was unsere leeren ELF ausführbare Datei sollte so aussehen. Aber, wenn Sie die ungeduldige Typ sind, können Sie benutzen Sie einfach die, die ich hier geliefert haben:
BITS 32 org 0x08048000 ehdr: ; Elf32_Ehdr db 0x7F, "ELF", 1, 1, 1, 0 ; e_ident times 8 db 0 dw 2 ; e_type dw 3 ; e_machine dd 1 ; e_version dd _start ; e_entry dd phdr - $$ ; e_phoff dd 0 ; e_shoff dd 0 ; e_flags dw ehdrsize ; e_ehsize dw phdrsize ; e_phentsize dw 1 ; e_phnum dw 0 ; e_shentsize dw 0 ; e_shnum dw 0 ; e_shstrndx ehdrsize equ $ - ehdr phdr: ; Elf32_Phdr dd 1 ; p_type dd 0 ; p_offset dd $$ ; p_vaddr dd $$ ; p_paddr dd filesize ; p_filesz dd filesize ; p_memsz dd 5 ; p_flags dd 0x1000 ; p_align phdrsize equ $ - phdr _start: ; your program here filesize equ $ - $$
Dieses Bild enthält einen ELF-Header, Identifizierung der Datei als eine Intel 386 ausführbare Datei, ohne Abschnittsheader Tisch und ein Programmkopftabelle enthält einen Eintrag. Said Eintrag weist den Programmlader zu laden die gesamte Datei in den Speicher (es ist normale Verhalten für ein Programm sind seine ELF-Header und Programm Kopftabelle in seinem Speicher Image) beginnend bei der Speicheradresse 0x08048000 (Das ist die Standardadresse für ausführbare Dateien zu laden), und beginnen Ausführen des Codes auf _start, die erscheint unmittelbar nach dem Programm Kopftabelle. Kein .data Segment, nein .bss Segment, kein Kommentar - nichts aber das Nötigste.
Also, lassen Sie sich in unserem kleinen Programm hinzufügen:
; tiny.asm org 0x08048000 ; ; (as above) ; _start: mov bl, 42 xor eax, eax inc eax int 0x80 filesize equ $ - $$
und probieren Sie es aus:
$ nasm -f bin -o a.out tiny.asm $ chmod +x a.out $ ./a.out ; echo $? 42
Andere Tipps
Die Linux-Kernel kann mehr verschiedene Binärformaten laden - ELF ist nur die häufigste, obwohl das Format a.out auch ziemlich gut bekannt ist
. Die unterstützten Binärformaten werden, durch die gesteuerte binfmt Module geladen ist oder in das Kernel kompiliert (sie sind unter dem Dateisystemabschnitt der Kernel-Konfiguration). Es gibt eine binfmt_flat
für uClinux Bflt flache Format Binärdateien, die ziemlich minimal sind -. Sie sogar zlib sein können komprimiert, die Sie Ihre binären machen lassen noch kleiner, so könnte dies eine gute Wahl sein
Es sieht nicht wie nasm nativ unterstützt dieses Format, aber es ist ziemlich einfach, den notwendigen Header manuell hinzufügen, wie Jim Lewis für ELF beschreibt. Es gibt eine Beschreibung des Formats hier rel="nofollow .
Minimal, Linux müssen das Format der ausführbaren Datei, um herauszufinden, und es wird, dass von dem ersten Bytes bekommen. Zum Beispiel, wenn es ein Skript, das # !, shebang werden. Wenn es ELF, die 0x7F ‚E‘ ‚L‘ ‚F‘ wird. Diese magischen Zahlen wird die Prozedur aus einer Nachschlag bestimmen.
Also Sie Gonna braucht einen Header mit einer anerkannten magischen Zahl. Sie können eine Liste von shebang unterstützten Formate erhalten in / proc / sys / fs / binfmt_misc . Abrufen einer Liste von nativen Binärformaten ist (leider) ein wenig komplizierter .
Bflt kann eine gute Wahl sein. Tatsächlich ist es ein beliebtes eingebettete ausführbare Datei-Format. Sie können aber auch ELF quetschen ziemlich weit unten. diesem Artikel eine ELF ausführbare nach unten bekam zu 45 Byte. Das heißt, würden Sie es nach unten meist von Hand und nicht durch Werkzeug werden zusammendrücken.