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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top