嗨,我手工创build了一个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
当我在这个精灵文件上运行时,readelf不会抱怨。 如果我执行这个文件,那么一旦我执行它,它就会被杀死,并在屏幕上显示“Killed”消息。 我已经在这里通过以下post在stackoverflow ,我还在经历它。
现在我担心的是这个程序不要求任何(额外的)内存,而且是否真的有可能手动做一个ELF,并期望它完全被系统所容忍?
谢谢,
由于各种原因, ELF加载器可以将SIGKILL发送到您的流程; 你可能有一个不好的地址和/或在标题的某处长度。
例如, 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 $
…那么结果是相当小(无论如何可能足够小,以比较你的手工制作的文件失败,看看你出了什么地方)。
我最近也尝试做类似的实验。
在这个过程中,我看到运行生成的elf文件时也会得到错误信息
viraddr的错误设置和段的位置导致的结果,请自行分析
elf文件与一个标准的精灵文件(编译和链接)。
顺便说一下,为了遵守标准a.out elf文件的简单性,可以使用-s参数
消除elf文件中的符号表:ld -s ao