Deaktivieren Sie den Stapelschutz unter Ubuntu für einen Pufferüberlauf ohne C-Compiler-Flags

10

Ich möchte einige Shell-Codes ausprobieren und den Linux-Schutz deaktivieren.

Ich weiß, dass ich mit Flags kompilieren kann, aber ich weiß, dass es eine andere Möglichkeit gibt, diese Schutzfunktionen im Allgemeinen zu deaktivieren, an die ich mich einfach nicht erinnern kann. Können Sie mir helfen?

Phate
quelle

Antworten:

6

Der Stapelschutz wird vom Compiler durchgeführt (fügen Sie dem Stapel einige zusätzliche Daten hinzu und verstauen Sie einige auf Abruf, überprüfen Sie die Richtigkeit bei der Rückgabe). Kann das nicht deaktivieren, ohne es neu zu kompilieren. Es ist ein Teil des Punktes, wirklich ...

vonbrand
quelle
6
ASLR erfordert, dass das Betriebssystem dies zur Laufzeit ausführt. NX-Bits erfordern auch Systemunterstützung. Welcher Teil kann zur Laufzeit nicht deaktiviert werden?
Jeff Ferland
25

Um das zu erweitern, was vonbrand (richtig, +1) gesagt hat, besteht der Stack-Schutz von Linux aus zwei Teilen.

Kanarienvögel stapeln

Stapelkanarien sind die vom Compiler erzwungene Funktion, auf die sich vonbrand bezieht. Diese können ohne Neukompilierung nicht deaktiviert werden.

Um sich selbst zu beweisen und zu sehen, wie sie funktionieren, verwenden Sie den folgenden Code:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

int mybadfunction(char* a_bad_idea)
{
    char what[100];
    strcpy(what, a_bad_idea);
    printf("You passed %s\n", what);
}

int main(int argc, char** argv)
{
    printf("Tralalalaala\n");
    mybadfunction(argv[1]);
}

Kompilieren Sie nun das ( gcc -fstack-protector -masm=intel -S test.c) zu etwas Gnu, das gerne die Ausgabe zusammenstellen und lesen würde. Der wichtige Punkt ist, dass es beim Verlassen der mybadfunctionFunktion diesen kleinen Code gibt:

    mov edx, DWORD PTR [ebp-12]
    xor edx, DWORD PTR gs:20
    je  .L2
    call    __stack_chk_fail

Wie Sie sich vorstellen können, wird ein Stapel-Cookie daraus entnommen [ebp-12]und mit dem Wert bei verglichen gs:20. Passt nicht zusammen? Es ruft dann eine Funktion __stack_chk_failin glibc auf, die Ihr Programm genau dort beendet.

Es gibt Möglichkeiten, dies beim Schreiben von Exploits zu umgehen, aber die einfache Möglichkeit beim Erstellen eines Shellcode-Testfalls besteht darin, Ihr Programm mit zu kompilieren -fno-stack-protector.

Nicht ausführbare Seiten

Es gibt einige andere Überlegungen zu modernen Linux-Systemen. Wenn Sie den üblichen Shellcode-Teststub verwenden:

char buffer[] = {...};

typedef void (* func)(void);

int main(int argc, char** argv)
{
    func f = (func) buffer;
    f();
    return 0;
}

Modernes GCC / Linux ordnet den .rodataAbschnitt der PE-Datei schreibgeschützt ohne Ausführungsberechtigungen zu. Sie müssen dies deaktivieren . Dies kann mithilfe des Codebeispiels aus diesem Blog-Beitrag erfolgen . Grundidee: Mit dieser Option mprotectfügen Sie den Seiten, auf denen sich die Shellcode-Daten befinden, die gewünschten Berechtigungen hinzu.

Nicht ausführbare Stapel

Wenn Sie ein traditionelles Exploit-Szenario, z. B. meinen fehlerhaften Code oben, mit Ihrem Shellcode testen möchten, müssen Sie auch sicherstellen, dass der Stack für die einfachen Fälle ausführbar ist. Das PE-Dateiformat enthält ein Feld zum Bestimmen, ob der Stapel ausführbar ist. Sie können dies mit execstack abfragen und steuern . Führen Sie aus, um einen ausführbaren Stapel zu aktivieren

execstack -s /path/to/myprog

Dies kann mit beliebigen Programmen durchgeführt werden, ohne dass eine Neukompilierung erforderlich ist, deaktiviert jedoch nicht automatisch Stapelkanarien, da diese beim Kompilieren eingebrannt werden.

Zusätzlicher Bonus: aslr:

Um das auszuschalten , echo 0 > /proc/sys/kernel/randomize_va_space.

Hast du gerade jemandem gesagt, wie er meinen kostbaren Pinguin ausbeuten kann?

Nein. Jeder Exploit muss Stapelkanarien umgehen (sehr wenig trivial) und entweder ein Programm mit execstackset finden oder setzen (was bedeutet, dass er ohnehin schon beliebige Befehle ausführen kann) oder schwierigere Techniken verwenden, wie z. B. Rückkehr zu libc / return orientierte Programmierung.

Jonathan Leffler
quelle
0

Mit diesen Optionen können Sie einige Schutzfunktionen deaktivieren (Erkennung von Stapelzerstörungen und Ausführung des Stapels).

--z execstack
-f no-stack-protector

Sie können ASLR (Adressraum-Layout-Randomisierung) auch mit Bash mit dem folgenden Befehl deaktivieren:

echo 0 > /proc/sys/kernel/randomize_va_space
gehe
quelle