Kwazza
(usa Debian)
Enviado em 31/01/2014 - 05:20h
Pesquise sobre shellcodes em exploits e você entenderá o porque do código hexadecimal.
Resumidamente, é o seguinte:
Quando se descobre alguma vulnerabilidade explorável em software, como o tal buffer overflow, precisa-se construir um código arbitrário capaz de corromper o programa e ser executado. O problema é que capturar esses eventos em tempo de execução é difícil e muito delicado, pois envolve manipulação de memória avançada para que você tire proveito do algoritmo que o código realiza e o faça executar o seu código arbitrário.
Para tudo isso, nada de linguanges de alto nível a lá Python, Ruby, Java ou Perl. Aqui se precisa de alguma linguagem de baixo nível que seja capaz de manipular memória, registradores e outros componentes de Hardware. O que se imagina a primeiro caso? C! Até vale, mas não é assim tão adequado: C permite manipulação direta de memória, mas as suas características de alto nível tal como controles de fluxos prontos e etc dificultam a exploração: Porque já que o C faz muita coisa pra você, você terá muita dificuldade em escrever um exploit totalmente em C que corrompa o programa, graças a exigência de manipulação profunda do hardware. Então, qual a melhor ferramenta? Assembly! Com ela você executa instruções de processador uma a uma, perfeita para explorar a implementação do programa.
O resto da história é simples: Você escreve seu exploit em Assembly que irá explorar a falha de segurança do programa e possibilitar execução de código arbitrário. Depois você pode executar o payload (código que você deseja executar depois do exploit ter sido exploitado), que pode ser escrito em C.
A questão do hexadecimal é a seguinte: Depois dos hackers/crackers escreverem o exploit em assembly, eles compilam, e com alguma ferramenta pra fazer aqueles dumps hexadecimais de executáveis eles pegam as instruções em assembly convertidas para código de máquina uma a uma e embedam num código em C. Então, quando o exploit for executado, ao invés de assembly o código em C chamará a rotina escrita em código de máquina.