Werden frische Speicherseiten genullt?



  • Als Antwort auf http://www.c-plusplus.net/forum/p2018056#2018056 (der Thread wurde wegen eines anderen Themas geschlossen):

    So sieht's aus schrieb:

    Christoph schrieb:

    Soweit ich weiß, füllen alle aktuellen Linux- und Windows-Versionen angeforderte Speicherseiten mit 0en, bevor ein Programm sie bekommt.

    Das hättest du auch ruhig mal ausprobieren können, stimmt nämlich nicht:

    #include <stdio.h> 
    
    int main() 
    { 
      int n[10]; 
      char c; 
      for (int i=0; i <= 10; i++) 
      { 
        printf("%i\n", n[i]); 
        // c = (char)n[i]+'0'; 
        c = (char)n[i]; 
        printf("%c\n", c); 
      } 
      return 0; 
    }
    

    Der Haken ist: du forderst hier keine einzige frische Speicherseite vom OS an. Den Speicher, den du durchwühlst, der wurde vielleicht schon von der C-Runtime verwendet bevor main() aufgerufen wurde. malloc() würde auch nichts helfen, denn dabei laufen die Speicherseiten auch schon durch die C-Runtime. Statt frische Seiten vom OS zu bekommen, kannst du bei malloc() auch alte Seiten bekommen, die dein Programm früher mal benutzt hat.

    Mit brk/sbrk kann man unter Linux neue Seiten anfordern. Macht man das, wird man soweit ich weiß nur genullte Seiten erhalten:

    #include <iostream>
    #include <unistd.h>
    
    const int N = 100000;
    
    int main() {
    	int* p = (int*)sbrk(N*sizeof(int));
    	for(int i = 0; i < N; ++i)
    		if(p[i] != 0)
    			std::cout << "Nicht null!\n";
    }
    

    Das Programm gibt bei mir nichts aus.



  • Christoph schrieb:

    Der Haken ist: du forderst hier keine einzige frische Speicherseite vom OS an. Den Speicher, den du durchwühlst, der wurde vielleicht schon von der C-Runtime verwendet bevor main() aufgerufen wurde.

    Der Schwerpunkt liegt hier dann wohl auf dem Wort "vielleicht", das heißt also nicht, daß es unmöglich wäre, unberührten Speicher zu bekommen.
    Und warum sollte die C-Runtime den Speicher überhaupt anfassen?

    malloc() würde auch nichts helfen, denn dabei laufen die Speicherseiten auch schon durch die C-Runtime. Statt frische Seiten vom OS zu bekommen, kannst du bei malloc() auch alte Seiten bekommen, die dein Programm früher mal benutzt hat.

    Du sagst auch hier "kann".
    Wenn man das Programm frisch startet und Speicher einmalig anfordert, dann dürfte man wohl nur frische Seiten bekommen, warum die C-Runtime da > 3 GB ändern sollte, davon ausgehend, daß wir mal so viel anfordern, müßtest du erstmal erklären.

    Mit brk/sbrk kann man unter Linux neue Seiten anfordern. Macht man das, wird man soweit ich weiß nur genullte Seiten erhalten:

    Gut, das ist dann aber eine Linuxspezifische Kernelfunktion die genau dafür geschrieben wurde.



  • PS: Ich find's übrigens schade, daß der alte Thread geschlossen wurde,
    Denn ich hätte noch gerne eine Antwort zu meinem folgenden Posting gehabt:
    http://www.c-plusplus.net/forum/p2018055#2018055

    In dem ich darlege, warum Obscurity schon helfen kann, weil es die Rechenzeit für den Bruteforceangriff erhöht.
    Je mehr RAM der Rechner hat, desto mehr bringt es.



  • Das mit "nachtrag" ist von mir.

    Ich mußte den Nick ändern, weil die Forensoftware jedesmal nach dem abschicken forderte, daß der Titel geändert werden müßte.
    Erst mit dem anderen Nick wurde der Beitrag angenommen.



  • So sieht's aus schrieb:

    Mit brk/sbrk kann man unter Linux neue Seiten anfordern. Macht man das, wird man soweit ich weiß nur genullte Seiten erhalten:

    Gut, das ist dann aber eine Linuxspezifische Kernelfunktion die genau dafür geschrieben wurde.

    brk und sbrk gibts auch auf allen mir bekannten BSDs. Ohne das näher überprüft zu haben, nehme ich daher einfach mal an, dass das in Posix oder der SUS oder so standardisiert sein könnte.


  • Administrator

    So sieht's aus schrieb:

    Und warum sollte die C-Runtime den Speicher überhaupt anfassen?

    Du hast hier nur Stackspeicher angeschaut. Der Einstiegspunkt ist meistens tatsächlich nicht bei der von dir definierten main-Funktion, sondern in der C-Runtime selbst. Diese ruft dann verschiedene Funktionen zuvor auf, um gewisse Dinge zu initialisieren. Dabei ist es natürlich möglich, dass sie den Stackspeicher, welchen du hier verwendest, bereits selbst verwendet hat.

    So sieht's aus schrieb:

    Wenn man das Programm frisch startet und Speicher einmalig anfordert, dann dürfte man wohl nur frische Seiten bekommen, warum die C-Runtime da > 3 GB ändern sollte, davon ausgehend, daß wir mal so viel anfordern, müßtest du erstmal erklären.

    Dir scheint eindeutig nicht klar zu sein, dass der tatsächliche Einstiegspunkt in das Programm nicht deine main darstellt 😉

    @nman,
    Es war mal in POSIX drin, wurde aber inzwischen rausgenommen:
    http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html#tag_13_80
    (ziemlich weit unten unter Issue 6, am besten die Dokumentsuche des Browsers nehmen)

    Zu Windows sei VirtualAlloc erwähnt. Damit holt sich ein Prozess Speicherseiten.

    Reserves or commits a region of pages in the virtual address space of the calling process. Memory allocated by this function is automatically initialized to zero, ...

    Grüssli



  • So sieht's aus schrieb:

    Wenn man das Programm frisch startet und Speicher einmalig anfordert, dann dürfte man wohl nur frische Seiten bekommen

    Du bekommst immer entweder frische Seiten oder deine eigenen.

    Ergo: was genau willst du auslesen? Deine eigenen Daten? Ja, das könnte natürlich sein dass du diese wieder zurück bekommst. Aber fremde Daten nicht.



  • Shade Of Mine schrieb:

    So sieht's aus schrieb:

    Wenn man das Programm frisch startet und Speicher einmalig anfordert, dann dürfte man wohl nur frische Seiten bekommen

    Du bekommst immer entweder frische Seiten oder deine eigenen.

    Ergo: was genau willst du auslesen? Deine eigenen Daten? Ja, das könnte natürlich sein dass du diese wieder zurück bekommst. Aber fremde Daten nicht.

    ist das iwo definiert oder hast dir das gerade ausgedacht?



  • @Shade:
    Source pls.

    Weil hier scheint nur jemand eine Ahnung zu haben und keine Quellen nachweisen zu können.
    Dravere ist ein Vorzeigebeispiel, was Quellen anbelangt.



  • Dravere schrieb:

    Es war mal in POSIX drin, wurde aber inzwischen rausgenommen:
    http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html#tag_13_80

    Ah, danke. War zu bequem, das selbst nachzuschlagen.

    Jedenfalls ist es nicht Linux-spezifisch, wie von "So sieht's aus" vermutet. Auch wenn es nicht mehr Posix-standardisiert ist, werden das vmtl. alle Unices in den nächsten Jahrzehnten unterstützen (müssen).



  • Shade Of Mine schrieb:

    Du bekommst immer entweder frische Seiten oder deine eigenen.

    Das ist eine Vermutung (im ursprünglichen Thread ging es nicht um irgend ein konkretes OS) und keine Garantie. Selbst die SUS garantiert dies nicht.



  • Dravere schrieb:

    @nman,
    Es war mal in POSIX drin, wurde aber inzwischen rausgenommen:
    http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html#tag_13_80
    (ziemlich weit unten unter Issue 6, am besten die Dokumentsuche des Browsers nehmen)

    Ein Blick in die SUSV2 zeigt, daß sbrk den Speicher nullen muß, falls er einem Prozeß neu zugeteilt wird, aber das ist nur noch historisch. Zudem ist nicht garantiert, daß Speicher vom Kernel durch sbrk zur Verfügung gestellt wird.

    In SUSV2, SUSV3 und SUSV4 wird jedenfalls nicht garantiert, daß der Speicher bei malloc Anforderungen genullt wird. Das OS kann dies tun, aber es kann es auch einfach sein lassen, und wäre damit immer noch konform.



  • Linux, BSD und Windows nullen.
    Siehe Dokumentation zu sbrk und VirtualAlloc.

    Sourcen wurden also schon genannt. Natürlich muss es bei einem anderen System nicht so sein...



  • Shade Of Mine schrieb:

    Linux, BSD und Windows nullen.
    Siehe Dokumentation zu sbrk und VirtualAlloc.

    Sourcen wurden also schon genannt. Natürlich muss es bei einem anderen System nicht so sein...

    Auch wenn ich mit malloc den Speicher anfordere?



  • frage herr lehrer schrieb:

    Shade Of Mine schrieb:

    Linux, BSD und Windows nullen.
    Siehe Dokumentation zu sbrk und VirtualAlloc.

    Sourcen wurden also schon genannt. Natürlich muss es bei einem anderen System nicht so sein...

    Auch wenn ich mit malloc den Speicher anfordere?

    ➡

    Christoph schrieb:

    malloc() würde auch nichts helfen, denn dabei laufen die Speicherseiten auch schon durch die C-Runtime. Statt frische Seiten vom OS zu bekommen, kannst du bei malloc() auch alte Seiten bekommen, die dein Programm früher mal benutzt hat.



  • frage herr lehrer schrieb:

    Auch wenn ich mit malloc den Speicher anfordere?

    Was macht denn malloc? Da steckt ja keine Magie oder so dahinter. malloc kann auch nur irgendwann die Kernel Funktionen aufrufen. zB ruft malloc alloc auf, alloc ruft xallac auf und xalloc ruft foolloc auf und foolloc ruft VirtualAlloc auf. Natürlich kann dann in den Seiten was drinnen stehen - sie sind ja durch viele Hände gegangen. Aber irgendwann wurde diese Seite von VirtualAlloc bereitgestellt und dort wurde sie genullt. dh alles was an Datenschrott da drinnen steht, hat malloc, alloc, xalloc oder foolloc dort reingeschrieben. zB weil eben aus Performance Gründen die Seiten in Blöcken allokiert werden.


Anmelden zum Antworten