Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
ExecASLR-ekoparty — Proof-of-Concept-Exploit, der ASLR auf Intel-CPUs umgeht, indem er den Branch Target Buffer und spekulative Ausführung missbraucht, um randomisierte Adressen über einen Seitenkanal zu leaken. | Kitploit
Tools/GitHubGitHub/es0j/execaslr-ekoparty
SchwachstellenanalyseExploitationHardware-SicherheitLernen & BildungRed TeamingAdversarial-AngriffBinary-Exploitation
GitHubes0j/execaslr-ekoparty

ExecASLR-ekoparty

Proof-of-Concept-Exploit, der ASLR auf Intel-CPUs umgeht, indem er den Branch Target Buffer und spekulative Ausführung missbraucht, um randomisierte Adressen über einen Seitenkanal zu leaken.

Repository anzeigen
72919vor 3 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

ExecASLR - Missbrauch von Intel-Branch-Prädiktoren zur Umgehung von ASLR

Was ist ASLR

Address Space Layout Randomization ist eine Schutzmaßnahme, die es schwerer machen soll, Speicherkorruptionsangriffe auszunutzen. In einem Szenario einer Pufferüberlauf-Schwachstelle muss ein Angreifer, der beispielsweise einen Return-Oriented-Programming-Exploit bauen möchte, die Adressen der Gadgets in der Kette kennen. Wenn das Codesegment der ausgenutzten Binärdatei randomisiert ist, ist es für einen Angreifer viel schwerer, die richtige Adresse für den Exploit zu wählen, was die Ausnutzung unpraktikabel macht.

Das folgende Beispiel zeigt, wie eine Adresse randomisiert wird:

#include <stdio.h>
void DoNothing();
void (*codePtr)() = DoNothing;

void DoNothing(){}

int main(int argc,char **argv){

    printf("Destination %p\n",codePtr);
    DoNothing();
}


Bei jeder Ausführung wird der Wert randomisiert:

Destination 0x563714256149
Destination 0x556d8e2f1149
Destination 0x5618c8bdd149
Destination 0x55ee623b0149

Die letzten 12 Bits 149 sind immer gleich, aber die Position der Funktion kann ungefähr überall zwischen 0x550000000000 und 0x570000000000 liegen, was bedeutet, dass 29 Bits randomisiert sind, was einen möglichen Adressraum von 0x200 0000 0000 oder 2,2 TB Größe ergibt.

CPU-Pipeline

Die Verarbeitung jeder Instruktion ist eine anspruchsvolle Aufgabe. Einige Stufen der Verarbeitung einer einzelnen Instruktion sind:

  • Abrufen der Instruktion;
  • Dekodieren der Instruktion;
  • Ausführen von Operationen in der Arithmetisch-Logischen Einheit

Um den Durchsatz von Instruktionen in der CPU zu erhöhen, wird jede Aufgabe der Instruktion von einer bestimmten Einheit des Prozessors ausgeführt. Wenn alle Einheiten parallel arbeiten, kann die CPU mit viel höheren Taktraten arbeiten – das ist die Idee einer Pipeline.

Operation \ Taktyklus12345
AbrufABC
DekodierungABC
AusführungABC

Ausführung der Instruktionen A, B und C über die Takte 1–5. In Takt 3 zum Beispiel sind die Abruf-, Dekodier- und Ausführungseinheiten gleichzeitig aktiv

Allerdings sind Instruktionen nicht völlig unabhängig voneinander. Zum Beispiel die folgende Sequenz:

A. add ax,[bx]
B. jz $+1
C. mov dl,[rsi]  
D. nop

In diesem Fall wird die Instruktion A im besten Fall erst in Takt 3 in der Ausführungsphase abgeschlossen. Allerdings muss die Abrufeinheit entscheiden, welche Instruktion als Nächstes aus dem Speicher geholt werden soll, nämlich ob Instruktion C (mov dl,[rsi]) übersprungen werden soll.

In diesem Szenario hat die CPU die Möglichkeit, auf das Ende der Instruktion A zu warten, das erst im dritten Taktyklus eintritt, um dann die richtige Instruktion aus dem Speicher zu holen, wenn die Add-Operation zum Beispiel 0 zurückgibt:

Operation \ Taktyklus123456
AbrufABD
DekodierungABD
AusführungABD

Das bedeutet eine Verzögerung in der Pipeline, weil die CPU auf die Ausführung der Instruktion warten muss. In diesem Beispiel beträgt die Verzögerung einen einzigen Taktyklus, aber die Instruktion add ax,[bx] erfordert eine Speicheroperation, die, wie zuvor gesehen, bis zu Hunderte von Takten dauern kann, was erhebliche Leistungskosten für den Prozessor mit sich bringt.

