Little Endian auf dem Stack?

Neue Frage »

Auf diesen Beitrag antworten »
Liquid Little Endian auf dem Stack?

Hi, es geht gerade um Reverse Engineering aber mir sind jetzt schon seit einiger Zeit einige Sachen nicht ganz klar und da frage ich hier lieber noch einmal nach, da ich das auch verstehen will. Ich finde das nämlich alles ziemlich interessant. Da es hier um die Ablage auf dem Stack, aber auch Reverse Engineering geht, bin ich nicht ganz sicher, ob ich hier im Forum in dem Bereich richtig bin aber sonst bitte verschieben.

Es geht um ein Beispiel, bei dem ich irgendwie nicht ganz mitkomme und auf einmal auch ein paar Sachen nicht mehr ganz verstehe. Das Beispiel ist mit Radare2 gemacht worden und es geht eigentlich nur um ein Beispiel mit einer main Funktion und einer Funktion func. In der main Funktion wird nur die Funktion func aufgerufen und in der func Funktion wird etwas ausgegeben, etwas mit gets eingelesen und das eingegebene wieder ausgegeben.
Bild 1 zeigt die disassemblierte func Funktion, wo zudem auch noch drei Breakpoints mit radare gesetzt wurden.
Bild2 zeigt alles, was nach der Speicheradresse, die im Register rdi liegt auf dem Stack liegt und weiter unten ist die disassemblierte main Funktion. Testweise wurden da mal 200 A's mit gets eingelesen, nur damit ihr euch nicht wundert.
Das Ziel ist es, eine Funktion aufzurufen, die nicht im Quellcode selbst aufgerufen wird aber dennoch da ist.

Meine Fragen dazu:
1) Das Beispiel ist auf Linux. Ist der Stack (oder der gesamte RAM) da standardmäßig oder allgemein - auch nicht Linux Betriebssysteme - die Byte-Reihenfolge Little Endian?
2) Das ist doch richtig, dass das keine physischen Adressen sind, die jeweils immer angegeben werden, also alles nur virtuelle Adressen?
3) Es geht ja auch darum, den RIP (Return Instruction Pointer) zu manipulieren, der ja auch auf dem Stack liegt. Der scheint ja im Stack an der rot markierten Stelle zu sein. Wie kommt man da aber auf die hexadezimale Angabe? Das soll ja wohl Little Endian sein aber wie kommt man von 0x00400725 auf die im Kasten stehenden 8 Byte? Radare lässt auch übrigens wohl führende Nullen weg, da das ganze auf einem 64 Bit Prozessor läuft.

EDIT: Das mit 3) hat sich erledigt. Irgendwie hatte ich mich da total verlesen. Passt ja doch. Zunge raus
 
Auf diesen Beitrag antworten »
as_string

Zu 1: ob little oder big Endian hängt von der Prozessorarchitektur ab, nicht von Betriebssystem. Linux gibt es sowohl für Little Endian Architekturen, wie auch Bug Endian.
Zu 2: wenn es ein normales Programm ist, sind es virtuelle Adressen. Bei Kernel-Code weiß ich es nicht so genau.

Gruß
Marco
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »