2012-06-21 21 views
7

Tôi muốn tạo một bộ nhớ heap chỉ đọc. Cho rằng tôi đã thử với memalign() với mprotect(). Nhưng từ bản ghi nhớ những gì tôi có thể nhận được, memalign phân bổ bộ nhớ ra khỏi đống quá trình.làm cách nào để bảo vệ bộ nhớ heap trong linux?

Tôi muốn thực hiện một số phần của chỉ đọc vùng heap. Bất kỳ trợ giúp về điều đó?

malloc()->mmap()->mprotect() suy nghĩ giả định, nhưng không chắc liệu điều đó có thể giúp ... Bất kỳ mã mẫu nào để thực hiện ở trên không?

Tôi cần bảo vệ địa chỉ bộ nhớ trong vùng lưu trữ. với malloc() tôi nhận được địa chỉ xung quanh 0x10012008 trong khi với mmap() nó là 0xf7ec9000.My ý định là làm cho một phần của heap-meory để được đọc chỉ để bắt bất kỳ trampler có thể cố gắng để chạy qua heap đó.

Trả lời

4

Có, mmap và mprotect là các chức năng phù hợp. Tôi không hiểu vấn đề với sự chấp thuận hiện tại của bạn, nghĩa là, ý của bạn là gì "Vì điều đó tôi đã thử với memalign() với mprotect(). Nhưng từ memalignment tôi có thể nhận được gì, memalign cấp phát bộ nhớ ra khỏi quá trình heap . "

Dưới đây là một ví dụ làm thế nào để tạo ra một khu vực bộ nhớ ghi-bảo vệ:

#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

Tôi có thể đề xuất sử dụng 'MAP_ANONYMOUS' và tránh toàn bộ' fopen() 'e.t.c. sự kì lạ? – thkala

+4

Nitro nhỏ: 'printf' không phải là [Không an toàn] (https://www.securecoding.cert.org/confluence/display/seccode/SIG30-C.+Call+only+asynchronous-safe+functions+within+ tín hiệu + xử lý) – Flexo

2

Bạn nên sử dụng mmap() trực tiếp và thả malloc() hoàn toàn. Và, tùy thuộc vào nhu cầu của bạn, bạn có thể không cần mprotect() tại tất cả:

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

On hạt nhân gần đây và triển khai libc này sẽ phân bổ số tiền yêu cầu bộ nhớ với chế độ bảo vệ theo quy định - trong trường hợp này, khu vực bộ nhớ được phân bổ có thể chỉ được đọc, nhưng không được viết. Nếu bạn chỉ cần một loạt các trang không, điều đó sẽ làm. Nếu không, khu vực kết quả sẽ được căn chỉnh đúng cách và bạn có thể sử dụng mprotect() để không bảo vệ nó trong một khoảng thời gian ngắn ...

Các vấn đề liên quan