#include <sys/mman.h> int mprotect(const void *addr, size_t len, int prot);
prot´Â ´ÙÀ½ °ªµéÀÇ ºñÆ® ORÀÌ´Ù:
»õ·Î ¼³Á¤ÇÑ º¸È£ ¸ðµå´Â ±âÁ¸ÀÇ º¸È£ ¸ðµå¸¦ ´ëüÇÑ´Ù. ¿¹¸¦ µé¾î, ÀÌÀü¿¡ ¸Þ¸ð¸®°¡ PROT_READ·Î Ç¥½ÃµÇ¾î Àִµ¥, mprotect°¡ prot¸¦ PROT_WRITE·Î È£ÃâµÈ´Ù¸é, ±× ¿µ¿ªÀº ´õ ÀÌ»ó Àбâ Àü¿ëÀÌ ¾Æ´Ï´Ù.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>
#include <limits.h> /* PAGESIZE ¶§¹®¿¡ */
#ifndef PAGESIZE
#define PAGESIZE 4096
#endif
int
main(void)
{
char *p;
char c;
/* ¹öÆÛ¸¦ ÇÒ´çÇÑ´Ù; ±âº»ÀûÀ¸·Î PROT_READ|PROT_WRITE
º¸È£ ¸ðµå·Î ¼³Á¤µÈ´Ù. */
p = malloc(1024+PAGESIZE-1);
if (!p) {
perror("Couldn't malloc(1024)");
exit(errno);
}
/* PAGESIZEÀÇ ¹è¼ö°¡ µÇµµ·Ï Á¤·Ä; 2ÀÇ Á¦°öÀ¸·Î °¡Á¤ÇÑ´Ù. */
p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));
c = p[666]; /* Àбâ; ok */
p[666] = 42; /* ¾²±â; ok */
/* ¹öÆÛ¸¦ Àбâ Àü¿ëÀ¸·Î ÇÑ´Ù. */
if (mprotect(p, 1024, PROT_READ)) {
perror("Couldn't mprotect");
exit(errno);
}
c = p[666]; /* Àбâ; ok */
p[666] = 42; /* ¾²±â; ÇÁ·Î±×·¥Àº SIGSEGV·Î Á״´Ù. */
exit(0);
}