Stack Overflow
Last updated
Last updated
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ein Stack Overflow ist eine Schwachstelle, die auftritt, wenn ein Programm mehr Daten auf den Stack schreibt, als ihm zugewiesen sind. Diese überschüssigen Daten werden benachbarte Speicherbereiche überschreiben, was zur Korruption gültiger Daten, zur Störung des Kontrollflusses und möglicherweise zur Ausführung von schädlichem Code führt. Dieses Problem tritt häufig aufgrund der Verwendung unsicherer Funktionen auf, die keine Grenzkontrollen für Eingaben durchführen.
Das Hauptproblem bei diesem Überschreiben ist, dass der gespeicherte Befehlszeiger (EIP/RIP) und der gespeicherte Basiszeiger (EBP/RBP), um zur vorherigen Funktion zurückzukehren, auf dem Stack gespeichert sind. Daher wird ein Angreifer in der Lage sein, diese zu überschreiben und den Ausführungsfluss des Programms zu steuern.
Die Schwachstelle tritt normalerweise auf, weil eine Funktion mehr Bytes auf den Stack kopiert, als ihr zugewiesen sind, und somit in der Lage ist, andere Teile des Stacks zu überschreiben.
Einige gängige Funktionen, die anfällig dafür sind, sind: strcpy
, strcat
, sprintf
, gets
... Auch Funktionen wie fgets
, read
& memcpy
, die ein Längenargument annehmen, könnten auf eine anfällige Weise verwendet werden, wenn die angegebene Länge größer ist als die zugewiesene.
Zum Beispiel könnten die folgenden Funktionen anfällig sein:
Die gängigste Methode, um Stack Overflows zu finden, besteht darin, eine sehr große Eingabe von A
s zu geben (z. B. python3 -c 'print("A"*1000)'
) und einen Segmentation Fault
zu erwarten, der anzeigt, dass die Adresse 0x41414141
versucht wurde zuzugreifen.
Darüber hinaus, sobald Sie festgestellt haben, dass es eine Stack Overflow-Sicherheitsanfälligkeit gibt, müssen Sie den Offset finden, bis es möglich ist, die Rücksprungadresse zu überschreiben. Dazu wird normalerweise eine De Bruijn-Sequenz verwendet. Diese ist für ein gegebenes Alphabet der Größe k und Teilfolgen der Länge n eine zyklische Sequenz, in der jede mögliche Teilfolge der Länge _n_** genau einmal** als zusammenhängende Teilfolge erscheint.
Auf diese Weise ist es anstelle von Hand erforderlich, herauszufinden, welcher Offset benötigt wird, um das EIP zu steuern, möglich, als Padding eine dieser Sequenzen zu verwenden und dann den Offset der Bytes zu finden, die es überschrieben haben.
Es ist möglich, pwntools dafür zu verwenden:
oder GEF:
Während eines Überlaufs (vorausgesetzt, die Überlaufgröße ist groß genug) wirst du in der Lage sein, Werte von lokalen Variablen im Stack zu überschreiben, bis du das gespeicherte EBP/RBP und EIP/RIP (oder sogar mehr) erreichst. Die häufigste Methode, diese Art von Schwachstelle auszunutzen, besteht darin, die Rücksprungadresse zu modifizieren, sodass, wenn die Funktion endet, der Kontrollfluss dorthin umgeleitet wird, wo der Benutzer in diesem Zeiger angegeben hat.
In anderen Szenarien könnte es jedoch ausreichen, einfach einige Variablenwerte im Stack zu überschreiben, um die Ausnutzung zu erreichen (wie bei einfachen CTF-Herausforderungen).
In diesen CTF-Herausforderungen gibt es eine Funktion, die innerhalb der Binärdatei nie aufgerufen wird und die du aufrufen musst, um zu gewinnen. Für diese Herausforderungen musst du nur den Offset finden, um die Rücksprungadresse zu überschreiben, und die Adresse der Funktion finden, die aufgerufen werden soll (in der Regel wäre ASLR deaktiviert), sodass, wenn die verwundbare Funktion zurückkehrt, die versteckte Funktion aufgerufen wird:
Ret2winIn diesem Szenario könnte der Angreifer einen Shellcode im Stack platzieren und den kontrollierten EIP/RIP ausnutzen, um zum Shellcode zu springen und beliebigen Code auszuführen:
Stack ShellcodeDiese Technik ist das grundlegende Framework, um den Hauptschutz der vorherigen Technik zu umgehen: Nicht ausführbarer Stack (NX). Und sie ermöglicht die Durchführung mehrerer anderer Techniken (ret2lib, ret2syscall...), die letztendlich beliebige Befehle ausführen, indem sie vorhandene Anweisungen in der Binärdatei ausnutzen:
ROP - Return Oriented ProgramingEin Überlauf muss nicht immer im Stack sein, er könnte auch im Heap sein, zum Beispiel:
Heap OverflowEs gibt mehrere Schutzmaßnahmen, die versuchen, die Ausnutzung von Schwachstellen zu verhindern. Überprüfe sie in:
Common Binary Exploitation Protections & BypassesLerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)