| #define _GNU_SOURCE |
| #include <stdio.h> |
| #include <string.h> |
| #include <sys/mman.h> |
| #include <unistd.h> |
| |
| int main() |
| { |
| FILE *maps; |
| void *vvar_begin, *vvar_end; |
| int found_vvar = 0; |
| |
| maps = fopen("/proc/self/maps", "r"); |
| char buf[1024]; |
| while (fgets(buf, 1024, maps)) { |
| if (strstr(buf, "[vvar]")) { |
| found_vvar = 1; |
| break; |
| } |
| } |
| fclose(maps); |
| |
| if (!found_vvar) { |
| fprintf(stderr, "Could not find vvar mapping\n"); |
| return 1; |
| } |
| |
| sscanf(buf, "%p-%p", &vvar_begin, &vvar_end); |
| |
| fprintf(stderr, "vvar mapping is at 0x%lx to 0x%lx\n", |
| (unsigned long)vvar_begin, (unsigned long)vvar_end); |
| |
| maps = fopen("/proc/self/maps", "r"); |
| mremap(vvar_begin, vvar_end-vvar_begin, vvar_end-vvar_begin, MREMAP_FIXED | MREMAP_MAYMOVE, 0x0badc0de0000); |
| |
| mremap(vvar_begin - 4096, 4096, 4096, MREMAP_FIXED | MREMAP_MAYMOVE, 0x0badc0de0000 - 4096); |
| |
| while (fgets(buf, 1024, maps)) { |
| fprintf(stderr, "%s", buf); |
| } |
| |
| vvar_end = (void*)0x0badc0de0000 + (vvar_end - vvar_begin); |
| vvar_begin = (void*)0x0badc0de0000; |
| |
| write(1, vvar_begin, vvar_end - vvar_begin); |
| |
| mprotect(vvar_begin, vvar_end - vvar_begin, PROT_READ | PROT_WRITE); |
| |
| return 0; |
| } |