Speicherreservierung bei Array
-
Hallo!
Ich habe eben mal probeweise ein Programm geschrieben, welches eigentlich einen Pufferüberlauf erzeugen sollte:
#include <cstdio> #include <cstring> int main() { const char *str = "0123456789012"; char buf[10]; strcpy(buf,str); printf("Buffer Overflow: %s\n",buf); return 0; }
Leider kommt "Speicherschutzverletzung (core dumped)" erst, wenn ich das Char-Array str extrem vergrößer. Habe dazu leider keine Angaben gefunden, aber da die Zeichenkette immerhin ausgegeben wird, gehe ich mal davon aus das der Compiler buf größer gemacht hat, als es vorgesehen ist. Habe dazu leider nichts gefunden bei google.
Getestet habe ich das mit dem g++. Kumpel hat es mit gcc und einem Visual-C++-Compiler (Version weiß ich leider nicht) gemacht und alle das gleiche Ergebnis. Mich würde mal interessieren wie die Compiler bei der Größe für Arrays vorgehen, werde aus dem Assemblercode des g++ leider nit schlauer.Gruß & Danke im Voraus
Vellas
-
Das array ist so groß wie angegeben. Allgemein überprüfbar mit sizeof(array)/sizeof(array[0]).
Zu deiner Frage -> http://de.wikipedia.org/wiki/Segmentation_Fault
-
Stimmt, gar nicht dran gedacht, dass man es merken würde mit dieser sizeof-Berechnung, wenn die Größe anders wäre. Danke!
-
Hi!
Habe dazu nochmal eine Frage. In einem anderen Forum schrieb jemand dies:
gcc fügt per Default noch Leerräaume auf dem Stack ein, um eine Ausrichtung der Daten auf dem Stack auf 16-Byte-Grenzen zu erreichen.
-mpreferred-stack-boundary=2 besagt, dass die Daten auf dem Stack nur auf 4-Byte-Grenzen
ausgerichtet werden sollen und verhindert somit das Einfügen zusätzlicher Leerräume.Demzufolge wäre doch ein gewisser Bereich hinter dem eigentlichen Ende des Arrays überschreibbar. Allerdings verstehe ich dann nicht wieso sizeof dann trotzdem anzeigt das es nur die von mir beim Array angegebene Größe hat. Ich glaube ich habe irgendwo einen Denkfehler, wäre für eine Antwort sehr Dankbar.
Thx im voraus.
EDIT:
Ich glaube ich habe die Antwort gefunden (letzter Beitrag):
http://www.buha.info/board/showthread.php?t=24720
-
Wenn du über Grenzen eines Arrays schreibst, erzeugst du undefined behaviour. Sprich es kann alles mögliche passieren. zB könntest du einfach gültigen Speicher überschreiben, dann erzeugst du auch keinen Segfault, sondern veränderst nur Daten. Das ist ja auch das Prinzip hinter so einem Exploit, dass man den Returnaddresse einer Funktion überschreibt, die ja zu dem gültigen Speicher des Programmes gehört.
-
Vellas schrieb:
Demzufolge wäre doch ein gewisser Bereich hinter dem eigentlichen Ende des Arrays überschreibbar. Allerdings verstehe ich dann nicht wieso sizeof dann trotzdem anzeigt das es nur die von mir beim Array angegebene Größe hat.
Weil evtl. vom Compiler eingefügte Leerräume C++, und somit auch sizeof, nicht interessieren. Es zählt nur die Deklaration.