Shellcode
Shellcode - anglojęzyczny zlepek słów shell (powłoka) oraz code (kod) oznaczający prosty, niskopoziomowy program odpowiedzialny za wywołanie powłoki systemowej w ostatniej fazie wykorzystywania wielu błędów zabezpieczeń przez exploity. Efektem działania takiego exploita jest uzyskanie nieautoryzowanego dostępu do systemu komputerowego lub eskalacja uprawnień
Przykładowy shellcode zapisany zgodnie z notacja języka C zamieszczony jest poniżej.
char shellcode[]= "\x31\xc0" /* xorl %eax,%eax */ "\x31\xdb" /* xorl %ebx,%ebx */ "\x31\xc9" /* xorl %ecx,%ecx */ "\xb0\x46" /* movl $0x46,%al */ "\xcd\x80" /* int $0x80 */ "\x50" /* pushl %eax */ "\x68""/ash" /* pushl $0x6873612f */ "\x68""/bin" /* pushl $0x6e69622f */ "\x89\xe3" /* movl %esp,%ebx */ "\x50" /* pushl %eax */ "\x53" /* pushl %ebx */ "\x89\xe1" /* movl %esp,%ecx */ "\xb0\x0b" /* movb $0x0b,%al */ "\xcd\x80" /* int $0x80 */ ;
Shellcode składa się z instrukcji asemblera zapisanych już w formie binarnej, w której wszystkie adresy muszą być zakodowane na stałe. Aby uniknąć bezwzględnych odwołań do pamięci generujących błąd naruszenia segmentacji programu, w kodzie tym używa się względnych referencji do komórek pamięci, większość adresów uzyskuje się ze stosu a skoki są wykonywanie nie do konkretnego miejsca w pamięci tylko o konkretną ilość instrukcji procesora w przód, bądź w tył.
Dobrze skonstruowany shellcode nie powinien zawierać instrukcji typu:
mov eax, 0x0000
Instrukcje te powodują powstanie pustych bajtów (zawierających 0x0). Spowodowane jest to sposobem implementacji większości funkcji kopiujących, które po napotkaniu bajta zerowego kończą swoje działanie (0x0 oznacza koniec danych). Aby uniknąć tego typu sytuacji do, np. zerowania rejestrów procesora używa się instrukcji
xor eax, eax
Dobrze skonstruowany shellcode powinien mieć jak najmniejszy rozmiar. Do najmniejszych dziś znanych shellcodów zaliczają się te o rozmiarze 22 bajtów.