2011-12-17 12 views
8

Herkese selam,Kabuk kodunun char [] dizisi ve char * olarak bildirilmesi arasındaki fark nedir?

Temel kabuk kodlamayı öğrenmeye çalışıyorum ve birilerinin bana açıklayabileceğini umduğum bir şeyle karşılaşıyorum. Aşağıdaki kodu iki şekilde derledim: kabuk kodunu bir dizi olarak ve bir char * olarak bildirmek. Bir kod olarak kabuk kodunu bildirdiğimde, linux veri yürütmeye çalıştığımı ve ilk komutta bir segfault aldığımı algılıyor. Ancak, kabuk kodunu bir char olarak bildirdiğimde * tüm kabuk kodu yürütülür ve bir "Merhaba dünya!" Olur. Derleyici bu iki bildirimi nasıl farklı şekilde ele alır ve neden bellekte korunmayan bellekte neden sonlanır? Şimdiden teşekkürler. Bir char[] olarak ilan zaman

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

/* This declaration ends in a segfault */ 
//char shellcode[] = 

/* This declaration ends in successful execution */ 
char* shellcode = 

/* Shellcode prints "Hello world!" and exits */  
"\xeb\x1f\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\xb0\x04\xb3\x01\x59\xb2\x0c\xcd\x80\x48\x31\xc0\xb0\x01\x48\x31\xdb\xcd\x80\xe8\xdc\xff\xff\xff\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21"; 

int main() 
{ 
    void (*f)(); 
    f = (void (*)())shellcode; 
    (void)(*f)(); 
} 

cevap

8

, bellek yığını üzerindedir. Bir char* olarak bildirdiğinizde ve ona bir dize değişmezini atadığınızda, bellek yürütülebilir resmin kendisidir. Linux, yığın üzerinde kod yürütmeyi sevmez, ancak yürütülebilir görüntünün bu bölümünde belleği yürütmenizde sorun yoktur. Bunun nedeni, insanların bazı rastgele komutlarla yığının üzerine taşabileceği ve daha sonra bunları yürütebileceği belirli bir yığın taşma saldırısından kaçınmaya çalışılmasıdır.

Windows'ta bir bellek bölgesi veya VirtualProtectEx izinlerini ayarlamak için Linux'ta mprotect kullanabilirsiniz. Bu şekilde, yürütülebilir belleğin izinlerini açıkça belirtebilirsiniz. İlk durumda

3

:

char shellcode[] = 

Bu, yerel bir dizi olarak yığın edebi dize koyar. Yığın ve yığın belleği genellikle yürütme izinlerine sahip değildir (güvenlik açık nedenleriyle). İkinci durumda

:

char* shellcode = 

dize statik bellekte yaşıyor - yürütülebilir - genelde programın ikili geri kalanıyla aynı bölgede.

İlgili konular