blob: dce7b662d140b8d6dc5c5f40f951b974e38a13b8 [file] [log] [blame]
#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;
}