Wie funktioniert ein NOP-Schlitten?

Lesezeit: 3 Minuten

Benutzeravatar von amorimluc
amorimluc

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?

  • 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

rodrigos Benutzeravatar
rodrigo

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.

  • Ok, ich glaube, ich verstehe das Wesentliche von Nop-Schlitten. Gibt es einen Ort, auf den Sie verweisen könnten, der ein Assembler-Code-Beispiel für einen Nop-Schlitten zeigt?

    – amorimluc

    7. Februar 2013 um 20:58 Uhr

  • Nop-Schlitten sind für mich noch etwas abstrakt. Ein Beispiel würde wirklich helfen.

    – amorimluc

    7. Februar 2013 um 21:10 Uhr

  • Lol, vielleicht könnte man den Nop-Block verkürzen mit (…)

    – amorimluc

    7. Februar 2013 um 21:12 Uhr

  • In dem Kurs, an dem ich teilgenommen habe, war ein NOP-Schlitten nicht unbedingt eine Folge wörtlicher NOPs, sondern könnte auch eine Folge von Anweisungen sein, die wie echter Code aussehen, aber keine Nettowirkung haben. Einem Register eins hinzuzufügen und dann eins von einem Register zu subtrahieren, hat keine nennenswerten Nebeneffekte, aber es ist für einen Scanner viel schwieriger zu erkennen als eine Reihe von wörtlichen NOP-Anweisungen hintereinander.

    – Adrian McCarthy

    7. Februar 2013 um 21:18 Uhr

  • @PascalCuoq Moderne Nop-Folien enthalten keine große Folge von Nops. Wieso den? Die Sicherheit wurde verbessert, um diese “großen Mengen” von Nops zu erkennen. Blackhats enthalten zufällige Befehle, um “echten” Speicher vorzutäuschen und solche Schutzsoftware anzulocken.

    – basiskarl

    16. Oktober 2014 um 19:17 Uhr


Benutzeravatar von Boschko
Boschko

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

  • Ist es möglich, Ihre Technik zu erklären, um den ungefähren Speicherort des Puffers zu finden? Ich bin mir nicht sicher, ob es möglich wäre, ohne Speicherleckinformationen (von einer Sicherheitslücke oder was auch immer) zu verwenden …

    – Duke Nukem

    17. August 2018 um 12:04 Uhr

1416640cookie-checkWie funktioniert ein NOP-Schlitten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy