Rücksprungadresse überschreiben
-
Ist es möglich/wahrscheinlich/kommt es vor, dass man durch überschreiben oder löschen eines Speicherbereichs, der einem nicht gehört, anderen Code so überschreibt, dass Rücksprungadressen von Funktionen überschrieben werden? In ganz normalem Code, also ohne Hacker etc. am Werk.
Hintergrund:
Bei uns klappt das zusammenspiel zweier DLLs (zweier verschiedener Firmen) nicht. Wir sind inzwischen so weit, dass wir durch log-Ausgabe etc. festellen, dass der Absturz sicher in der DLL B (der anderen Firma) erfolgt. Nun haben die aber im Zuge der Fehlersuche schon öfter mal behauptet, wir würden Ihnen bestimmt Rücksprungadressen überschreiben, weswegen Ihre Funktionen dann bei Aufrufen abstürzen, mit der Begründung, dass Ihre DLL ja ganz simpel ist und unser Zeug komlexer (wohlgemerkt, es geht nicht darum, dass wir Ihnen Daten und/oder Objekte überschreiben, sondern den Stack!).
Wie wahrscheinlich/realistisch ist sowas?
-
kartoffelsack schrieb:
Ist es möglich/wahrscheinlich/kommt es vor, dass man durch überschreiben oder löschen eines Speicherbereichs, der einem nicht gehört, anderen Code so überschreibt, dass Rücksprungadressen von Funktionen überschrieben werden? In ganz normalem Code, also ohne Hacker etc. am Werk.
Durch Überschreiben ja, durch Löschen nein. Bekanntlich liegen Rücksprungadressen auf dem Stack. Automatische Variablen auch. Wenn du also z.B. so ein Szenario hast:
void foo() { char s[10]; gets(s); }
und jemand gibt mehr als 9 Zeichen ein, könntest du schon bei der Rücksprungadresse sein. OK vielleicht auch noch nicht, weil da noch anderer Kram und ein wenig Padding eingeschoben ist, aber prinzipiell kommt sie dann irgendwann. Ob man aus Versehen (DAU) oder mit Absicht (Hacker) mehr als erlaubt eingibt, spielt dafür natürlich keine Rolle.
-
das würde dann aber heißen, dass eine Funktion praktisch immer zuerst ihre eigene Rücksprungadresse überschreibt, und dann beim Verlassen derselbigen Abstürzt, und nicht, dass es noch ein paar Sachen macht und dann 10 Funktionen weiter drüber abkackt (ich weiß, das verhalten ist undefiniert, aber womit ist zu rechnen?).
Wie ist es, wenn man was auf dem Heap kaputt macht. Ist es da wahrscheinlich, dass dabei Rücksprungadressen überschrieben werden können?
-
kann auch sein dass irgendein pointer falschen inhalt hat was auf dem stack überbügelt...
-
solches überschreiben müsstest du aber mit dem debugger rausfinden können, indem du die "kritieschen" sacehn beobachtest. kritisch sind wie bashar gesagt hat, fixe arrays, bei denen über die grenze geschrieben wird. btw: der speicherbereich gehört dir schon
-
beobachte doch mit einem Debugger den Stack, während die Funktionen aufgerufen werden, merk dir die Rücksprungadresse am Anfang der Funktion und schau dir an, was am Ende da steht.
Und auch über den Heap kann man scheiße bauen http://www.w00w00.org/files/articles/heaptut.txt
-
Könnte es vieleicht sein, dass DLL A eine andere Art hat mit Exceptions umzugehen? Das gleiche Problem gibt es bei der Rückgabe von nicht buildin Types. Unterschiedliche Optimirungen können auch noch eine Rolle spielen.