嘿,我手动创建了一个ELF文件,它有两个部分(.text和.shstrtab)和一个加载.text部分的程序头。 .text部分非常小,它只包含以下三条指令......
# and exit
movl $0,%ebx # first argument: exit code
movl $1,%eax # system call number (sys_exit)
int $0x80 # call kernel
当我在这个elf文件上运行时,readelf不会抱怨。如果我执行此文件,那么一旦执行它,它就会被杀死并且屏幕上会出现“Killed”消息。 我已经在stackoverflow点击了以下帖子,我仍然会通过它。
现在我担心的是这个程序不会要求任何(额外的)内存,而且是否真的可以手动执行ELF并期望系统可以容忍它?
谢谢,
答案 0 :(得分:11)
ELF loader可以出于各种原因向您的流程发送SIGKILL;你可能在标题中的某处有一个错误的地址和/或长度。
e.g。 PT_LOAD
段必须将可执行文件的相应部分映射到合理的地址(x86 Linux的通常地址是0x08048000,尽管这可能并不重要,只要它是页面对齐,而不是0,而不是太高)和.text
节标题中的地址和ELF标题中的入口点都需要与之匹配。
没有理由你不能手工完成这个(如果链接器可以创建它,你也可以!) - 如果你真的想要。但请注意,如果你只是组合然后用剥离的符号链接(-s
标志到下面的ld
):
$ cat exit.s
.globl _start
_start:
movl $0,%ebx
movl $1,%eax
int $0x80
$ as -o exit.o exit.s
$ ld -s -o exit exit.o
$ ./exit
$ hexdump -Cv exit
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 02 00 03 00 01 00 00 00 54 80 04 08 34 00 00 00 |........T...4...|
00000020 74 00 00 00 00 00 00 00 34 00 20 00 01 00 28 00 |t.......4. ...(.|
00000030 03 00 02 00 01 00 00 00 00 00 00 00 00 80 04 08 |................|
00000040 00 80 04 08 60 00 00 00 60 00 00 00 05 00 00 00 |....`...`.......|
00000050 00 10 00 00 bb 00 00 00 00 b8 01 00 00 00 cd 80 |................|
00000060 00 2e 73 68 73 74 72 74 61 62 00 2e 74 65 78 74 |..shstrtab..text|
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000090 00 00 00 00 00 00 00 00 00 00 00 00 0b 00 00 00 |................|
000000a0 01 00 00 00 06 00 00 00 54 80 04 08 54 00 00 00 |........T...T...|
000000b0 0c 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 |................|
000000c0 00 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 |................|
000000d0 00 00 00 00 60 00 00 00 11 00 00 00 00 00 00 00 |....`...........|
000000e0 00 00 00 00 01 00 00 00 00 00 00 00 |............|
000000ec
$
...无论如何,结果相当小(可能只是与你手工制作的失败文件相比,看你出错的地方)。
答案 1 :(得分:0)
我最近也尝试做类似的实验
在此过程中,我还会在运行生成的elf文件时收到错误信息,这似乎是由于viraddr的错误设置和段的放置造成的,使用标准精灵来区分您自己的精灵文件文件(编译和链接)。
顺便说一下,为了遵守标准a.out elf文件的简单性,你可以使用-s参数
来消除elf文件中的符号表:ld -s a.o