Eine schnellere Option wäre, den korrekten Ausführungspfad zu „erraten“. Die CPU kann spekulieren, ob der Sprung ausgeführt wird oder nicht. Danach wird die Ausführung auf dem spekulierten Pfad fortgesetzt, und die Werte werden nur übernommen, wenn der Pfad nach dem Ende der Instruktion A als korrekt bestätigt wird. Wenn der Pfad als falsch bestätigt wird, werden die Ergebnisse verworfen und der Zustand auf den Punkt vor der Spekulation zurückgesetzt.

Operation \ Taktyklus123456
AbrufAB(S) C
DekodierungAB(S) C
AusführungAB(S) C

Das einzige Problem beim Rückgängigmachen des eingeschlagenen Pfads ist, dass der mikroarchitektonische Zustand der CPU nicht zurückgesetzt werden kann. Wenn die CPU also spekuliert, die Instruktion C (mov dl,[rsi]) auszuführen, werden die von rsi referenzierten Daten in den Cache verschoben. Dieser Effekt kann später mit einem Seitenkanalangriff gemessen werden.

2-Bit-Bedingungsprädiktor. https://en.wikipedia.org/wiki/Branch_predictor

Spectre V2 (Branch Target Injection)

Nicht nur bedingte Instruktionen müssen vorhergesagt werden, sondern auch indirekte Sprünge. Die CPU muss einen Mechanismus haben, um die Ziele einer Instruktion wie call [rdi] zu erraten.

Die Spectre-v2-Schwachstelle zeigt, dass es möglich ist, den indirekten Prädiktor auszunutzen, um transiente Ausführung in anderen Prozessen zu erreichen: Entnommen aus https://spectreattack.com/spectre.pdf

Wenn eine Call-Instruktion im Kontext A auf derselben virtuellen Adresse wie ein anderer Call im Kontext B platziert wird, kann der Angreifer die CPU trainieren, Code an einer vom Angreifer gewählten Position im Kontext B auszuführen – eine Code-Reuse-Attacke, ähnlich wie Return-Oriented Programming (ROP).

Das anvisierte Opfer muss über ein Stück Code verfügen, das als „Spectre-Gadget“ bekannt ist und in der Lage ist, ein Geheimnis über einen Seitenkanalangriff zu leaken. Für einen erfolgreichen Spectre-Angriff muss der Angreifer auch die Position des Spectre-Gadgets kennen. Daher war der Schutz des Opfers mit ASLR bei Benutzer-zu-Benutzer-Angriffen früher eine Abschwächung für diese Art von Angriff. Es gibt jedoch auch Techniken zur Extraktion von ASLR mittels mikroarchitektonischer Angriffe wie Jump Over ASLR. Diese Technik hat jedoch einige Einschränkungen hinsichtlich der Menge der geleakten Bits, da sie zur Umgehung von ASLR auf Kollisionen im direkten Prädiktor angewiesen ist.

Die internen Mechanismen dieses Prädiktors sind unten dargestellt:

Entnommen aus https://spectreattack.com/spectre.pdf

Einige dieser Komponenten sind:

  • Der Branch Target Buffer (BTB);
    • Der BTB ist eine cacheartige Komponente, die die Ziele für die Vorhersagen speichert. Der BTB speichert die vollständige 64-Bit-Adresse des Ziels, und die Anzahl der verfügbaren Einträge im BTB hängt von der Architektur ab.
  • Der Branch History Buffer (BHB);
    • Der BHB speichert einen „Hash“ des jüngsten Ausführungsflusses. Jede Sprunginstruktion schreibt in den BHB. Auf Skylake-CPUs und früheren kann der BHB den Kontext der letzten 29 Sprünge speichern. Auf Icelake speichert der BHB bis zu ~100 Sprünge. Beachte, dass der BHB nur die 20LSBs der Sprünge verwendet, um den Hash zu erzeugen, von denen 12 nicht randomisiert sind.
  • Der indirekte Prädiktor;
    • Verwendet nur die 12 LSBs der indirekten Sprunginstruktion, um das vollständige 64-Bit-Ziel zu bestimmen. Exec ASLR leakt den 64-Bit-Zeiger aus dem BTB, um ASLR-Adressen vollständig wiederherzustellen.
  • Der direkte Sprungprädiktor
    • Verwendet die 30 LSBs der Quelladresse, um einen 32-Bit-Wert vorherzusagen. Die andere Hälfte der Adresse wird von der Quelle wiederverwendet. Der Jump-Over-ASLR-Angriff nutzt Kollisionen in diesem Prädiktor, um eine Quelladresse zu finden, die mit einem anderen Kontext kollidiert; daher ist er darauf beschränkt, nur 30 LSBs aus dem Opferkontext zu leaken.

Das klassische Spectre-v2-Angriffslayout sieht folgendermaßen aus:

Tool herunterladen