Speicherlayout: globaler Puffer und Pufferüberlauf?

Mupfel

Mitglied
Hallo zusammen,

wenn man eine globale Puffervariable hat und einen Bufferoverflow erzeugt, kann man dann Programmcode überschreiben? Wie sieht es bei Stack-allokierten lokalen Variablen oder per malloc() auf dem Heap aus? Ich denke ja, dass es nur bei dem Ersten geht.
Deswegen hier mal ein Beispiel, von dem ich glaube, dass das geht:
C:
#include <stdio.h>

char buffer[256];

int main(void) {
  scanf("%s", buffer); // keine Größenbegrenzung
  printf("%s", buffer);
}

Bei mehr als 255 Zeichen Eingabe rechne ich mit Problemen.

Es grüßt
Andreas
 
Ich hatte inzwischen eine Idee, wie ich das ausprobieren kann. Bei meinem openSUSE Tumbleweed passiert nicht viel. Entweder, der Text wird ausgegeben oder es gibt eine Speicherschutzverletzung. Bei 3*1024+512+256+128+4+2+1 mal dem Buchstaben "x" war die genaue Grenze, Das gab noch den Text aus. (Plus dem Header "ELF", welcher am Anfang des vermeintlichen Exploits steht.) Einer mehr, und es gab eine Schutzverletzung.

Zum genauen Vorgehen: Ich habe die oben genannte Zahl an "x" in eine Datei "slide" geschrieben, eine andere Datei mit
C:
#include <stdio.h>

int main(void) {
  for (int i = 0; i < 100; i++) {
    printf("%d bottles of applejuice on the wall...\n", i);
  }
  return 0;
}
befüllt und als "exploit" kompiliert, mit cat slide exploit | ./mytest ausgeführt und das Ergebnis begutachtet.

Ging so etwas früher mal? Zu 486er-Zeiten, oder so? Irgendwoher muss ja die Geschichte kommen, dass man beliebigen Code auf Rechnern ausführen kann, wenn diese verwundbar sind.

Ich experimentiere jetzt noch mit lokalen Variablen und malloc(). Wenn ich was interessantes dabei bemerke, melde ich mich nochmal.
 
Zurück
Oben Unten