2016-04-02 7 views
1

Ich versuche, etwas über die Assemblersprache zu lernen, indem ich die Anweisungen in einigen gemeinsamen Objekten studiere. Ich habe eine Konstruktion angetroffen, wo eine call Anweisung nach seinem Anfang bis zu 1 Byte führt, zum Beispiel (Ausgabe von hte):Wie kann dieser umgelagerte Anruf decodiert werden?

af6fc | e8fcffffff call af6fdh 

Klar, dass die Zieladresse muss durch eine geeignete Funktion ersetzt werden (was ich in diesem Fall wissen ist strcmp). Ich finde das seltsam, denn in anderen Teilen des gleichen gemeinsame Objekts der gleichestrcmp Funktion des .got/.plt Mechanismus die Notwendigkeit aufgerufen wird eliminiert Teile .text neu zu schreiben. Im letzteren Fall kann die Zielfunktion durch Studieren der Tabelle .rel.plt zusammen mit .dynsym identifiziert werden. Aber wie finde ich, wo die unmittelbare Adresse in ersterem umgeleitet wird? Ich konnte kein Vorkommen der Adressen af6fc oder af6fd in irgendeinem der Abschnitte finden, zumindest nicht in denen, die durch hte zugänglich gemacht werden.

Antwort

1

Sie haben nicht gesagt, auf welcher Plattform Sie sich befinden. Es scheint ix86 zu sein.

Unter ix86 ist es möglich, nicht kompilierten Code in eine gemeinsame Bibliothek zu verlinken (dies erzeugt eine Bibliothek mit Textumsetzungen, die suboptimal ist).

Wenn Sie dynamische Umlagerungen mit objdump -R foo.so auslagern, sollten Sie feststellen, dass eine Verschiebung gegen die Adresse vorliegt. Der dynamische Linker aktualisiert 4 Bytes unter 0xaf6fd, um dorthin zu zeigen, wo die Verschiebung ihn nach dem Laden von foo.so anweist.

in anderen Teilen des gleichen gemeinsamen Objekt wird die gleiche Funktion strcmp

Diese Anrufe kommen aus Objekten, die (richtig) wurden erstellt mit -fPIC mit dem .got/PLT-Mechanismus genannt.

Verwandte Themen