[Erledigt] Kein BufferOverflow
-
Hallo community
Ich wurde etwas stutzig als ich folgenden Code compilierte und es beim Ausführen zu keinem Fehler kam:
int main(void) { char str[2]; strcpy(str, "Hallo Welt!"); puts(str); return 0; }
Erwartungsgemäss müsste es hier jetzt eigentlich zu einem BufferOverflow kommen. Auf der Konsole wird aber schön Hallo Welt! angezeigt.
Zum compilieren habe ich den Standart C-Compiler von Visual Studio 2010 ausgeführt. Ich verwendete 32bit Windows Vista mit 4 GB Ram.
Für mich ist derzeit die einzig mögliche Erklärung, dass in diesem Falle mehr speicher als benötigt alloziert wird. Sozusagen eine mindestgrösse des Datensegments.
Freundliche Grüsse
Samuel
Edit: Wieso wie das Wort stand|art zensiert?
-
Bei Ablauf des Debug- oder Releaseprogramms bekommst Du einen entsprechenden Fehler.
Der Compiler erkennt diese Art von Bufferüberlauf bei gesetzter GS-Option nicht, da die Größe des Datums zu klein ist.
Siehe auch
http://msdn.microsoft.com/de-de/library/8dbf701c.aspxIn der Beschreibung findet sich auch der folgende feine Hinweis:
Even if you use /GS, always try to write secure code that has no buffer overruns
Da strcpy nicht sicher ist, verwendet man besser
errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
oder selbstgestrickt
strncpy(str,"Hallo Welt", sizeof(str)-1);
Viel Spaß beim Bauen von Bufferoverruns
-
-
Doltsche schrieb:
Wieso wie das Wort stand|art zensiert?
Weil es hier egal ist, auf welche Art (und Weise) du stehst.
-
Das ist ja das Problem bei Bufferoverflows. Sie müssen nicht zu einem Laufzeitfehler führen. Der Computer sieht, wenn du in Speicher schreibst, den deine Anwendung nicht reserviert hat. Wenn ein Buffer überläuft und dahinter zufällig Speicher ist, der von deinem Programm reserviert ist, dann überschreibt er den einfach und es gibt keine Fehlermeldung. Das Programm wird sich nur anders verhalten. zB: Auf einmal stehen in einem anderen Buffer falsche Werte oder du überschreibst die Rücksprungadresse und die Funktion springt wer weiß wohin. Letzteres wird in Stackoverflowexploits ausgenutzt, um das Programm auf eingefügten Code springen zu lassen.
-
-
Hallo
Besten Dank für eure Antworten.
Das Thema konnte ich somit abschliessen.Gruss Samuel