Oft NOPwird 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 NOPs hinzufügen , um die Zieladresse nach vorne zu verschieben. Wenn Sie mehrere NOPs zwischen der Zieladresse und der Sprunganweisung haben, können Sie die NOPs 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 someLabeldie 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 NOPs.
Ein anderer Anwendungsfall für den NOPUnterricht 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 zNOPoder 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 NOPBefehl besteht darin, den Code eines Programms zu ändern. Beispielsweise können Sie Teile von bedingten Sprüngen durch NOPs 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 NOPs 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.