次のような構文を使用して、Linuxでフラットバイナリイメージを実行する方法はありますか?
nasm -f bin -o foo.bin foo.asm
runbinary foo.bin
Linux カーネルは、いくつかの異なるバイナリ形式をロードできます。a.out 形式もよく知られていますが、ELF が最も一般的です。
サポートされているバイナリ形式は、どの binfmt モジュールがカーネルにロードまたはコンパイルされるかによって制御されます (カーネル構成のファイルシステム セクションの下にあります)。かなり最小限のuClinux BFLTフラットフォーマットバイナリ用がありbinfmt_flat
ます.zlib圧縮することもできるので、バイナリをさらに小さくすることができるので、これは良い選択です.
nasm がこの形式をネイティブにサポートしているようには見えませんが、Jim Lewis が ELF について説明しているように、必要なヘッダーを手動で追加するのは非常に簡単です。ここにフォーマットの説明があります。
「-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