2012-10-23 8 views
7

Der moderne Compiler GCC ist so mächtig, dass es sogar Pufferüberlauf in der Kompilierungsphase verhindern kann, so dass OS Code auf Stapelspeicher nicht ausführen kann.Die Art des Compilers bei Pufferüberlauf

Zum Beispiel:

void function(char *str) 
{ 
    char buffer[16]; 

    strncpy(buffer, str, 256); 
} 

void main() 
{ 
    char large_string[256]; 
    int i; 

    for(i = 0; i < 256; i++) 
    large_string[i] = 'A'; 

    function(large_string); 
} 

Die einzige Art, wie ich die Magie 0x41414141 bekommen kann, ist GCC einstellen Parameter kompilieren so wie:

gcc -fno-stack-protector -z execstack stackoverflow.c -o stackoverflow 

(Getestet habe ich es auf Ubuntu 10.04 x86 klar 32bits Box)

Gibt es eine Möglichkeit, den GCC-Stack-Umgehungsschutz zu umgehen?

+0

Auf welche Einschränkung beziehen Sie sich, und warum möchten Sie umgehen, was auch immer es ist? –

+0

Sie möchten den Stapel absichtlich beschädigen? Warum? Und dein Code hat einen Bug, übrigens. Sie haben vergessen, 'large_string' zu beenden. Das 'strcpy()' ist nicht auf nur 255 Bytes beschränkt. –

+0

Ich denke, Sie wollen fragen, ob es möglich ist, den GCC-Stack-Schutz zu umgehen, wenn ja, sollten Sie die Frage bearbeiten, um das klarzustellen. – iabdalkader

Antwort

6

Sie sollen den Stapel Schutz deaktivieren beim Kompilieren:

gcc -fno-stack-protector -z execstack stackoverflow.c -o stackoverflow 

Und Sie sollten auch Adressraum Randomisierung (ASLR) deaktivieren:

sudo sh -c 'echo 0 > /proc/sys/kernel/randomize_va_space' 

Jetzt können Sie den Pufferüberlauf versuchen, ich empfehlen Smashing the Stack for Fun and Profit

bearbeiten Lesen:

Wie ich schon sagte in meinem Kommentar, es ist sicher anzunehmen, dass es in Ihrer Zuordnung akzeptabel ist, den Stapel Schutz zu deaktivieren, aber wenn Sie zu Bypass wollen den Stapel Schutz sollten Sie SOF auf Kanarienvögel Zusammenhang für Frage prüfen wie diese Fragen:

Is there any way to bypass SSP (StackSmashing Protection)/Propolice?

+0

Gibt es eine Möglichkeit, dass ich den Stack ohne Parametereinstellung direkt zerschlagen kann? – JustForTest

+0

Ihre Aufgabe erfordert die Ausnutzung eines Pufferüberlaufs. Ich denke, man kann davon ausgehen, dass die Deaktivierung des Stack-Schutzes akzeptabel ist, da das Problem sonst sehr viel komplizierter ist. – iabdalkader

+0

ja, ich denke schon. Nur so neugierig, wenn es einen Weg gibt, einen solch starken Stack-Schutz zu umgehen. Auf der anderen Seite, ist das richtig zu sagen, dass es für einen Code sicher ist, obwohl es ein Stack-Überlaufloch gibt, da der Code im Stack nach der Stack-geschützten Kompilierung nicht ausgeführt werden kann. (Der schlimmste Fall für ein solches Problem ist Programmbeendigung, der Hacker kann Shellcode nicht ausführen) – JustForTest

1

es gibt sicherlich Möglichkeiten, um den Stapel Zerschlagung Schutz (genannt Stapel Kanarienvögel) zu umgehen, obwohl es nicht in Ihrem Beispiel einfach sein wird. Siehe meine Antwort here für einige der Schwächen von Stapelkanarien.

+0

Können Sie ein einfaches praktikables Beispiel für solche Stapelkanarien geben – JustForTest

+0

@JustForTest: Ich fürchte nicht. Die einzige Möglichkeit, den Stack-Kanarienvogel in Ihrem Beispiel zu umgehen, wäre, ihn mit dem gleichen Wert zu überschreiben. Da es keine Speicherleckage-Schwachstelle gibt, ist der einzige Weg dies zu tun, es zu bruten, was wahrscheinlich nicht durchführbar ist ... – Job

Verwandte Themen