2010-03-13 25 views
5

Merhaba Ham makine kodunu belleğe yüklemeye çalışıyorum ve bir C programından çalıştırıyorum; Çalıştırmak için bellekte mprotect. Ayrıca bellek doğru ayarlanmışsa, yürüteceğinden emin değilim. Şu andaYüklemeKodu Dosyaya Belleğe Gönderme ve Yürütme C - mprotect Hata Ayıklama

Ne anda sahip şudur Ubuntu Linux x86 (? Belki sorun Ubuntu'nun aşırı korumadır) bu çalıştırıyorum:

#include <memory.h> 
#include <sys/mman.h> 
#include <stdio.h> 

int main (int argc, char **argv) 
{ 
FILE *fp; 
int sz = 0; 
char *membuf; 
int output = 0; 

fp = fopen(argv[1],"rb"); 

if(fp == NULL) 
{ 
    printf("Failed to open file, aborting!\n"); 
    exit(1); 
} 

fseek(fp, 0L, SEEK_END); 
sz = ftell(fp); 
fseek(fp, 0L, SEEK_SET); 


membuf = (char *)malloc(sz*sizeof(char)); 
if(membuf == NULL) 
{ 
    printf("Failed to allocate memory, aborting!\n"); 
    exit(1); 
} 

    memset(membuf, 0x90, sz*sizeof(char)); 

if(mprotect(membuf, sz*sizeof(char), PROT_EXEC | PROT_READ | PROT_WRITE) == -1) 
{ 
    perror("mprotect"); 
    printf("mprotect failed!!! aborting!\n"); 
    exit(1); 
} 



if(!(fread(membuf, sz*sizeof(char), 1, fp))) 
{ 
    perror("fread"); 
    printf("Read failed, aborting!\n"); 
    exit(1); 
} 
__asm__ 
( 
    "call %%eax;" 
    : "=a" (output) 
     : "a" (membuf) 
); 
printf("Output = %x\n", output); 

return 0; 
} 

Ben derleyici uyarı olsun:

/tmp/ccVnhHak.s: Assembler messages: 
/tmp/ccVnhHak.s:107: Warning: indirect call without `*' 

Bu koda ulaşmak için programımı henüz almadım, dolayısıyla assembler kodumun gerekenleri yapıp yapmadığını göremiyorum.

+0

Hangi işletim sistemi? –

+0

Üzgünüm, bu x86 Linux için özellikle Ubuntu. (Ubuntu'nun aşırı korumasının bununla ilgili bir şey olabileceğini düşünüyorum) – ChartreuseKitsune

+0

Ne tür bir hata? Sadece gdb altında çalışıp izlemeyi denediniz mi, sonra ne olacak? –

cevap

5

Tamam, burada yorumlarla :)

bellek bölgesi

sistem sayfa boyutuna uyum sağlamasını zorunlu bizim tartışma göre cevap bu. posix_memalign() çağrısı bu durumda belleği ayırmanın doğru bir yoludur :)

+0

Bu yüzden, bir sayfa uzunluğu – ChartreuseKitsune

+0

değil, bir dosya uzunluğu değil, varsayım sayfa katları katlarında tahsis edilmesi gerekiyorsa, doğru değil, sadece adres hizalı değil, hizalanmış. Boyut bayt cinsinden verilmiştir.adam için) –

+0

Tamam, bu mprotect hatası geçmiş olsun görünüyor. Kullanma: membuf = (char *) memalign (pagesize, sz * sizeof (char)); Malloc yerine . – ChartreuseKitsune

1

0x90 (noop) baytlarınızdan sonra bir 0xc3 (dönüş talimatı) ekleyin. Programınız çöküyor olabilir, çünkü NOOP'lerin sonuna ya da başlatılmamış belleğe, orada ne olduğunu ya da yürütülebilir sayfanın sonuna ne kalacağını bilen. Yüklediğiniz dosyaya bakmadan gerçekten söyleyemem.

BTW strace bu tür programlar için çok kullanışlıdır. Mprotect'teki hatanın ne olduğunu anlatırdı.

1

Tüm izinleri kullanma PROT_EXEC | PROT_READ | PROT_WRIT ayrıca gerekli değildir ve tehlikeli olabilir. Genelde PROT_WRITE'a ihtiyacınız yoktur, sadece çalıştır ve oku yeterlidir.

Bazı güvenli çekirdekler PROT_EXEC | PROT_WRIT.