我们可以看一下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