Kleines sinnloses Programm welches den Speicher überschreibt



  • Hatte heute in unserem IT Unterricht langeweile und folgendes kleines Programm
    entwickelt, naja was heißt entwickelt, geschrieben war es ja sofort, die Idee
    hatte ich schon länger.

    #include <stdlib.h>
    
    int main (void) {
    
      char *p;
      p = (char *) malloc (sizeof(char)*1);
      while (*(p--) = '\0');
      return 0;
    }
    

    Sinn soll sein, ab der Adresse die ich von malloc erhalte soll der Speicher
    überschrieben werden und zwar nach unten weg.
    Ich gehe davon aus, dass die Maschienencodes der Programme ja im unteren Teil
    des Speichers liegen, ist dies richtig?
    Ich weiß man kann nicht fest davon ausgehen wie nen OS den Speicher handhabt,
    aber durch meine Methode muss der PC früher oder später ja abstürzen, es sei
    denn und das ist meine Frage: Wenn die CPU im Protected Mode läuft, ist dann
    ein Teil des Speichers geschützt?
    Ich meine mal etwas in diese Richtung gehört zu haben.

    Und wenn ich ein Programm schreiben wollte, welches die Festplatte überschreibt,
    wie kann ich das anstellen?
    Also ich würde gerne beim ersten Sektor anfangen und alles unbeachtet der
    Dateigrenzen überschreiben, wenn ich einfach eine Datei öffne so kann ich ja
    nicht über ihr Ende hinweg in die nächsten Dateien hineinschreiben, wie kann
    ich das machen?

    P.S. Ich bin mir durchaus bewusst, dass durch mein erstes Programm das OS abschießen
    kann wenn ich es im falschen Moment abstürzen lasse. Und ich will das wirklich(!)
    nur aus reinem Interresse machen.
    Testen werd ich es eh nie können, und an fremden PCs schon gar nicht.



  • du brauchst da noch virtualprotect() unter win !! der speicher ist doch zum teil schreib geschützt bub!



  • Dein Programm ist harmlos, hat nichtmal undefiniertes Verhalten. Der Rest der Frage ist hier offtopic :p



  • Wieso hat es denn kein undefiniertes Verhalten. Wie ist denn festgelegt, was passiert wenn ich Speicherbereiche dereferenziere, die nicht angelegt wurden?



  • Das wäre in der Tat fatal, wenn das Programm sowas tun würde.



  • Normalerweise ist dein Betribsystem dafür verantwortlich das du den Speicher nicht Überschreiben kannst. Wen du dies probierst müstest du eibrntlich eine Fehlermeldung bekommen. Unter Linux weiß ich das wenn ein solcher fall auftretet, das der Kernel ein sogenantes Signal(in dem Fall das Signal SIGSEGV für einen unerlaubten Zugriff auf einer Speicheradresse) an das Programm schickt. Dieses Signal bewirkt ein sofortiges Anhalten des Programms, und dan wird es standartmäßig beendet.
    Allerdings kann man unter Linux das Signal abfangen oder auch Blocken. Wen das unter Windows geht, sollte es auch dort Funktionieren. Ausprobieren würde ich das nicht. Auf jedenfall sollte mindestens Fehlerhaft das BS. weiterlaufen wenn es nicht gleich abstürzt. Und wen du pech hast kann es dazufüren das irgend welch wichtigen Datein überschrieben werden und dan das Bs. dan nicht mehr zu benutzen ist. Lass am besten deine Finger von solchen sachen.



  • Nen Klassenkamerad hatte das Programm auf seinem PC gestartet, trotz meiner
    Warnungen auf evt. Gefahren.
    OS hat sich aufgehängt und bringt jetzt nen Fehler beim booten.
    Also tut es doch genau was ich mir dachte, es überschreibt den Speicher und wenn
    es dumm läuft erwischt es Daten die das OS braucht.

    Und ich schreibe ja in nicht von mir angelegte Speicherbereiche da ich ja nur
    ein einziges Byte allokiere und dieses nichtmal verwende.

    Wie ich unter Windows wirklich den gesamten Speicher (WinNT, denke 9x ist da eh nicht wirklich abgesichert),
    überschreiben kann würd mich interressieren.
    *Ab ins win-forum mit mir* 🙂

    Das mit der Festplatte würd mich immer noch interressieren.

    Und ich lass die Finger schon vom ausführen, das würd ich nichtmal vor ner
    Neuinstallation testen, maximal auf nem alten PC.



  • wieder ein grund mehr bei Linux zu bleiben.



  • Das muss dann aber ein anderes Programm als das in deinem Posting sein.



  • Bashar schrieb:

    Das muss dann aber ein anderes Programm als das in deinem Posting sein.

    Ne und ich bezweifle, dass es rein zufällig während dem Ausführen meines Programmes
    nen Fehler von nem anderen gab welcher so verheerend war, dass nix mehr ging.

    Meines hätte im Normalfall wohl mit nem Fehler auf ungültigen Speicherzugriff
    abgebrochen, wenn ich euch richtig verstehe oder?



  • Nein, deins würde die while-Schleife überhaupt nicht erst anfangen. Die erste Zuweisung würde noch den gerade allozierten Speicher, auf den p zeigt, betreffen, das Ergebnis ist 0, also false, die Schleife bricht ab.



  • Wieso 0?Weil ich in geschützten Speicher schreibe?



  • Er hat recht. das müsste so aussehen

    while(1)
    	*(p--) = '\0';
    


  • Und weshalb?
    Ich habe da doch nen Ausdruck drin, welcher so lange true liefert wie er erfolgreich
    durchgeführt wird.
    Bei deinem würde das Programm noch weiter laufen selbst wenn es in einen Bereich
    kommt der keine gültige Adresse mehr darstellt und wenn es soweit ist kann es
    sich auch beenden 😃



  • SirLant schrieb:

    Ich habe da doch nen Ausdruck drin, welcher so lange true liefert wie er erfolgreich
    durchgeführt wird.

    Nö, du hast da nen Ausdruck stehen, der immer 0 ist, da Zuweisungen ihre rechte Seite zurückgeben (sonst könnte man die nicht verketten wie in a = b = c = 42; ). Und 0 ist eben false. Sowas wie erfolgreiche Durchführung von Ausdrücken gibts nicht, entweder er ist erfolgreich, oder das Verhalten ist undefiniert.
    Mich wundert ehrlich gesagt, wie du mit dem Programm den Rechner deines Klassenkameraden abgeschossen haben willst 😃



  • Abgesehen dafon was iteressirt dich das ob das Programm weiterläuft oder nicht wen es sowet gekommen ist, sind selbst die wichtigsten stellen des Betribsystems aus dem Arbeitsspeicher wech. Und dann hast du dein Ziel doch schon erreicht und neustarten muss der user sowieso.



  • Was erzählt ihr eigentlich für eine gequirlte Scheiße? Vielleicht kann man so ja unter DOS oder Win95 den Rechner zum Absturz bringen, aber ich glaube kaum das diese unter Windows NT/2k/XP möglich sein kann. Sagt euch das Stichwort virtueller Speicher etwas? Nein? Macht auch nix.



  • Hallo,
    wer Bashars Ausführungen bisher nicht verstanden hat, dem hilft vielleicht folgendes Programm auf die Sprünge:

    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    int main()
    {
            char* p = malloc(1);
            char* q = p;
            while( *(p--) = '\0')
                    printf("In der Schleife!\n");
            assert(p == q-1);
            return 0;
    }
    

    Es wird ganz genau keinmal "In der Schleife!" ausgegeben. Zuerst wird die Zuweisung ausgeführt -> *p = '\0'.
    Dann wird die Zuweisung als boolescher Ausdruck für die Schleifenbedingung ausgewertet -> *p = '\0' = 0 = false. Die Schleifenbedingung ist also false und damit wird die Schleife nicht ausgeführt. Der Ausdruck ist aber noch nicht ganz zu Ende. Das postfix-decremennt wird auch noch ausgeführt. Das Ergebnis hat aber keinen Einfluss auf das Ergebnis der Zuweisung und damit keinen Einfluss auf die Schleifenbedingung.

    Das der Seiteneffekt tatsächlich stattfindet beweist das letzte assert.



  • @tobidope ist mir klar ich habs ja schon weiter oben erwahnt das ich mir das schlecht vorstellen kan. Ich kommentiere das gesagte. Und warum gehst du davon aus das wir hier von Win2000/xp ... reden.



  • Stimmt das mit dem Rückgabewert hab ich nicht bedacht, dachte der Ausdruck als
    solcher wird auf erfolg oder fehlschlag geprüft und dies verwendet.
    In Java ist das so, daher wohl der Irrtum.

    Dann war das mit dem PC wohl purer Zufall.


Anmelden zum Antworten