terça-feira, 21 de junho de 2011

Introdução a Shellcode

Shellcode é definido como um conjunto de instruções injetado e, em seguida, executado por um programa explorado. Shellcode é usado para manipular diretamente os registradores e funções de um programa, por isso é geralmente escrito em assembler e seus opcodes são traduzido para hexadecimal. Você não pode tipicamente injetar shellcode escrito a partir de uma linguagem de alto nível, e há nuances sutis que irá impedir que o shellcode seja executado de forma limpa. Isto é o que torna a escrita um pouco difícil, e também um pouco de uma arte negra.

O termo shellcode é derivado de seu propósito original, que era especificamente parte de um exploit usado para gerar um shell root. Este ainda é o mais comum tipo de shellcode usado, mas muitos programadores têm refinado o shellcode para fazer mais do que isso. O shellcode é colocado em uma área de entrada, e então o programa é levado a executar o shellcode fornecido. Geralmente explorando estouro de buffer e/ou de pilha.

Entender Shellcode, e eventualmente, escrever seus próprios é, por muitas razões, uma habilidade essencial. Em primeiro lugar, a fim de determinar que uma vulnerabilidade realmente existe, primeiro você deve explorá-la. Isto pode parecer senso comum, mas um grande número de pessoas lá fora estão dispostos a indicar se uma vulnerabilidade pode ser explorada ou não sem fornecer evidências sólidas. Ainda pior, às vezes um programador diz que uma vulnerabilidade não é explorável, enquanto ela realmente é (geralmente porque o descobridor original não poderia descobrir como explorá-la e assumiu que porque ele ou ela não poderia descobrir isso, ninguém mais poderia). Além disso, fornecedores de software, muitas vezes, lançam um aviso de uma vulnerabilidade, mas não fornecem um exploit. Nestes casos, você pode ter que escrever o seu próprio shellcode se você deseja criar um exploit, a fim de testar o bug em seus próprios sistemas.

Nenhum comentário:

Postar um comentário