Little Endian, Big Endian, Adressen
-
Hi,
Ich habe mal willkürlich eine binary von linux x86 objdump'ed, die folgende Linie ergibt mir keinen Sinn:
804844c: e8 9b ff ff ff call 80483ec <__libc_start_main@plt>
Vorallem das: e8 9b ff ff ff.
0xe8 ist das Instruktions-Byte für 'call'. Das weiss ich. Jedoch kann ich das hintere Zeugs nicht verstehen. Da Linux Little Endian ist, würde es für mich folgendermassen ff ff ff 9b e8 mehr Sinn machen, da ff eindeutig grösser als e8 ist.
Kann mir das alles jemand erklären?
Thanx!
MrByteOrder
-
Habe mir nochmals gedanken gemacht, und habe eine Lösung(!) bin aber nicht sicher ob das stimmt:
Wenn ich die Adresse:
0xffffff9b von zweier Komplementär umwandle, ergibts:
0x00000064 wenn ich die Adresse nun nach Little Endian umwandle, gibts:
0x64000000 d.h. deshalb ist die zweier Komplementäre Adresse so aufgestellt:
----------
0x9bfffffferzähl ich kacke?
-
little/big endianess ist eine eigenschaft des prozessors, nicht des betriebssystems. wie dem auch sei, obiges ist ein relativer call (relativ zum instruction pointer)
dabei geht man jeweils vom zustand des instruktions pointers nach einlesen des befehls aus. hier also
0x8048451
das ziel ist
0x80483ec
also vor der aktuellen adresse, es ist also kein wunder, dass das offset negativ ist, nähmlich -101 bzw. im zweierkomplement eben
0xffffff9b
relative jump/calls sind natürlich von großem nutzen, um positionsunabhängige executables zu erzeugen, denn hier muss der loader nicht nochmal eingreifen, wenn das binary an einer anderen adresse geladen werden soll.
-
Der Opcode E8 bezeichnet einen Relativen Call.
D.H.
Nach dem Opcode kommt die Distanz nicht die Adresse.
Die Distanz ist ein Vorzeichenbehaftete Zahl, da man auch rückwärts springen kann.//edit siehe camper :p
-
Danke,
ich werde das heute Abend mal anschauen und versuchen zu verstehen. Werde morgen Feedback liefern (evtl. weitere Fragen).
gruss
-
Verstanden, vielen Dank, ihr seid nun entlassen! *hehe*.