2010-08-23 69 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