Ich kann keine gute Quelle finden, die diese Frage beantwortet. Ich weiß, dass ein Nop-Schlitten eine Technik ist, die verwendet wird, um die Stack-Randomisierung bei einem Pufferüberlaufangriff zu umgehen, aber ich kann mir nicht vorstellen, wie es funktioniert.
Was ist ein einfaches Beispiel, das diese Methode veranschaulicht?
Was bedeuten Begriffe wie 128-Byte-Nop-Schlitten?
Einige Angriffe bestehen darin, das Programm zu einer bestimmten Adresse springen zu lassen und von dort aus weiterzulaufen. Der eingeschleuste Code muss zuvor irgendwie genau an dieser Stelle geladen werden.
Stack-Randomisierung und andere Laufzeitunterschiede können dazu führen, dass die Adresse, an die das Programm springt, unmöglich vorherzusagen ist, sodass der Angreifer einen NOP-Schlitten in einem großen Bereich des Speichers platziert. Wenn das Programm an eine beliebige Stelle in den Schlitten springt, führt es alle verbleibenden NOPs aus, ohne etwas zu tun, und führt dann den Nutzdatencode direkt neben dem Schlitten aus.
Der Grund, warum der Angreifer den NOP-Schlitten verwendet, besteht darin, die Zieladresse zu vergrößern: Der Code kann überall im Schlitten springen, anstatt genau am Anfang des eingeschleusten Codes.
Ein 128-Byte-NOP-Schlitten ist nur eine Gruppe von NOP-Befehlen mit einer Breite von 128 Byte.
ANMERKUNG 1: NOP (No-Operation) ist eine Anweisung, die in den meisten (allen?) Architekturen verfügbar ist und nichts anderes tut, als Speicher und etwas Laufzeit zu belegen.
ANMERKUNG 2: In Architekturen mit Anweisungen mit variabler Länge ist eine NOP-Anweisung normalerweise nur ein Byte lang, sodass sie als bequemes Auffüllen von Anweisungen verwendet werden kann. Das macht es leider auch einfach, einen NOP-Schlitten zu machen.
Um Rodrigos Erklärung hinzuzufügen: Selbst bei einem NOP-Schlitten muss die ungefähre Position des Puffers im Speicher im Voraus vorhergesagt werden. Eine Technik zum Annähern des Speicherplatzes besteht darin, einen nahe gelegenen Stapelspeicherort als Bezugsrahmen zu verwenden. Durch Subtrahieren eines Offsets von dieser Position kann die relative Adresse jeder Variablen erhalten werden.
SEITENBEMERKUNG: Auf der x86-Architektur entspricht die NOP-Anweisung dem Hex-Byte 0x90, daher könnte ein vollständiger Exploit-Puffer etwa so aussehen:
| NOP-Schlitten | Shellcode | Wiederholte Absenderadresse|
Da das EIP-Register auf eine beliebige im NOP-Schlitten gefundene Adresse zeigt, würde es beim Ausführen jeder NOP-Anweisung eine nach der anderen inkrementieren, bis es schließlich den Shellcode erreicht
Ich frage mich nur, für welche praktischen Anwendungen Sie planen, dies zu lernen?
– Alex Gordon
7. Februar 2013 um 20:41 Uhr
Ich bin ein CE-Student und lerne dieses Thema im Lehrbuch CS: APP von Bryant, O’Hallaron. Ich arbeite auch an meiner Hochschule für IT-Sicherheit, daher interessiert mich das.
– amorimluc
7. Februar 2013 um 20:44 Uhr
Das würde ein Social Engineer sagen! 😉
– DeepS1X
23. Mai 2017 um 0:07 Uhr