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 mybadfunction
Funktion 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_fail
in 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 .rodata
Abschnitt 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 mprotect
fü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 execstack
set 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.