Siehe Thomas Pornin (+1) und Flouders (+1) Antworten, sie sind gut. Ich möchte eine ergänzende Antwort hinzufügen, auf die angespielt, aber nicht ausdrücklich hingewiesen wurde.
Obwohl das „where“ der ursprünglichen Frage (mindestens so formuliert) erscheint auf der falschen Annahme zu basieren, die% eax auf dem Stapel befindet, und wobei ein Register, ist es nicht Teil des Stapels auf x86
(obwohl Sie jede Hardware-Register-Set auf einem Stapel emulieren können, und einige Architekturen tun dies tatsächlich, aber das ist nicht relevant), übrigens, Register werden häufig aus dem Stapel verschüttet/gefüllt. Es ist also möglich, den Wert eines Registers mit einem Stapelüberlauf zu zerschlagen, wenn das Register auf den Stapel verschüttet wurde. Dies würde erfordern, dass Sie den Verschüttungsmechanismus des jeweiligen Compilers kennen, und für diesen Funktionsaufruf müssten Sie wissen, dass% eax verschüttet wurde, wohin es verschüttet wurde, und diesen Stapelspeicherort stampfen, und wenn es der nächste ist gefüllt von seiner Speicherkopie erhält es den neuen Wert. So unwahrscheinlich es auch scheint, diese Angriffe werden normalerweise durch das Lesen von Quellcode und das Wissen über den betreffenden Compiler inspiriert, so dass es nicht wirklich so weit hergeholt ist.
Siehe für weitere Lesung zu registrieren diese
gcc argument register spilling on x86-64
https://software.intel.com/en-us/articles/dont-spill-that-register-ensuring-optimal-performance-from-intrinsics
Dies hängt von der Aufrufkonvention in Gebrauch zu verschütten, und möglicherweise auf die Optimierungsentscheidungen des Compilers. – Mark
Ein besserer Titel für Ihre Frage könnte sein "Ist es möglich, ein Register mit einem Pufferüberlauf zu überschreiben?" weil, wie gesagt, es eine falsche Prämisse voraussetzt, streng (obwohl zufällig zufällig in mindestens einem Zusammenhang wahr ist) – codenheim
Sie haben Recht, ich änderte es. – LonelyWebCrawler