Unterschied zwischen der Deklaration von Shellcode als char [] -Array und char *?

8

Hallo alle,

Ich versuche, grundlegende Shellcoding zu lernen, und ich bin auf etwas neugieriges gestoßen, das ich hoffe, dass mir jemand erklären kann. Ich habe den folgenden Code auf zwei Arten kompiliert: Deklarieren des Shellcodes als Array und als char *. Wenn ich Shellcode als Array deklariere, erkennt Linux, dass ich versuche, Daten auszuführen, und ich bekomme einen Segfault für die erste Anweisung. Wenn ich Shellcode jedoch als char * deklariere, werden alle Shellcodes ausgeführt und ich bekomme eine "Hallo Welt!". Wie behandelt der Compiler diese zwei Deklarationen anders und warum endet man in Shellcode, der im Speicher lebt, der ungeschützt ist? Vielen Dank im Voraus.

%Vor%     
dani 17.12.2011, 05:49
quelle

2 Antworten

8

Wenn Sie es als char[] deklarieren, befindet sich der Speicher auf dem Stapel. Wenn Sie es als char* deklarieren und ihm ein Zeichenfolgenliteral zuweisen, befindet sich der Speicher im ausführbaren Bild selbst. Linux mag es nicht, wenn Sie Code auf dem Stack ausführen, aber Sie können Speicher in diesem Teil des ausführbaren Abbilds ausführen. Das liegt daran, dass versucht wird, eine bestimmte Art von Stack-Overflow-Angriffen zu vermeiden, bei denen Personen den Stack mit beliebigen Anweisungen überlaufen lassen und sie dann ausführen können.

Sie können mprotect auf Linux verwenden, um die Berechtigungen für einen Speicherbereich oder VirtualProtectEx unter Windows. Auf diese Weise können Sie die Berechtigungen des Speichers explizit als ausführbar festlegen.

    
Seth Carnegie 17.12.2011, 05:53
quelle
3

In Ihrem ersten Fall:

%Vor%

Dadurch wird das Zeichenfolgenliteral als lokales Array auf dem Stapel abgelegt. Der Stack- und Heap-Speicher verfügt normalerweise (aus offensichtlichen Sicherheitsgründen) nicht über Ausführungsberechtigungen.

In Ihrem zweiten Fall:

%Vor%

Die Zeichenfolge lebt im statischen Speicher - normalerweise in der gleichen Region wie der Rest der Programm-Binärdatei - die ausführbar ist.

    
Mysticial 17.12.2011 05:54
quelle

Tags und Links