Shellcode
Oryginalne i pierwotne znaczenie tego słowa odnosiło się do kodu źródłowego, który miał za zadanie otworzyć powłokę systemową.
W dzisiejszych czasach termin ten oznacza instrukcje procesora powstałe w wyniku skompilowania programu napisanego w języku asembler. Ten specjalnie spreparowany kod wykonuje całą brudną robotę i stanowi rdzeń exploita, który ma jedynie za zadanie dostarczyć go w odpowiednie miejsce w pamięci. Shellcode służy crackerom do zdobywania uprawnień superużytkownika.
Przykładowy shellcode zapisany zgodnie z notacja języka C zamieszony 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.