it-swarm.com.de

Wie funktioniert ein NOP-Schlitten?

Ich kann keine gute Quelle finden, die diese Frage beantwortet. Ich weiß, dass ein Nop-Schlitten eine Technik ist, mit der die Stapel-Randomisierung bei einem Pufferüberlauf-Angriff umgangen wird. Ich kann mich jedoch nicht damit auskennen, wie es funktioniert.

Was ist ein einfaches Beispiel, das diese Methode veranschaulicht?

Was bedeuten Begriffe wie ein 128-Byte-Nop-Schlitten?

53
amorimluc

Bei einigen Angriffen muss das Programm zu einer bestimmten Adresse springen und von dort aus weiterlaufen. Der eingefügte Code muss vorher irgendwie an dieser genauen Stelle geladen werden.

Die Randomisierung des Stapels und andere Laufzeitunterschiede können dazu führen, dass die Adresse, an der das Programm springen kann, nicht vorhersagbar ist. Der Angreifer platziert also einen NOP-Sled in einem großen Speicherbereich. Wenn das Programm an eine beliebige Stelle in den Schlitten springt, werden alle verbleibenden NOPs ausgeführt, und es wird nichts weiter ausgeführt. Anschließend wird der Payload-Code direkt neben dem Schlitten ausgeführt.

Der Grund, warum der Angreifer den NOP-Schlitten verwendet, ist die Vergrößerung der Zieladresse: Der Code kann an beliebiger Stelle im Schlitten springen, anstatt genau am Anfang des eingegebenen Codes.

Ein 128-Byte-NOP-Schlitten ist nur eine Gruppe von NOP-Anweisungen mit einer Breite von 128 Byte.

HINWEIS 1: NOP (No-OPeration) ist eine Anweisung, die in den meisten (allen?) Architekturen verfügbar ist und außer dem Belegen von Speicher und einiger Laufzeit nichts tut.

ANMERKUNG 2: In Architekturen mit Anweisungen mit variabler Länge ist ein NOP-Befehl normalerweise nur ein Byte lang und kann daher als praktisches Auffüllen von Anweisungen verwendet werden. Das macht es leider auch einfach, einen NOP-Schlitten zu machen.

68
rodrigo

Zur Erklärung von Rodrigo hinzufügen - Selbst bei einem NOP-Schlitten muss die ungefähre Position des Puffers im Speicher vorhergesagt werden. Eine Technik zur Annäherung an den Speicherort von ist es, den nahegelegenen Stapelort als Bezugsrahmen zu verwenden. Durch Subtrahieren eines Versatzes von dieser Stelle kann die relative Adresse einer beliebigen Variablen erhalten werden. 

Anmerkung: Bei der x86-Architektur entspricht der NOP-Befehl dem Hex-Byte 0x90. Ein abgeschlossener Exploit-Puffer könnte daher etwa wie folgt aussehen: 

| NOP Schlitten | Shellcode | Wiederholte Absenderadresse | 

Da das EIP-Register auf eine Adresse zeigt, die in dem NOP-Schlitten gefunden wird, erhöht es sich, während es jeden NOP-Befehl nacheinander ausführt, bis er schließlich den Shellcode erreicht 

0
Boschko