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.