Funktion mit memcpy überschreiben ?



  • Hoi,

    also ich habe folgenden Code:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    void foo()
    {
            printf("w00t!");
    }
    
    int main(int argc, char *argv[])
    {
            char *w00t = foo;
            char copy[20] = "neuer Code";
    
            memcpy(w00t, copy, 20);
    
    	//foo();
    
    }
    

    Der Code soll einfach die Funktion foo() mit einem anderen Code überschreiben (die Opcodes sind in copy[]). Allerdings gibt es immer einen Segfault. Kann es sein, dass unter Linux die Funktionen geschützt sind und nicht überschrieben werden können?



  • Der Speicher ist geschützt. Mittels man: mprotect(2) kannst du den Schutz jedoch wieder aufheben. Wobei es sehr riskant ist was du da machst und auch nicht von ISO C gedeckt!

    Was willst du erreichen? Vielleicht kann man das ja auch auf einem saubereren Weg schaffen. (zB einfach einen Funktionspointer, den du entsprechend umbiegst).



  • Danke! 😉 Ne, geht wohl nicht anders... Ich will den kompletten Code packen und komprimieren - in der Binary! Und dann im Speicher während der Laufzeit wieder entpacken durch den Code in der main() und die originalen Funktionen herstellen!

    if (mprotect(foo, 20, PROT_WRITE | PROT_READ | PROT_EXEC))
            {
                    printf("Couldn’t mprotect\n");
                    exit(-1);
            }
    
    memcpy(w00t, copy, 20);
    

    Da kommt stets "Couldn’t mprotect\n". kann es sein,d ass mprotect nur für Speicher gilt, der auf dem heap liegt und nicht für das Code Segment?



  • Dein Konzept dürfte ohnehin nicht aufgehen. Da die dekomprimierten Daten natürlich größer sind, als die Originalfunktion und du beim kopieren dann alles mögliche überschreiben wirst.

    Aber natürlich geht es schon anders.

    typedef void (*foo)();
    char buf[] = "";
    foo f = (foo)buf;
    f();
    

    Du musst aber darauf achten, dass der Code sich an die Aufrufkonventionen deines C-Compilers hält. (Und vermutlich muss man auch diverse Sicherheitsmaßnahmen berücksichtigen, wie zB das NX-Bit).



  • Na gut, sagen wir ned packen, dass war falsch vielmehr kodieren. Der Platz reicht dann! 😉 Hab das ganze auch noch mit nop sleds im ASM Code aufgefüllt!

    Das Problem bei Funktionspointer, ist halt dass es nicht mit mehreren Funktionen (die alle verschlüsselt sind) geht. Sonst hätte ich das so gemacht! 😉

    Aber auch mit mprotect geht es ned! Da kommt stets "Couldn’t mprotect\n". kann es sein,d ass mprotect nur für Speicher gilt, der auf dem heap liegt und nicht für das Code Segment?


Anmelden zum Antworten