Oft NOP
wird verwendet, um Befehlsadressen auszurichten. Dies tritt normalerweise auf, wenn beispielsweise Shellcode geschrieben wird , um die Sicherheitsanfälligkeit bezüglich Pufferüberlaufs oder Formatstrings auszunutzen .
Angenommen, Sie haben einen relativen Sprung zu 100 Byte vorwärts und nehmen einige Änderungen am Code vor. Es besteht die Möglichkeit, dass Ihre Änderungen die Adresse des Sprungziels durcheinander bringen und Sie daher auch den oben genannten relativen Sprung ändern müssen. Hier können Sie NOP
s hinzufügen , um die Zieladresse nach vorne zu verschieben. Wenn Sie mehrere NOP
s zwischen der Zieladresse und der Sprunganweisung haben, können Sie die NOP
s entfernen , um die Zieladresse nach hinten zu ziehen.
Dies ist kein Problem, wenn Sie mit einem Assembler arbeiten, der Labels unterstützt. Sie können dies einfach tun JXX someLabel
(wobei JXX ein bedingter Sprung ist), und der Assembler ersetzt ihn durch someLabel
die Adresse dieses Etiketts. Wenn Sie jedoch einfach den zusammengesetzten Maschinencode (die tatsächlichen Opcodes) von Hand ändern (wie es manchmal beim Schreiben von Shellcode vorkommt), müssen Sie die Sprunganweisung auch manuell ändern. Entweder Sie ändern es, oder Sie verschieben die Zielcodeadresse mit NOP
s.
Ein anderer Anwendungsfall für den NOP
Unterricht wäre ein sogenannter NOP-Schlitten . Im Wesentlichen besteht die Idee darin, eine ausreichend große Reihe von Anweisungen zu erstellen, die keine Nebenwirkungen verursachen (wie zNOP
oder Inkrementieren und dann Dekrementieren eines Registers), aber den Befehlszeiger erhöhen. Dies ist zum Beispiel nützlich, wenn man zu einem bestimmten Code springen möchte, dessen Adresse nicht bekannt ist. Der Trick besteht darin, den besagten NOP-Schlitten vor dem Zielcode zu platzieren und dann irgendwo zum besagten Schlitten zu springen. Was passiert, ist, dass die Ausführung hoffentlich von dem Array aus fortgesetzt wird, das keine Nebenwirkungen hat, und dass es Befehl für Befehl weiterleitet, bis es das gewünschte Stück Code trifft. Diese Technik wird häufig bei den oben genannten Pufferüberlauf-Exploits verwendet und insbesondere, um Sicherheitsmaßnahmen wie ASLR entgegenzuwirken .
Eine weitere spezielle Verwendung für den NOP
Befehl besteht darin, den Code eines Programms zu ändern. Beispielsweise können Sie Teile von bedingten Sprüngen durch NOP
s ersetzen und so die Bedingung umgehen. Dies ist eine häufig verwendete Methode, um den Kopierschutz von Software zu " knacken ". Im einfachsten Fall geht es nur darum, das Assembly-Code-Konstrukt für zu entfernenif(genuineCopy) ...
und die Anweisungen durch NOP
s und .. Voilà! Es werden keine Schecks ausgestellt und es werden keine Originalkopien erstellt!
Beachten Sie, dass im Wesentlichen beide Beispiele für Shellcode und Cracking dasselbe tun. Ändern Sie vorhandenen Code, ohne die relativen Adressen von Operationen zu aktualisieren, die auf relativer Adressierung basieren.