Stack im assembler
-
Hallo, habe folgendes main :
int main() { DWORD i,j; __asm { PUSH 0xFFFFFFFF MOV i, ESP MOV j, EBP } cout << hex; cout << "main : " << &main << endl; cout << "ESP : " << i << endl; cout << "EBP : " << j << endl; while (1) { _getch(); __asm PUSH 1 } _getch(); return 0; }
main im assembler :
PUSH EBP MOV EBP,ESP SUB ESP,0C PUSH ESI PUSH -1 MOV DWORD PTR SS:[EBP-4],ESP MOV DWORD PTR SS:[EBP-8],EBP MOV ECX,DWORD PTR DS:[40305C] PUSH 4012A0 CALL DWORD PTR DS:[40303C] MOV ECX,DWORD PTR DS:[40305C] MOV EDX,4031BC PUSH 401A40 PUSH 4012C0 CALL 00000C00 MOV ECX,EAX CALL DWORD PTR DS:[403034] MOV ECX,EAX CALL DWORD PTR DS:[403064] MOV ECX,DWORD PTR DS:[40305C] MOV EDX,4031C4 PUSH 401A40 PUSH DWORD PTR SS:[EBP-4] CALL 00000C00 MOV ECX,EAX CALL DWORD PTR DS:[403038] MOV ECX,EAX CALL DWORD PTR DS:[403064] MOV ECX,DWORD PTR DS:[40305C] MOV EDX,4031CC PUSH 401A40 PUSH DWORD PTR SS:[EBP-8] CALL 00000C00 MOV ECX,EAX CALL DWORD PTR DS:[403038] MOV ECX,EAX CALL DWORD PTR DS:[403064] MOV ESI,DWORD PTR DS:[4030E0] CALL ESI PUSH 1 JMP SHORT 00000760
Hier der stack :
FF FF FF FF ;mein push ff ff ff ff 01 00 00 00 ;was ist das ? vielleicht von while(1)? 79 CC 67 67 ;und das ? bleibt bei jedem compilen gleich F0 F8 3E 00 ;ESP DC F8 3E 00 ;EBP
Kann man eigentlich einen komplett leeren stack haben ? Habe es nämlich auch ab und an das auf dem stack ganz viele 0xCC's liegen! wodurch kommt das ? und wie kommt der obige stack zustande? Außerdem frage ich mich wo der instruction pointer ist, soll der nicht auch auf dem stack sein?
Man kommt an den EIP auch nicht ran oder ?
MOV i, EIP ;error
Und was ist die return addresse (rückgabe addresse)? Müsste die nicht auch auf dem stack liegen?
Danke & viele grüße
-
Ceno schrieb:
Kann man eigentlich einen komplett leeren stack haben ?
Nur in der Theorie. Irgendwo ganz am Anfang ist der Stack natürlich leer, aber lange bevor dein "main" aufgerufen wird macht die Runtime ja noch so einiges.
Ceno schrieb:
Habe es nämlich auch ab und an das auf dem stack ganz viele 0xCC's liegen! wodurch kommt das ?
Aber nur im Debugmodus.
Das ist (zumindest bei VC) das Zeichen "hier ist nichts". Da wird regelmäßig geprüft ob du 1) uninitialisierte Variablen genutzt und 2) ob du du den Stack überschrieben hast, z.B. über Arraybounds.Ceno schrieb:
und wie kommt der obige stack zustande? Außerdem frage ich mich wo der Instruction pointer ist, soll der nicht auch auf dem stack sein?
Warum sollte der Instruktionpointer auf dem Stack sein ? Der gibt an wo du gerade bist, das ist ein Register. Der wird nur als Rücksprungaddresse auf den Stack gepusht.
FF FF FF FF 01 00 00 00 ;wohl eher dein "push 1" 79 CC 67 67 ;Security cookie vielleicht ? Damit Stackoverflows verhindert werden können F0 F8 3E 00 DC F8 3E 00
Du solltest
- Dazusagen wo du das Stackabbild gemacht hast und
- Den Stack nicht zerschießen mit deinem "push" wenn du schon verstehen willst wie es geht.
Ceno schrieb:
Man kommt an den EIP auch nicht ran oder ?
Siehe oben
call labelHier labelHier: pop eax ;eax hat nun die Addresse worauf auch EIP gerade zeigt(e)
Braucht man aber eh nie.
Ceno schrieb:
Und was ist die return addresse (rückgabe addresse)? Müsste die nicht auch auf dem stack liegen?
Tut sie doch ?
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Für das Eip kannst du das auch über GetThreadContext machen, da dein Thread immer wissen muss, an welcher Stelle sich der Instruction Pointer gerade befindet.
-
Ceno schrieb:
Habe es nämlich auch ab und an das auf dem stack ganz viele 0xCC's liegen! wodurch kommt das ?
http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_debug_values
Ceno schrieb:
und wie kommt der obige stack zustande?
Step' doch einfach im Debugger durch.
Ceno schrieb:
Außerdem frage ich mich wo der instruction pointer ist, soll der nicht auch auf dem stack sein?
Nö, der aktuelle IP liegt natürlich nicht auf dem Stack. Der IP wird nur auf den Stack gepusht wenn ne Unterfunktion aufgerufen wird ("call").
-
Mr.Long schrieb:
Für das Eip kannst du das auch über GetThreadContext machen, da dein Thread immer wissen muss, an welcher Stelle sich der Instruction Pointer gerade befindet.
Ist auch möglich, aber etwas unpraktisch:
<a href= schrieb:
MSDN - GetThreadContext">You cannot get a valid context for a running thread. Use the SuspendThread function to suspend the thread before calling GetThreadContext.
If you call GetThreadContext for the current thread, the function returns successfully; however, the context returned is not valid.Du willst vermutlich sicherstellen dass der Thread genau in deinem Code stehenbleibt...
-
Danke für die antworten