2017-07-21 3 views
4

J'essaie d'en apprendre davantage sur le standard elf en écrivant un fichier exécutable elf à partir de zéro. ELF32 n'a pas posé beaucoup de problème, en utilisant ce code:Erreur d'exécution lors de l'écriture de ELF64 à partir de zéro

BITS 32 

      org  0x08048000 

ehdr:             ; Elf32_Ehdr 
      db  0x7F, "ELF", 1, 1, 1, 2   ; e_ident 
    times 8 db  0 
      dw  2        ; e_type 
      dw  3        ; e_machine 
      dd  1        ; e_version 
      dd  _start       ; e_entry 
      dd  phdr - $$      ; e_phoff 
      dd  0        ; e_shoff 
      dd  0        ; e_flags 
      dw  ehdrsize      ; e_ehsize 
      dw  phdrsize      ; e_phentsize 
      dw  1        ; e_phnum 
      dw  0        ; e_shentsize 
      dw  0        ; e_shnum 
      dw  0        ; e_shstrndx 

ehdrsize  equ  $ - ehdr 

phdr:             ; Elf32_Phdr 
      dd  1        ; p_type 
      dd  0        ; p_offset 
      dd  $$        ; p_vaddr 
      dd  $$        ; p_paddr 
      dd  filesize      ; p_filesz 
      dd  filesize      ; p_memsz 
      dd  5        ; p_flags 
      dd  0x1000       ; p_align 

phdrsize  equ  $ - phdr 

_start: 
      mov  bl, 42 
      xor  eax, eax 
      inc  eax 
      int  0x80 

filesize  equ  $ - $$ 

Source: http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html

Je peux monter cela en un exécutable avec nasm et il exécute très bien:

$ nasm -f bin -o test32 template32.asm 
$ chmod +x test32 
$ ./test32 ; echo $? 
42 

Ensuite, j'ai essayé de faire la même chose avec 64 bits. J'ai lu les différences que je trouve ici: https://www.uclibc.org/docs/elf-64-gen.pdf

Voici le résultat des modifications que je mis en œuvre:

BITS 64 

      org  0x08048000 

ehdr:             ; Elf64_Ehdr 
      db  0x7F, "ELF", 2, 1, 1, 2   ; e_ident 
    times 7 db  0 
      db  0x10       ; e_nindent 
      dw  2        ; e_type 
      dw  3        ; e_machine 
      dd  1        ; e_version 
      dq  _start       ; e_entry 
      dq  phdr - $$      ; e_phoff 
      dq  0        ; e_shoff 
      dd  0        ; e_flags 
      dw  ehdrsize      ; e_ehsize 
      dw  phdrsize      ; e_phentsize 
      dw  1        ; e_phnum 
      dw  0        ; e_shentsize 
      dw  0        ; e_shnum 
      dw  0        ; e_shstrndx 

ehdrsize  equ  $ - ehdr 

phdr:             ; Elf64_Phdr 
      dd  1        ; p_type 
      dd  5        ; p_flags 
      dq  0        ; p_offset 
      dq  $$        ; p_vaddr 
      dq  $$        ; p_paddr 
      dq  filesize      ; p_filesz 
      dq  filesize      ; p_memsz 
      dq  0x1000       ; p_align 

phdrsize  equ  $ - phdr 

_start: 
     mov  bl, 42 
     xor  eax, eax 
     inc  eax 
     int  0x80 

filesize  equ  $ - $$ 

En utilisant les mêmes commandes que ci-dessus, je reçois cette erreur:

./test64: cannot execute binary file: Exec format error 

Quelque chose que j'ai remarqué: Lorsque j'appelle un fichier à la fois sur test32 et test64, je reçois un message me disant que la taille de l'en-tête de section est corrompue. Je trouve ça bizarre parce que je n'ai pas d'en-tête de section ... J'ai aussi regardé chaque fichier avec l'éditeur 010 et un template ELF mais tout me semble bien.

EDIT:

vidage hexadécimal 32bit:

7f45 4c46 0101 0102 0000 0000 0000 0000 
0200 0300 0100 0000 5480 0408 3400 0000 
0000 0000 0000 0000 3400 2000 0100 0000 
0000 0000 0100 0000 0000 0000 0080 0408 
0080 0408 5b00 0000 5b00 0000 0500 0000 
0010 0000 b32a 31c0 40cd 80 

64 bits vidage hexadécimal:

7f45 4c46 0201 0102 0000 0000 0000 0010 
0200 0300 0100 0000 7880 0408 0000 0000 
4000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 4000 3800 0100 0000 0000 0000 
0100 0000 0500 0000 0000 0000 0000 0000 
0080 0408 0000 0000 0080 0408 0000 0000 
8000 0000 0000 0000 8000 0000 0000 0000 
0010 0000 0000 0000 b32a 31c0 ffc0 cd80 
+0

Ce problème n'est pas votre _immediate_, mais vous devez être conscient que '_exit' est l'appel système n ° 1 pour x86-64 (-linux), et les arguments d'appel système vont également dans différents registres. – zwol

+0

En outre, 'file' s'attend probablement à ce qu'il y ait toujours au moins un en-tête de section, puisque c'est ce que fait la chaîne d'outils habituelle. – zwol

+0

Juste pour écarter la possibilité que nasm fasse quelque chose de bizarre, pourriez-vous s'il vous plaît modifier les dumps hexadécimaux des deux binaires dans votre question? – zwol

Répondre

6

dw 3 ; e_machine

Selon le System V Application Binary Interface Architecture AMD64 Processeur Supplément cette valeur doit à la place être 62 pour Advanced Micro Devices X86-64. Avec ce changement, ça fonctionne pour moi.

+0

Ça a marché, merci :) – MyUsername112358