Frage

Wie verwende ich RIP Relative Adressierung in einem Linux-Montageprogramm für die AMD64-Archtiteure? Ich suche ein einfaches Beispiel (ein Hello-World-Programm), das den relativen Adressmodus AMD64 RIP nutzt.

Beispielsweise funktioniert das folgende 64-Bit-Montage-Programm mit normaler (absoluter Adressierung):

generasacodicetagpre.

Ich vermute, dass das gleiche Programm mit RIP-Relat-Relating-Adressierung so etwas wäre:

generasacodicetagpre.

Die normale Version läuft in Ordnung, wenn er kompiliert mit:

generasacodicetagpre.

Aber ich kann die RIP-Version nicht arbeiten.

Alle Ideen?

--- edit ----

Die Antwort von Stephen Canon funktioniert die RIP-Version.

Jetzt, wenn ich die ausführbare Datei der RIP-Version zerledere, bekomme ich:

objdump -d hallo

generasacodicetagpre.

Das zeigt, was ich versuchte, zu erfüllen: Lea 0x10 (% RIP),% RSI lädt die Adresse 17 Bytes nach der Anweisung des Lea-Anweisungen, die Adresse 0x400096 ist, wo die Hello-World-String gefunden werden kann und somit zu einem positionsunabhängigen Code führt.

War es hilfreich?

Lösung

Ich glaube, dass Sie die -Adresse Ihrer Saite in den generationspflichtigen Ladung in den generationspflichtigen Ladern laden möchten.Ihr Code versucht, ein Quadword von dieser Adresse anstelle der Adresse selbst zu laden.Du willst:

generasacodicetagpre.

wenn ich mich nicht irre.Ich habe jedoch keine Linux-Box, um weiter zu testen.

Andere Tipps

Da Sie die Adresse von msg in% RSI benötigen, ersetzen Sie einfach:

generasacodicetagpre.

mit:

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top