Souvent, le temps NOP
est utilisé pour aligner les adresses des instructions. Cela se produit généralement par exemple lors de l'écriture de Shellcode pour exploiter le débordement de tampon ou la vulnérabilité de chaîne de format .
Supposons que vous ayez un saut relatif de 100 octets vers l'avant et apportez quelques modifications au code. Il est probable que vos modifications gâchent l'adresse de la cible de saut et en tant que tel, vous devrez également modifier le saut relatif susmentionné. Ici, vous pouvez ajouter des NOP
s pour pousser l'adresse cible vers l'avant. Si vous avez plusieurs NOP
s entre l'adresse cible et l'instruction de saut, vous pouvez supprimer les NOP
s pour tirer l'adresse cible vers l'arrière.
Ce ne serait pas un problème si vous travaillez avec un assembleur qui prend en charge les étiquettes. Vous pouvez simplement le faire JXX someLabel
(où JXX est un saut conditionnel) et l'assembleur remplacera le someLabel
par l'adresse de cette étiquette. Cependant, si vous modifiez simplement le code machine assemblé (les opcodes réels) à la main (comme cela arrive parfois lors de l'écriture du shellcode), vous devez également modifier manuellement l'instruction de saut. Soit vous le modifiez, soit vous déplacez l'adresse de code cible à l'aide de NOP
s.
Un autre cas d'utilisation pour l' NOP
instruction serait quelque chose appelé un traîneau NOP . En substance, l'idée est de créer un tableau d'instructions suffisamment grand qui ne provoque aucun effet secondaire (commeNOP
ou incrémenter puis décrémenter un registre) mais augmenter le pointeur d'instruction. Ceci est utile par exemple lorsque l'on veut passer à un certain morceau de code dont l'adresse n'est pas connue. L'astuce consiste à placer ledit traîneau NOP devant le code cible, puis à sauter quelque part vers ledit traîneau. Ce qui se passe, c'est que l'exécution se poursuit, espérons-le, à partir du tableau qui n'a aucun effet secondaire et qu'elle avance instruction par instruction jusqu'à ce qu'elle atteigne le morceau de code souhaité. Cette technique est couramment utilisée dans les exploits de débordement de tampon susmentionnés et en particulier pour contrer les mesures de sécurité telles que ASLR .
Encore une autre utilisation particulière de l' NOP
instruction est lorsque l'on modifie le code d'un programme. Par exemple, vous pouvez remplacer des parties de sauts conditionnels par NOP
s et ainsi contourner la condition. Il s'agit d'une méthode souvent utilisée pour " craquer " la protection contre la copie des logiciels. Au plus simple, il s'agit simplement de supprimer la construction du code assembleur pour la if(genuineCopy) ...
ligne de code et de remplacer les instructions par NOP
s et .. Voilà! Aucun contrôle n'est effectué et la copie non authentique fonctionne!
Notez qu'en substance, les deux exemples de shellcode et de cracking font la même chose; modifier le code existant sans mettre à jour les adresses relatives des opérations qui reposent sur un adressage relatif.