2010-08-23 21 views
9

Hey, ich habe eine ELF-Datei von Hand erstellt, es hat zwei Abschnitte (. Text und. Shstrtab) und eine Programm-Kopfzeile, die den Textabschnitt lädt. Der .text Abschnitt ist sehr klein und es besteht nur aus drei folgenden Anweisungen ...ELF-Datei von Hand

# and exit 
    movl $0,%ebx  # first argument: exit code 
    movl $1,%eax  # system call number (sys_exit) 
    int  $0x80   # call kernel 

Die readelf beschwert sich nicht, wenn ich es auf dieser Elf-Datei. Wenn ich diese Datei ausspreche, wird sie, sobald ich sie ausführe, getötet und die Meldung "Killed" erscheint auf dem Bildschirm. Ich habe den folgenden Post hier unter stackoverflow durchgegangen und ich gehe immer noch durch.

Nun meine Sorge ist, dass dieses Programm nicht für (zusätzlichen) Speicher fragt und auch ist es wirklich möglich, ein ELF von Hand zu tun und erwartet, dass es überhaupt vom System toleriert werden ?.

Danke,

+0

Haben Sie http lesen: // www.muppetlabs.com/~breadbox/software/tiny/teensy.html? Dies ist ELF von Hand bis zum Äußersten getan. – camh

+1

Ja, ich habe es gelesen, es ist ein gutes Buch. – Sohail

+1

Haben Sie jemals die Ursache des Absturzes gefunden? –

Antwort

11

Die ELF loader SIGKILL an Ihren Prozess für eine Vielzahl von Gründen senden; Sie haben wahrscheinlich eine schlechte Adresse und/oder Länge irgendwo in den Headern.

z.B. Ein PT_LOAD-Segment muss den entsprechenden Teil der ausführbaren Datei einer sinnvollen Adresse zuordnen (die übliche Adresse für x86 Linux ist 0x08048000, obwohl das wahrscheinlich nicht kritisch ist, solange die Seite ausgerichtet ist, nicht 0 und nicht zu hoch) und die Adressen in beiden Der Header der Sektion .text und der Einstiegspunkt im ELF-Header müssen dazu passen.

Es gibt keinen Grund, warum Sie nicht in der Lage sein sollten, dies manuell zu tun (wenn der Linker es erstellen kann, können Sie das auch!) - wenn Sie es wirklich wollen. Aber beachten Sie, dass, wenn Sie einfach dann mit Symbolen zusammenstellen verknüpfen gestrippt (die -s Flag ld unten):

$ 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 
$ 

... dann ist das Ergebnis ziemlich minimal ist sowieso (wahrscheinlich ausreichend minimal mit dem Versagen von Hand gearbeiteten vergleichen Datei, um zu sehen, wo Sie falsch gelaufen sind).

+0

Vielen Dank für die Antwort, Ihr Rat ist nett. Ich werde es folgen. Meine handgefertigte Datei ist jetzt ziemlich groß geworden, aber ich bekomme immer noch das gleiche Ergebnis, wenn ich versuche, sie auszuführen. Nochmals vielen Dank für die Antwort. – Sohail

+0

Ich habe versucht, deine Antwort abzustimmen, aber es braucht 15 Ruf, um das zu tun, ich werde zurückkommen, wenn ich so viele habe. – Sohail

+0

Der Eintrag PT_LOAD muss ebenfalls als lesbar und ausführbar markiert werden. – ysdx

0

Ich habe vor kurzem auch versucht, ähnliche Experimente zu machen.
Während des Prozesses, bekomme ich auch die Fehlerinfo beim Ausführen der generierten Elf-Datei, es scheint
ergibt sich aus falscher Einstellung des viraddr und der Platzierung der Segmente, diff Ihre eigene
Elf-Datei mit einer Standard-Elf-Datei (kompiliert und verbunden).
By the way, die Einfachheit des Standard a.out elf Datei keey, können Sie den Parameter es
verwenden können, um die Symboltabellen in elf Datei zu beseitigen: ld es ao