8

次のような構文を使用して、Linuxでフラットバイナリイメージを実行する方法はありますか?

nasm -f bin -o foo.bin foo.asm
runbinary foo.bin
4

3 に答える 3

9

Linux カーネルは、いくつかの異なるバイナリ形式をロードできます。a.out 形式もよく知られていますが、ELF が最も一般的です。

サポートされているバイナリ形式は、どの binfmt モジュールがカーネルにロードまたはコンパイルされるかによって制御されます (カーネル構成のファイルシステム セクションの下にあります)。かなり最小限のuClinux BFLTフラットフォーマットバイナリ用がありbinfmt_flatます.zlib圧縮することもできるので、バイナリをさらに小さくすることができるので、これは良い選択です.

nasm がこの形式をネイティブにサポートしているようには見えませんが、Jim Lewis が ELF について説明しているように、必要なヘッダーを手動で追加するのは非常に簡単です。ここにフォーマットの説明があります。

于 2009-08-16T04:38:04.583 に答える
7

「-fbin」の代わりに「-felf」を使用したくない理由はありますか?

LinuxはELF形式でないバイナリを実行しないと思います。フラットバイナリをELFに変換するツールは見つかりませんが、ここで説明する手法を使用して、ELF情報をfoo.asmに配置することでチートできます。

ELF仕様、/ usr / include / linux / elf.h、および標準ツールによって作成された実行可能ファイルを調べて、空のELF実行可能ファイルがどのようになるかを理解できます。しかし、もしあなたがせっかちなタイプなら、私がここで提供したものを使うことができます:

 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     $ - $$

このイメージには、ファイルをIntel 386実行可能ファイルとして識別するELFヘッダーが含まれており、セクションヘッダーテーブルと1つのエントリを含むプログラムヘッダーテーブルはありません。このエントリは、メモリアドレス0x08048000(実行可能ファイルをロードするためのデフォルトアドレス)から開始して、ファイル全体をメモリにロードするようにプログラムローダーに指示します(プログラムがELFヘッダーとプログラムヘッダーテーブルをメモリイメージに含めるのは通常の動作です)。 、およびプログラムヘッダーテーブルの直後に表示される_startでコードの実行を開始します。.dataセグメント、.bssセグメント、解説はありません。必要なものだけです。

それでは、私たちの小さなプログラムに追加しましょう:

 ; tiny.asm
               org     0x08048000

 ;
 ; (as above)
 ;

_start: mov bl, 42 xor eax, eax inc eax int 0x80 filesize equ $ - $$

そしてそれを試してみてください:

 $ nasm -f bin -o a.out tiny.asm
 $ chmod +x a.out
 $ ./a.out ; echo $?
 42
于 2009-08-16T02:53:50.670 に答える