Muchas veces NOP
se usa para alinear direcciones de instrucciones. Esto generalmente se encuentra, por ejemplo, al escribir Shellcode para explotar el desbordamiento del búfer o formatear la vulnerabilidad de la cadena .
Supongamos que tiene un salto relativo a 100 bytes hacia adelante y realice algunas modificaciones al código. Lo más probable es que tus modificaciones alteren la dirección del objetivo del salto y, como tal, también deberías cambiar el salto relativo mencionado anteriormente. Aquí, puede agregar NOP
s para avanzar la dirección de destino. Si tiene múltiples NOP
s entre la dirección de destino y la instrucción de salto, puede eliminar las NOP
s para tirar de la dirección de destino hacia atrás.
Esto no sería un problema si está trabajando con un ensamblador que admite etiquetas. Simplemente puede hacer JXX someLabel
(donde JXX es un salto condicional) y el ensamblador reemplazará el someLabel
con la dirección de esa etiqueta. Sin embargo, si simplemente modifica el código de máquina ensamblado (los códigos de operación reales) a mano (como a veces sucede al escribir código de shell), también debe cambiar la instrucción de salto manualmente. O lo modifica, o luego mueve la dirección del código de destino usando NOP
s.
Otro caso de uso para la NOP
instrucción sería algo llamado trineo NOP . En esencia, la idea es crear una gama lo suficientemente grande de instrucciones que no causen efectos secundarios (comoNOP
o incrementando y luego decrementando un registro) pero aumenta el puntero de instrucción. Esto es útil, por ejemplo, cuando se quiere saltar a un determinado código cuya dirección no se conoce. El truco consiste en colocar dicho trineo NOP frente al código objetivo y luego saltar a algún lugar hacia dicho trineo. Lo que sucede es que, con suerte, la ejecución continúa desde la matriz que no tiene efectos secundarios y atraviesa instrucciones por instrucción hasta que alcanza el código deseado. Esta técnica se usa comúnmente en las vulnerabilidades de desbordamiento de búfer mencionadas anteriormente y especialmente para contrarrestar medidas de seguridad como ASLR .
Aún otro uso particular para la NOP
instrucción es cuando uno está modificando el código de algún programa. Por ejemplo, puede reemplazar partes de saltos condicionales con NOP
sy, como tal, eludir la condición. Este es un método de uso frecuente al " descifrar " la protección de copia del software. Como mínimo, se trata de eliminar la construcción del código de ensamblaje para la if(genuineCopy) ...
línea de código y reemplazar las instrucciones con NOP
s y .. ¡Voilà! ¡No se realizan controles ni copias no originales!
Tenga en cuenta que, en esencia, ambos ejemplos de shellcode y cracking hacen lo mismo; modifique el código existente sin actualizar las direcciones relativas de las operaciones que dependen del direccionamiento relativo.