当前位置:  开发笔记 > 运维 > 正文

在Linux下执行平面二进制文件

如何解决《在Linux下执行平面二进制文件》经验,为你挑选了2个好方法。

有没有办法在Linux中执行平面二进制映像,使用如下语法:

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

caf.. 9

Linux内核可以加载几种不同的二进制格式 - ELF只是最常见的,尽管a.out格式也是众所周知的.

支持的二进制格式由哪些binfmt模块加载或编译到内核(它们位于内核配置的Filesystem部分下)控制.有一个binfmt_flat用于uClinux的BFLT平格式的二进制这是相当小的-他们甚至可以zlib的压缩,这将让你让你的二进制文件更小,所以这可能是一个不错的选择.

看起来nasm本身不支持这种格式,但是如Jim Lewis为ELF描述的那样,手动添加必要的标题非常容易.有格式的描述在这里.



1> caf..:

Linux内核可以加载几种不同的二进制格式 - ELF只是最常见的,尽管a.out格式也是众所周知的.

支持的二进制格式由哪些binfmt模块加载或编译到内核(它们位于内核配置的Filesystem部分下)控制.有一个binfmt_flat用于uClinux的BFLT平格式的二进制这是相当小的-他们甚至可以zlib的压缩,这将让你让你的二进制文件更小,所以这可能是一个不错的选择.

看起来nasm本身不支持这种格式,但是如Jim Lewis为ELF描述的那样,手动添加必要的标题非常容易.有格式的描述在这里.



2> Jim Lewis..:

有什么理由你不想使用"-f elf"而不是"-f bin"吗?

我认为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     $ - $$

此映像包含一个ELF标头,将该文件标识为Intel 386可执行文件,没有节头表和包含一个条目的程序头表.所述条目指示程序加载器将整个文件加载到内存中(程序在其内存映像中包含其ELF头和程序头表的正常行为)从内存地址0x08048000(这是要加载的可执行文件的默认地址)开始,并开始执行_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

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有