Stack Pointer Manipulation (IA-32)

Hallo Community!

Ich spiele mich gerade etwas mit Assembler und wollte fragen welche Opcodes ihr kennt, die den Stack Pointer verändern.

Der Anfang ist ja noch leicht:
PUSH
POP
CALL
RET

Nun suche ich alle restlichen Opcodes die noch den Stack Pointer manipulieren.
In der "Instruction Set Reference" von Intel sind die Opcodes leider nur alphabetisch sortiert und erst beim lesen des Pseudocodes ist es möglich zu erkennen, ob die Funktion den Stack Pointer ändert oder nicht.
Dies würde für alle Opcodes aber etwas länger dauern. :/
Daher wäre ich sehr erfreut wenn ihr bitte alle Opcodes postet, von dennen ihr wisst, dass sie den Stack Pointer verändern.
Falls jemand einen Link zu dem Thema hat, wär das natürlich auch hilfreich.

Danke im Voraus
Inliferty
 
Du meinst schon die "Instruktionsart", ne?
Weil von den genannten Instruktionen gibt es mehrer Kodierungen, ergo mehrere Opcodes. Also "PUSH %REG", "PUSH DWORD PTR" usw.
Ein sehr gutes Beispiel ist auch (PUSH FS) für den es eine völlig unabhängige TwoByte Opcode Kodierung gibt ohne MOD R/M, die sich ganz von den anderen PUSHs unterscheidet.

Du meinst auch Instruktionen, die unabhängig von einer möglichen Einkodierung vom ESP in das MOD R/M Bytes den Stack Pointer, verändern, richtig?

Zum einen wären da alle privilegierten Instruktionen, gesetzt dem Falle, dass wir unser Thread im usermode läuft. (INT %d, HLT,..)
Alle Operationen, die Exceptions verursachen (Division by Zero, Access Violations)

Dann fallen mir noch ein:
PUSHFD
PUSHAD
POPFD
POPAD
ENTER
LEAVE

Privilegiert::
IRET
RETF (Far Return)
CALL FAR
SYSENTER
SYSEXIT
 
Äh ja Instruktionsart trifft es wohl besser.
Das es dann mehrere Varianten gibt (PUSH EAX, PUSH EBX, ...) ist mir dann schon klar. :)

Du meinst auch Instruktionen, die unabhängig von einer möglichen Einkodierung vom ESP in das MOD R/M Bytes den Stack Pointer, verändern, richtig?
:frage:
Mir ist zwar klar was MOD R/M ist, aber seit wann kann man damit den Stack Pointer verändern. Soweit mir bekannt ist kann ich dadurch doch nur ein Offset addieren und diese Addresse dann auslesen.

In der Nacht ist mir noch eine triviale Möglichkeit eingefallen den Stack Pointer zu ändern:
MOV ESP, 0xDEADBEEF

MfG
Inliferty
 
ESP lässt sich über die genannten Instruktionen hinaus genauso manipulieren, wie jedes andere Register auch.
Vielleicht verwechselst du den Stack Pointer gerade mit dem Instruction Pointer? (Da geht das nämlich nicht)

Genau DAS meine ich damit -> "MOV ESP, 0xDEADBEEF"

Dort ist ESP in das MOD R/M Byte einkodiert.
Genauso gehen auch alle anderen arithmetischen Operationen. (ADD/SUB... ESP, %REG/%CONST/%PTR)
 
Zurück
Oben