Frage wegen sicherem programmieren (Buffer-Overflows) ...



  • Hallo,

    es wird gesagt das

    void func(char *str)
    {
        char buffer[256];
    
        strcpy(buffer, str);
    
        return;
    }
    

    falsch ist, während das hier

    void func(char *str)
    {
        char buffer[256];
    
        strncpy(buffer, str, sizeof(buffer) -1);
        buffer[sizeof(buffer) – 1] = 0;
    
        return;
    }
    

    richtig ist. Kann man das alles nicht gleich umgehen, indem man char buffer[255]; statt 256 schreibt ? Oder brauch man unbedingt ein "Speicherplatz" für die terminierende NULL (\0) ???

    Danke für jede kleine Erläuterung ...

    Poster Boy



  • Ein String ("") endet nun mal auf \0, wenn das nicht so ist,
    kann man dahinter dann weitere Daten anhängen, die dann evtl.
    die \0 vortäuschen, und dahinter weiteren ausführbaren Code anhängen...

    Devil



  • Bei

    strcpy(buffer, str);
    

    ist es möglich den Speicherplatz nach dem von dir reservierten Speicher mit deinen Daten zu überschreiben. Somit ist es möglich ein anderen Rücksprungpunkt anzugeben.
    Dies kann dir mit

    strncpy(buffer, str, sizeof(buffer) -1);
    

    nicht passieren, da hier noch eine maximale anzahl angegeben wird und somit der nachfolgenden Speicher nicht überschrieben wird.



  • Danke, ich denke das reicht mir erstmal....



  • Hallo,

    Nochma ne' Frage, was mach ich nun, wenn der Benutzer ein Text eingeben soll, wobei ich nicht weiß wie lang der sein wird. Wie soll ich die char-Variable anwenden ?

    char* Eingabe;
    
    oder
    
    char Eingabe[MAX_PATH];
    

    Danke
    Poster Boy



  • Hier wäre eigentlich MFC. MFC hat aber (Bill Gates sei gepriesen) CString. CString ist es aber egal wie lang die Zeichenkette ist. Es ist ihm auch egal ob da noch eine NULL steht am Ende oder nicht. Man wird es kaum glauben aber CString lassen sich sogar mit einem = zuweisen. An ein Wunder gränzend ist sogar der Befehl Format aus der Klasse CString. Der kann alles, weiß alles, macht alles...
    So jetzt ist mir leichter



  • Schön, auch wenn das hier ein MFC Board ist und ich von c++ rede, hätte ich gerne eine Antwort auf meine Frage, da man nur CStrings verwenden kann wenn man eine Win32 Anwendung mit MFC erweiterung hat....

    Danke



  • ... es liegt mir fern dir vorschreiben zu wollen was du gerne tun willst. Dennoch: Dies ist ein MFC Forum. 1 Tür weiter gibts ein Win-Api-Forum und noch eine Tür weiter ist das C++ Teil und für jene die gern knietief im Code stehen gibts auch noch ein native C Forum und alles auf einer URL


Anmelden zum Antworten