RelocAlloc: Verwendung des .reloc-Abschnitts zum Ersetzen der typischen Allokationsaufrufe
Erklärung des Codes:
- Zuerst lokalisieren wir die Adressen aller DLLs, die in unseren Prozess eingebunden sind.
- Dann konstruieren wir ein Array von Structs und füllen es mit einigen Daten, das ist die Initialize()-Funktion.
- Jetzt haben wir ein vollständiges Array, der nächste Schritt ist die Suche nach der richtigen Adresse.
- Der Aufruf von GetSuitableAddress(SIZE_T ShellcodeSize) erledigt die Arbeit; das findet die richtige Code Cave (leerer Speicherbereich, der zur Shellcode-Größe passt)
- falls eine gefunden wird, wird sie zurückgegeben.
- Um sie zu nutzen, müssen wir den Speicherschutz auf beschreibbar/ausführbar anpassen ... (der PoC ist direkt rwx)
Demo:
img1
img2
Hinweis: Dies funktioniert nur mit kleinen Shellcodes, da es von den eingebundenen DLLs abhängt – je größer der .reloc-Abschnitt, desto größer die Chancen, eine gültige Adresse zu finden. Außerdem wurde dies nur auf einer x64-Maschine getestet, aber es sollte auch für x86 funktionieren (denke ich :p)
# BLEIBT DRAN FÜR MEHR
120064592-a5c83480-c075-11eb-89c1-78732ecaf8d3