2012-06-21 8 views
7

ヒープメモリのチャンクを読み取り専用にしたい。私はmemalign()mprotect()で試しましたが、memalignから何が得られるのですか?memalignはプロセスヒープからメモリを割り当てます。どのように私はLinuxでヒープメモリを保護することができますか?

ヒープの一部を読み取り専用にしたいと考えています。それについての助け?

malloc()->mmap()->mprotect()仮説的な考えですが、それが助けになるかどうかわからない...上記の実装するサンプルコードはありますか?

ヒープ内のメモリアドレスを保護する必要があります。 malloc()で私はmmapを持つのに対し、0x10012008の周りのアドレスを取得する()、それは0xf7ec9000.Myの意図がそのヒープを介して実行しようとする可能性のあるトランプラーをキャッチするためにのみ読み取ることがヒープmeoryの一部にすることです。

答えて

4

はい、MMAPとmprotectのは右の関数です。私はあなたの現在のapprochの問題が何であるかを理解していません。つまり、 "memalign()でmprotect()を試してみましたが、memalignmentから何が得られるのですか?memalignはプロセスヒープからメモリを割り当てます"

#include <fcntl.h> 
#include <signal.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/mman.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <unistd.h> 

static int alloc_size; 
static char* memory; 

void segv_handler (int signal_number) { 
printf ("memory accessed!\n"); 
mprotect (memory, alloc_size, PROT_READ | PROT_WRITE); 
} 

int main() { 
int fd; 
struct sigaction sa; 

/* Install segv_handler as the handler for SIGSEGV. */ 
memset (&sa, 0, sizeof (sa)); 
    sa.sa_handler = &segv_handler; 
sigaction (SIGSEGV, &sa, NULL); 

/* Allocate one page of memory by mapping /dev/zero. Map the memory 
as write-only, initially. */ 
    alloc_size = getpagesize(); 
fd = open ("/dev/zero", O_RDONLY); 
    memory = mmap (NULL, alloc_size, PROT_WRITE, MAP_PRIVATE, fd, 0); 
    close (fd); 
    /* Write to the page to obtain a private copy. */ 
    memory[0] = 0; 
/* Make the memory unwritable. */ 
    mprotect (memory, alloc_size, PROT_NONE); 

/* Write to the allocated memory region. */ 
memory[0] = 1; 

    /* All done; unmap the memory. */ 
printf ("all done\n"); 
munmap (memory, alloc_size); 
return 0; 
} 
+5

'MAP_ANONYMOUS'を使用し、' fopen() 'e.t.cの全体を避けることをお勧めします。奇妙なこと? – thkala

+4

マイナーnitpick: 'printf'ではありません[非同期安全](https://www.securecoding.cert.org/confluence/display/seccode/SIG30-C.+Call+only+asynchronous-safe+functions+within+シグナル+ハンドラ) – Flexo

2

あなたが直接mmap()を使用し、完全にmalloc()をドロップする必要があります。以下は

は、書き込み保護されたメモリ領域を作成する方法の例です。そして、あなたのニーズに応じて、あなたは全く mprotect()を必要としないことがあります。最近のカーネルとlibcの実装に

ptr = mmap(NULL, length, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); 

が、これは指定された保護モードでメモリの要求量を割り当てます - この場合には、割り当てられたメモリ領域することができます読まれるだけですが、書かれません。あなたがゼロページの束だけを必要とすれば、それはそうするでしょう。それ以外の場合、結果の領域は正しく整列され、mprotect()を使用して制御された方法で短期間保護を解除することができます。

関連する問題