Muitas vezes, o tempo NOP
é usado para alinhar os endereços das instruções. Isso geralmente é encontrado, por exemplo, ao escrever o Shellcode para explorar o estouro de buffer ou formatar a vulnerabilidade de cadeia de caracteres .
Digamos que você tenha um salto relativo para 100 bytes adiante e faça algumas modificações no código. As chances são de que suas modificações atrapalhem o endereço do alvo do salto e, como tal, você também precisará alterar o salto relativo acima mencionado. Aqui, você pode adicionar NOP
s para enviar o endereço de destino. Se você tiver vários NOP
s entre o endereço de destino e a instrução de salto, poderá remover os NOP
s para puxar o endereço de destino para trás.
Isso não seria um problema se você estiver trabalhando com um montador que suporta etiquetas. Você pode simplesmente fazer JXX someLabel
(onde JXX é algum salto condicional) e o montador substituirá o someLabel
pelo endereço desse rótulo. No entanto, se você simplesmente modificar o código da máquina montado (os opcodes reais) manualmente (como às vezes acontece com a gravação do código do shell), também será necessário alterar a instrução de salto manualmente. Você o modifica ou move o endereço do código de destino usando NOP
s.
Outro caso de uso para NOP
instruções seria algo chamado trenó NOP . Em essência, a idéia é criar uma série de instruções suficientemente grande que não cause efeitos colaterais (comoNOP
ou incrementar e depois decrementar um registro), mas aumente o ponteiro da instrução. Isso é útil, por exemplo, quando se deseja pular para um determinado pedaço de código cujo endereço não é conhecido. O truque é colocar o referido trenó NOP na frente do código de destino e depois pular em algum lugar para o referido trenó. O que acontece é que a execução continua, esperançosamente, a partir da matriz que não tem efeitos colaterais e percorre a instrução por instrução até atingir o trecho de código desejado. Essa técnica é comumente usada em explorações de buffer overflow mencionadas anteriormente e, especialmente, para combater medidas de segurança, como o ASLR .
Ainda outro uso específico para a NOP
instrução é quando alguém está modificando o código de algum programa. Por exemplo, você pode substituir partes de saltos condicionais por NOP
s e, como tal, contornar a condição. Esse é um método frequentemente usado ao " quebrar " a proteção contra cópias do software. No mais simples, trata-se de remover a construção do código de montagem da if(genuineCopy) ...
linha de código e substituir as instruções por NOP
s e .. Voilà! Nenhuma verificação é feita e a cópia não original funciona!
Observe que, em essência, os dois exemplos de código de shell e cracking fazem o mesmo; modificar o código existente sem atualizar os endereços relativos das operações que dependem do endereço relativo.