2010-08-23 67 views
9

嘿,我已经手工创建了一个ELF文件,它有两个部分(.text和.shstrtab)和一个加载.text部分的程序头。 .text段是非常小的,它仅由以下三个指令......ELF文件手

# 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

你读过的http:// www.muppetlabs.com/~breadbox/software/tiny/teensy.html?这是ELF手工完成的极端。 – camh 2010-08-23 23:59:19

+1

是的,我读过它,它是一个很好的阅读。 – Sohail 2010-08-24 22:56:40

+1

有没有找到坠机的原因? – 2011-07-05 01:18:38

回答

11

ELF loader可以发送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 
$ 

...那么结果是相当小的呢(可能是最小的充分与你的失败手工制作的比较文件来查看你出错的地方)。

+0

谢谢你的回复,你的建议很好。我会遵循它。我手工制作的文件现在已经变得相当大,但当我尝试运行它时,仍然会得到相同的结果。再次感谢您的答复。 – Sohail 2010-08-24 22:55:24

+0

我试着投票回复你的回复,但需要15个声望才能这样做,当我有这么多时我会回来。 – Sohail 2010-08-24 22:59:24

+0

PT_LOAD条目也需要被标记为可读且可执行。 – ysdx 2015-09-01 14:48:27

0

我最近也尝试做类似的实验。
在这个过程中,我在运行生成的elf文件时也得到了错误信息,似乎
因viraddr的错误设置和段的放置而导致的结果,请将您自己的
elf文件与标准elf文件(已编译和链接)。
顺便说一句,到keey a.out的ELF文件标准的简单,你可以使用-s参数
消除ELF文件的符号表:LD -s AO