close

Shell kód

Ugrás a navigációhoz Ugrás a kereséshez

A shellkód általában assembly nyelven programozott parancsok halmaza, amelyeket műveleti kódokba (hexadecimális értékek halmazába) adnak át, amelyeket általában a program végrehajtási veremébe (vagy veremébe) injektálnak , hogy a gépet, amelyen az található, végrehajtsa az ütemezett műveletet. .

Term

A shellcode kifejezés az általános céljukból ered, ez volt a shell megszerzésére használt exploit része , jelenleg ez a leggyakoribb cél, amire használják őket.

Pascal shellcode példa

A shellkód végrehajtásához általában magasabb szintű nyelvet használnak, például a Pascal nyelvet . Az összeállítási kódunkból nyert műveleti kódok egy bájt típusú tömbben vannak felsorolva, és betöltődnek a meghívandó prototípusba.

Példa a shellkódra a következő:

 Prototípus futtatása
 
 'Változók. 
 Var ShellCode[]: Byte  ' Az OpCode bájttömbje. 
 Var Prototype:Exec    ' A ShellCode-ot végrehajtó prototípus.
 
 ' Inicializálja/töltse be a ShellCode-ot.
 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]
 
 – Beállítottuk a prototípus kódját a végrehajtásra.
 Prototype@ = ShellCode[0]@
 
 Futtatjuk a ShellCode-ot.
 Prototípus

Amint látható, az opkódok hexadecimális értékek, amelyeket bájtokká alakítanak át (0 és 255 közötti egész számok), és amelyeket az operációs rendszer összeállítási kódként értelmez, amelyet végrehajt.

C shellcode példa

A következő példa egy shellkódot mutat be, amely egy C nyelven írt program tömbjében található:

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

Tehát azt kaptuk, hogy a shellkód hexadecimális jelöléssel írt gépi kód . Később a C nyelven írt programokon belül használják őket, például a következő shellkód mintában:

// shellcode.c
// fordítás a gcc shellcode.c -o shellcode segítségével
void main()
{
((érvénytelen(*)(érvénytelen))
{
"\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"
}
)();
}

Vagy ez a másik:

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

Információ

A shellkódoknak rövidnek kell lenniük ahhoz, hogy a verembe fecskendezhetők, ami általában egy kis hely.

A shellkódok a kód bizonyos sérülékenységeinek kihasználásával, a puffertúlcsordulásnak nevezett kód futtatására szolgálnak . Főleg a shellkód úgy van programozva, hogy lehetővé tegye a parancsértelmező futtatását a fertőzött számítógépen.

Gyakori, hogy egy shellkód fordítása során null byte keletkezik , amit ki kell iktatni belőle, mert leállítanák a shellkód végrehajtását. Ennek érdekében a programozó különféle technikákat alkalmaz, például lecseréli a NULL bájtokat generáló utasításokat olyanokra, amelyek nem, vagy XOR műveletet hajt végre, kisebb regiszterekre (például AH, AL) lép át, és így lehetővé teszi, hogy a shellkód valóban injektálható legyen. .

Lásd még