Format String Bugs: Eine detaillierte Analyse für Entwickler

In der Welt von C und C++ verbergen sich einige der gefährlichsten Schwachstellen direkt vor unseren Augen, oft in scheinbar harmlosen Funktionen wie printf(). Haben Sie sich jemals gefragt, wie eine einfache, von einem Benutzer bereitgestellte Zeichenkette einem Angreifer ermöglichen könnte, sensible Daten aus dem Stack zu lesen oder sogar beliebigen Code auszuführen? Dies ist kein theoretischer Fehler; es ist der Kern einer mächtigen und klassischen Schwachstelle, die als Format String Bug bekannt ist. Sie verwandelt eine einfache Ausgabefunktion in ein leistungsstarkes Werkzeug für einen Angreifer, nur weil sie Benutzerdaten als Formatierungsanweisungen fehlinterpretiert.
Wenn die Vorstellung, Speicheradressen mit %p zu lesen oder an beliebige Speicherorte mit %n zu schreiben, verwirrend ist, sind Sie hier genau richtig. In diesem Deep Dive werden wir die Format String Vulnerability von Grund auf entmystifizieren. Wir werden konkrete Codebeispiele für sowohl anfälligen als auch sicheren Code durchgehen, die realen Auswirkungen dieser Exploits untersuchen und Ihnen umsetzbare Strategien an die Hand geben, um diese kritischen Bugs in Ihrer eigenen Codebasis dauerhaft zu finden und zu beseitigen.
Wichtige Erkenntnisse
- Verstehen Sie, wie ein einfacher Missbrauch von C-Style-Funktionen wie `printf` einen kritischen Format String Bug verursachen kann, wenn Benutzereingaben als Formatbezeichner behandelt werden.
- Entdecken Sie, wie Angreifer diese Schwachstellen ausnutzen, um mehr als nur eine Anwendung zum Absturz zu bringen, einschliesslich des Lesens sensibler Daten aus dem Speicher und der Ausführung von beliebigem Code.
- Lernen Sie umsetzbare, sichere Codierungspraktiken, die Sie sofort implementieren können, um diese gesamte Klasse von Schwachstellen in Ihrem Code zu finden und zu beseitigen.
- Gehen Sie über die manuelle Codeüberprüfung hinaus, indem Sie moderne Sicherheitstools identifizieren, die diese Schwachstellen in grossen und komplexen Anwendungen automatisch erkennen können.
Die Anatomie einer Format String Vulnerability
Stellen Sie sich eine Serienbriefvorlage vor, in der Sie nicht nur die einzufügenden Namen, sondern die gesamte Struktur der Vorlage selbst steuern könnten. Anstatt nur eine Lücke auszufüllen, könnten Sie Befehle hinzufügen, um die privaten Notizen des Absenders auszudrucken oder sogar Teile des Originaldokuments umzuschreiben. Das ist die Essenz eines Format String Bugs. Es ist eine Schwachstelle, die eine einfache Druckfunktion in ein mächtiges Werkzeug für einen Angreifer verwandelt.
Um diese Schwachstelle in Aktion zu sehen, bietet das folgende Video eine praktische Demonstration:
In Sprachen wie C verwenden Funktionen wie printf einen "Format String" als Vorlage, um Daten anzuzeigen. Das Problem entsteht, wenn ein Entwickler benutzergesteuerte Daten direkt als diese Vorlage übergibt. Dieser klassische Programmierfehler ist die Ursache für das, was als Uncontrolled Format String Vulnerability bekannt ist. Der entscheidende Unterschied liegt zwischen dem anfälligen Code printf(user_input); und der sicheren Alternative printf("%s", user_input);. In der sicheren Version wird dem Programm explizit mitgeteilt, dass die Eingabe als einfache Zeichenkette zu behandeln ist. In der anfälligen Version interpretiert das Programm alle Sonderzeichen in der Eingabe als Befehle.
Verständnis von Formatfunktionen und -spezifizierern
Formatfunktionen (printf, sprintf, fprintf) sind dafür ausgelegt, formatierte Ausgaben zu drucken. Sie interpretieren spezielle Zeichensequenzen, die als Formatbezeichner bezeichnet werden, um zu verstehen, wie Daten dargestellt werden sollen. Ein Angreifer kann diese Bezeichner nutzen, um das Verhalten des Programms zu manipulieren. Zu den üblichen Bezeichnern gehören:
- %s: Liest eine Zeichenkette aus dem Speicher.
- %d: Liest eine Ganzzahl.
- %x: Liest Daten und zeigt sie im Hexadezimalformat an.
- %p: Liest und zeigt eine Speicheradresse (einen Pointer) an.
- %n: Der gefährlichste Bezeichner. Er schreibt die Anzahl der bisher gedruckten Zeichen in eine Speicheradresse.
Wie der Stack den Exploit ermöglicht
Wenn eine Funktion wie printf aufgerufen wird, erwartet sie, dass ihre Argumente in einem bestimmten Speicherbereich, dem sogenannten Stack, platziert werden. Für jeden Formatbezeichner in der Vorlagenzeichenkette (z. B. %x %x %p) erwartet sie eine entsprechende Variable auf dem Stack. Wenn ein Angreifer eine Zeichenkette wie "Username: %x %x %x" bereitstellt, der Entwickler aber keine zusätzlichen Argumente angegeben hat, stoppt printf nicht. Sie liest weiterhin vom Stack und gibt alle Daten aus, die sich zufällig dort befinden - wie z. B. Speicheradressen, Benutzerdaten oder Sicherheits-Canaries. Dieses Memory Leak ist ein grundlegender Schritt bei der Ausnutzung eines Format String Bugs.
Vom Bug zur Sicherheitsverletzung: Wie Angreifer Format Strings ausnutzen
Ein Format String Bug ist weitaus gefährlicher als ein einfacher Programmierfehler, der eine Anwendung zum Absturz bringt. Seine wahre Bedrohung liegt in dem schrittweisen Pfad, den er Angreifern bietet, wodurch sie von einer geringfügigen Störung bis zur vollständigen Kompromittierung des Systems eskalieren können. Dieses hohe Ausnutzungspotenzial ist der Grund, warum diese Schwachstellenklasse häufig eine hohe oder kritische CVSS-Schweregradbewertung erhält. Angreifer folgen typischerweise einem dreistufigen Prozess, bei dem jeder Schritt auf dem vorherigen aufbaut.
- Denial of Service: Absturz der Anwendung, um die Verfügbarkeit zu stören.
- Information Disclosure: Auslesen von Speicher, um Sicherheitsvorkehrungen zu umgehen.
- Arbitrary Code Execution: Schreiben in den Speicher, um die Kontrolle über die Anwendung zu übernehmen.
Angriff #1: Absturz der Anwendung (Denial of Service)
Die einfachste Ausnutzung eines Format String Bugs ist das Verursachen eines Denial of Service (DoS). Wenn ein Angreifer einen Formatbezeichner wie %s angibt, versucht die Funktion, eine Zeichenkette von einer Adresse auf dem Stack zu lesen. Indem er dies wiederholt, wie in einer Payload wie %s%s%s%s, zwingt der Angreifer das Programm, von mehreren, potenziell ungültigen, Speicherorten zu lesen. Dies führt unweigerlich zu einer Segmentation Fault, wodurch die Anwendung abstürzt und für legitime Benutzer nicht mehr verfügbar ist.
Angriff #2: Lesen von beliebigem Speicher (Information Disclosure)
Ein anspruchsvollerer Angreifer verwendet Formatbezeichner wie %x (hexadezimal) oder %p (Pointer), um Daten direkt vom Stack des Programms zu lesen. Diese Information Disclosure ist ein kritischer Zwischenschritt. Ein Angreifer kann sensible Werte wie Stack-Canaries, Funktions-Pointer und andere lokale Variablen auslesen. Diese Informationen ermöglichen es ihm, das Speicherlayout der Anwendung zu kartieren und so moderne Sicherheitsmechanismen wie Address Space Layout Randomization (ASLR) effektiv zu umgehen.
Angriff #3: Schreiben in beliebigen Speicher (Code Execution)
Das ultimative Ziel ist das Erreichen von Remote Code Execution (RCE). Dies wird durch den einzigartigen und leistungsstarken Formatbezeichner %n ermöglicht, der die Anzahl der bisher gedruckten Bytes in eine Speicheradresse schreibt. Ein Angreifer kann sorgfältig eine Eingabezeichenkette erstellen, um sowohl den geschriebenen Wert als auch die Zieladresse zu steuern. Diese Technik, die oft in Umgebungen wie dem Information Security Lab von Georgia Tech praktiziert wird, ermöglicht es ihnen, kritische Datenstrukturen zu überschreiben, wie z. B. eine gespeicherte Rücksprungadresse auf dem Stack oder einen Funktions-Pointer. Indem sie die Programmausführung auf ihren eigenen bösartigen Shellcode umleiten, erhalten sie die volle Kontrolle über die Anwendung.
Ein praktisches Beispiel: Finden und Ausnutzen eines Format String Bugs
Theorie ist wichtig, aber eine Schwachstelle in Aktion zu sehen, vermittelt ein echtes Verständnis. In diesem Abschnitt werden wir ein praktisches Lab durchgehen, das demonstriert, wie ein Angreifer einen klassischen Format String Bug entdecken und mit der Ausnutzung beginnen kann. Diese praktische Übung wird die abstrakten Konzepte der Stack-Manipulation und des Data Leakage konkretisieren.
Der anfällige Code-Snippet
Beginnen wir mit einem einfachen C-Programm, das einen kritischen Fehler enthält. Das Programm ist so konzipiert, dass es ein Befehlszeilenargument entgegennimmt und auf dem Bildschirm ausgibt. Die Schwachstelle liegt darin, dass benutzergesteuerte Eingaben direkt an die Funktion printf übergeben werden.
#include <stdio.h>
int main(int argc, char **argv) {
if (argc > 1) {
// VULNERABILITY: User input is passed directly as the format string.
// An attacker can inject format specifiers like %x, %s, or %n.
printf(argv[1]);
printf("\n");
} else {
printf("Usage: %s <input>\n", argv[0]);
}
return 0;
}
Um mitzumachen, speichern Sie diesen Code als vuln.c und kompilieren Sie ihn mit GCC. Die Verwendung des Flags -no-pie macht Stack-Offsets für diese Demonstration besser vorhersagbar.
gcc -o vuln vuln.c -no-pie -fno-stack-protector
Schritt 1: Bestätigung des Bugs und Auslesen von Stack-Daten
Der erste Schritt eines Angreifers ist die Bestätigung, ob das Programm anfällig ist. Eine gängige Technik ist die Bereitstellung einer Mischung aus normalen Zeichen und Formatbezeichnern. Ziel ist es, festzustellen, ob das Programm die Bezeichner interpretiert und Daten aus dem Stack ausgibt.
- Eingabe:
./vuln AAAA%x.%x.%x.%x.%x.%x - Beispielausgabe:
AAAAf7f6a9c0.f7ddc040.0.ffcfa864.0.41414141
Die Ausgabe bestätigt die Schwachstelle. Die %x-Bezeichner wurden nicht wörtlich ausgegeben; stattdessen wurden sie interpretiert, was dazu führte, dass printf hexadezimale Werte direkt aus dem Stack las und anzeigte. Am wichtigsten ist, dass wir 41414141 sehen, was die hexadezimale Darstellung unserer Eingabe "AAAA" ist. Dies beweist, dass wir Daten in den Stack schreiben und sie dann wieder auslesen können - der erste Schritt zu einem erfolgreichen Exploit.
Schritt 2: Lesen bestimmter Daten mit direktem Parameterzugriff
Das Ausgeben des gesamten Stacks ist unübersichtlich. Ein anspruchsvollerer Angreifer wird bestimmte Daten lokalisieren. Dies geschieht mit direkten Parameterzugriffsbezeichnern wie %n$x, wobei 'n' die Position des Parameters auf dem Stack ist, der gelesen werden soll. Aus dem vorherigen Schritt haben wir gesehen, dass unsere "AAAA"-Zeichenkette der 6. Parameter war.
- Eingabe:
./vuln AAAA%6\$x - Beispielausgabe:
AAAA41414141
Dies demonstriert ein viel kontrollierteres Auslesen von Informationen. Anstatt einen grossen Teil des Stacks zu dumpen, kann der Angreifer nun einen bestimmten Wert lesen. Diese präzise Kontrolle ist die Grundlage für fortgeschrittenere Angriffe, wie z. B. das Umgehen von Sicherheitsmechanismen wie Canaries oder das Auslesen von Speicheradressen, um ASLR zu umgehen.
Sichere Codierung und Präventionsstrategien
Während das Verständnis der Mechanismen eines Angriffs entscheidend ist, liegt die wahre Macht in der Prävention. Für Entwickler ist die Behebung eines Sicherheitsfehlers in einer Produktionsumgebung exponentiell kostspieliger und schwieriger als die Verhinderung während der Entwicklung. Eine mehrschichtige Verteidigung ist der stärkste Ansatz, um den Format String Bug und ähnliche Schwachstellen zu beseitigen.
Zu den wichtigsten Präventionsstrategien gehören:
- Sichere Codierungspraktiken: Durchsetzung strenger Regeln für den Umgang mit allen externen Eingaben.
- Compiler-Level Hardening: Verwendung eingebauter Compilerfunktionen zur automatischen Erkennung von Fehlern.
- OS-Level Protections: Profitieren von modernen Betriebssystem-Mitigationen wie ASLR (Address Space Layout Randomization), die die Ausnutzung erschweren, aber nicht unmöglich machen.
Die goldene Regel: Niemals Benutzereingaben vertrauen
Der absolute Eckpfeiler der Prävention ist, niemals zuzulassen, dass benutzergesteuerte Daten das Format String Argument selbst sind. Dieser Fehler ermöglicht es einem Angreifer, Formatbezeichner wie %x oder %n einzufügen. Geben Sie immer eine statische, vom Entwickler definierte Formatzeichenkette an und übergeben Sie Benutzereingaben als separaten Parameter. Diese grundlegende Vorgehensweise stellt sicher, dass die Eingabe als einfache Daten und nicht als eine Reihe von Befehlen behandelt wird.
Schlechter Code (anfällig): Ein Angreifer kann "%s%s%s" angeben, um das Programm zum Absturz zu bringen.
printf(user_input);
Guter Code (sicher): Die Eingabe wird sicher als Zeichenkette ausgegeben, wodurch die Bedrohung neutralisiert wird.
printf("%s", user_input);
Nutzung von Compiler-Warnungen und -Schutzmassnahmen
Moderne Compiler sind mächtige Verbündete. Entwickler sollten Code immer mit den höchsten Warnstufen kompilieren. Für GCC und Clang sind Flags wie -Wformat und -Wformat-security von unschätzbarem Wert, da sie verdächtige Verwendungen von Formatierungsfunktionen automatisch erkennen und kennzeichnen. Darüber hinaus kann die Aktivierung von Funktionen wie _FORTIFY_SOURCE Laufzeitprüfungen ermöglichen, die dazu beitragen, Buffer Overflows und andere verwandte Probleme zu beheben.
Format String Bugs in anderen Sprachen
Während diese klassische Schwachstelle am häufigsten mit C/C++ in Verbindung gebracht wird, betrifft das zugrunde liegende Prinzip auch andere Sprachen. Der String-Formatierungsoperator (%) von Python 2 könnte auf ähnliche Weise missbraucht werden. Selbst in modernen Sprachen kann nicht vertrauenswürdige String-Interpolation zu anderen, aber schwerwiegenden Schwachstellen wie Cross-Site Scripting (XSS) oder Template Injection führen. Die Kernlektion ist universell: Trennen Sie immer nicht vertrauenswürdige Daten von der Formatierungslogik.
Letztendlich schafft die Kombination aus sicheren Codierungsgewohnheiten, Compiler-Schutzmassnahmen und regelmässigen Sicherheitsaudits eine formidable Barriere. Proaktive Codeanalysen und Penetration Testing, wie sie von penetrify.cloud angeboten werden, können helfen, diese kritischen Schwachstellen zu identifizieren, bevor sie die Produktion erreichen.
Automatisierung der Erkennung mit modernen Sicherheitstools
Während das Verständnis der Mechanismen eines Format String Bugs entscheidend ist, stellt das Auffinden dieser Schwachstellen in grossen, komplexen Codebasen eine erhebliche Herausforderung dar. Die moderne Entwicklung schreitet zu schnell voran, als dass traditionelle Sicherheitsmethoden mithalten könnten. Sich ausschliesslich auf manuelle Prüfungen zu verlassen, ist keine praktikable Strategie mehr, um Anwendungen in grossem Massstab zu schützen.
Die Grenzen des manuellen Auditings
Manuelle Code Reviews und Penetration Tests haben ihren Platz, aber sie sind als primäre Verteidigung unzureichend. Ein zeilenweises Audit ist unglaublich zeitaufwendig und teuer. Noch wichtiger ist, dass es anfällig für menschliche Fehler ist - ein subtiler Formatierungsfehler kann selbst von einem erfahrenen Entwickler leicht übersehen werden. Darüber hinaus bietet manuelles Pentesting nur eine Momentaufnahme Ihrer Sicherheitslage und lässt Sie blind für neue Schwachstellen, die zwischen den Assessments eingeführt werden.
SAST vs. DAST zum Auffinden von Format String Bugs
Automatisierte Sicherheitstest-Tools bieten eine skalierbarere und zuverlässigere Lösung. Zwei primäre Ansätze sind sehr effektiv bei der Identifizierung von Format String Vulnerabilities:
- Static Application Security Testing (SAST): Diese Tools analysieren Ihren Quellcode, Bytecode oder Binärcode, ohne ihn auszuführen. Sie fungieren wie ein erfahrener Korrekturleser und suchen nach bekannten unsicheren Mustern und Codierungsfehlern, die zu Schwachstellen führen könnten.
- Dynamic Application Security Testing (DAST): Diese Tools testen Ihre Anwendung, während sie ausgeführt wird. Sie simulieren externe Angriffe, indem sie bösartige Payloads - wie z. B. fehlerhafte Format Strings - senden, um festzustellen, wie die Anwendung reagiert und ausnutzbare Fehler aus der Perspektive eines Angreifers aufzudecken.
Sowohl SAST als auch DAST sind mächtige Verbündete im Kampf gegen häufige Schwachstellen und bieten komplementäre Ansichten über den Sicherheitszustand Ihrer Anwendung.
Erreichen Sie kontinuierliche Sicherheit mit Penetrify
Für einen umfassenden und kontinuierlichen Schutz ist eine moderne DAST-Lösung unerlässlich. Penetrify ist eine intelligente, automatisierte Plattform, die sich direkt in Ihren Entwicklungszyklus integriert. Unsere KI-gestützten Agenten scannen Ihre laufenden Anwendungen kontinuierlich auf häufige und kritische Sicherheitslücken, einschliesslich des schwer fassbaren Format String Bugs.
Indem Sie Penetrify in Ihre CI/CD-Pipeline einbetten, können Sie Schwachstellen automatisch identifizieren und beheben, bevor sie die Produktion erreichen. Dieser proaktive Ansatz verwandelt die Sicherheit von einem Engpass in einen nahtlosen Teil Ihres Workflows. Sichern Sie Ihre Anwendungen noch heute. Starten Sie einen kostenlosen Scan mit Penetrify.
Stärkung Ihres Codes gegen Format String Attacks
Das Verständnis der Mechanismen eines Format String Bugs ist der erste kritische Schritt zu seiner Beseitigung. Wie wir untersucht haben, rühren diese Schwachstellen von der unsachgemässen Verwendung von Formatierungsfunktionen her und öffnen die Tür für verheerende Angriffe, die von Information Disclosure bis hin zu Remote Code Execution reichen. Während sorgfältige sichere Codierungspraktiken Ihre primäre Verteidigung bilden, bedeutet die Komplexität moderner Anwendungen, dass die manuelle Überwachung nicht mehr ausreicht, um jedes potenzielle Problem zu erkennen.
Hier wird automatisierte Sicherheit unverzichtbar. Um Ihren Code proaktiv zu sichern, benötigen Sie eine Lösung, die mit Ihrem Entwicklungszyklus Schritt hält. Die Plattform von Penetrify bietet genau das, mit KI-gestützter Schwachstellenerkennung und kontinuierlichem OWASP Top 10 Scanning, das sich nahtlos in Ihren bestehenden Workflow integriert und sicherstellt, dass Bedrohungen frühzeitig und oft identifiziert werden.
Lassen Sie nicht zu, dass eine vermeidbare Schwachstelle Ihre Software gefährdet. Entdecken Sie, wie der KI-gestützte Scanner von Penetrify kritische Schwachstellen automatisch finden und melden kann. Starten Sie noch heute Ihre kostenlose Testversion. Gehen Sie den nächsten Schritt beim Aufbau widerstandsfähigerer und sichererer Anwendungen.
Häufig gestellte Fragen
Ist der Format String Bug im Jahr 2026 noch üblich?
Obwohl nicht so verbreitet wie in den frühen 2000er Jahren, sind Format String Bugs nicht ausgestorben. Moderne Compiler geben oft Warnungen aus, und sichere Codierungspraktiken haben ihre Häufigkeit in neuen Anwendungen reduziert. Sie tauchen jedoch immer noch in älteren C/C++-Codebasen, eingebetteten Systemen und IoT-Geräten auf, in denen ältere, weniger sichere Bibliotheken üblich sind. Sie bleiben eine kritische Schwachstelle, wenn sie entdeckt werden, daher müssen Entwickler wachsam bleiben, insbesondere bei der Wartung oder Integration mit älterem Code.
Was ist der Unterschied zwischen einem Format String Bug und einem Buffer Overflow?
Ein Buffer Overflow tritt auf, wenn ein Programm mehr Daten in einen Puffer schreibt, als dieser aufnehmen kann, wodurch der angrenzende Speicher beschädigt wird. Im Gegensatz dazu tritt ein Format String Bug auf, wenn benutzergesteuerte Eingaben als Format String Argument an Funktionen wie printf() übergeben werden. Dies ermöglicht es einem Angreifer, Formatbezeichner (z. B. %x, %n) zu verwenden, um vom Stack zu lesen, an beliebige Speicherorte zu schreiben und potenziell bösartigen Code auszuführen, ohne einen bestimmten Puffer zu überlaufen.
Welche Programmiersprachen sind am anfälligsten für Format String Attacks?
Sprachen, die manuelle Speicherverwaltung durchführen und unsichere String-Formatierungsfunktionen haben, sind am stärksten gefährdet. C und C++ sind die Hauptbeispiele, wobei Funktionen wie printf, sprintf und syslog häufige Quellen der Schwachstelle sind. Moderne Sprachen wie Python, Java, C# und Rust sind im Allgemeinen nicht anfällig für diese spezifische Angriffsklasse, da ihre Standardbibliotheken die String-Formatierung speichersicher handhaben und den direkten Speicherzugriff vom Entwickler abstrahieren.
Kann eine Format String Vulnerability zu einer vollständigen Systemkompromittierung führen?
Ja, eine kritische Format String Vulnerability kann absolut zu einer vollständigen Systemkompromittierung führen. Durch die Verwendung des %n-Formatbezeichners kann ein Angreifer Daten an beliebige Speicheradressen schreiben. Dies kann verwendet werden, um die Rücksprungadresse einer Funktion auf dem Stack oder einen Funktions-Pointer im Speicher zu überschreiben. Dies ermöglicht es dem Angreifer, den Ausführungsfluss des Programms auf seinen eigenen bösartigen Code (Shellcode) umzuleiten, was ihm potenziell die vollständige Kontrolle über die Anwendung und das zugrunde liegende System gibt.
Was ist der einfachste Weg, meine Anwendung auf diese Schwachstelle zu überprüfen?
Die einfachste Methode ist die statische Analyse. Überprüfen Sie Ihren Quellcode manuell auf alle Instanzen, in denen Funktionen wie printf(), sprintf() oder snprintf() mit einer benutzersteuerbaren Variable als erstem Argument aufgerufen werden. Zum Beispiel ist printf(user_input) ein grosses Warnsignal. Die Automatisierung dieses Prozesses mit einem Static Application Security Testing (SAST)-Tool ist ein effizienterer und skalierbarerer Ansatz, um diese potenziell anfälligen Funktionsaufrufe in Ihrer Codebasis zu identifizieren.
Wie hängt ASLR (Address Space Layout Randomization) mit Format String Exploits zusammen?
ASLR ist eine Sicherheitsfunktion, die die Speicherorte des Stacks, des Heaps und der Bibliotheken bei jeder Ausführung eines Programms randomisiert. Dies macht Format String Exploits deutlich schwieriger, aber nicht unmöglich. Ein Angreifer kann sich nicht mehr auf statische Speicheradressen verlassen, um Rücksprung-Pointer zu überschreiben oder Shellcode auszuführen. Eine Format String Vulnerability selbst kann jedoch oft verwendet werden, um Speicheradressen vom Stack auszulesen, wodurch der Angreifer ASLR umgehen und die korrekten Zieladressen für seinen Exploit berechnen kann.