#define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #define NPAG 200 int main(int argc, char *argv[]) { char *src, *dst, *ptr, buf[255]; if ((src = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0)) == MAP_FAILED) { perror("mmap()"); return 1; } printf("mapped to %p\n", src); if ((dst = mremap(src, getpagesize(), NPAG * getpagesize(), MREMAP_MAYMOVE)) == MAP_FAILED) { perror("mremap()"); return 1; } sprintf(buf, "cat /proc/%i/maps", getpid()); system(buf); fflush(stdout); ptr = dst + (NPAG - 5) * getpagesize(); printf("trying %p (%p)...\n", ptr, ptr-dst); *ptr = 20; printf("%#x, works!\n", *ptr); ptr = dst + (NPAG - 3) * getpagesize(); printf("trying %p (%p)...\n", ptr, ptr-dst); *ptr = 20; printf("%#x, works!\n", *ptr); return 0; }