在Linux下执行平面二进制文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Linux下执行平面二进制文件相关的知识,希望对你有一定的参考价值。
有没有办法在Linux中执行平面二进制映像,使用如下语法:
nasm -f bin -o foo.bin foo.asm
runbinary foo.bin
有什么理由你不想使用“-f elf”而不是“-f bin”吗?
我认为Linux不会运行不是ELF格式的二进制文件。我找不到将平面二进制文件转换为ELF的工具,但你可以通过使用here描述的技术将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
Linux内核可以加载几种不同的二进制格式 - ELF只是最常见的,尽管a.out格式也是众所周知的。
支持的二进制格式由哪些binfmt模块加载或编译到内核(它们位于内核配置的Filesystem部分下)控制。有一个用于uClinux BFLT平面格式二进制文件的binfmt_flat
非常小 - 它们甚至可以被zlib压缩,这将使你的二进制文件更小,所以这可能是一个不错的选择。
看起来nasm本身不支持这种格式,但是如Jim Lewis为ELF描述的那样,手动添加必要的标题非常容易。有一个格式here的描述。
最低限度,Linux将需要弄清楚可执行文件的格式,它将从第一个字节获得。例如,如果它是一个脚本,那将是#!, shebang。如果它的ELF是0x7F'E''L''F'。那些神奇的数字将决定查找处理程序。
所以你需要一个带有公认魔数的标题。您可以在/ proc / sys / fs / binfmt_misc中获取shebang支持的格式列表。获取本机二进制格式列表(不幸的是)a little trickier。
bFLT可能是一个不错的选择。实际上,它是一种流行的嵌入式可执行格式。但你也可以把ELF挤得相当远。 This article得到了一个低至45字节的ELF可执行文件。也就是说,你主要用手而不是用工具来压缩它。
以上是关于在Linux下执行平面二进制文件的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段