手工ELF文件

时间:2010-08-23 14:53:20

标签: linux elf

嘿,我手动创建了一个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并期望系统可以容忍它?

谢谢,

2 个答案:

答案 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