For my bachelor thesis i want to visualize the data remanence of memory and how it persists after rebooting a system.
I had the simple idea to mmap a picture to memory, shut down my computer, wait x seconds, boot the computer and see if the picture is still there.
int mmap_lena(void) { FILE *fd = NULL; size_t lena_size; void *addr = NULL; fd = fopen("lena.png", "r"); fseek(fd, 0, SEEK_END); lena_size = ftell(fd); addr = mmap((void *) 0x12345678, (size_t) lena_size, (int) PROT_READ, (int) MAP_SHARED, (int) fileno(fd), (off_t) 0); fprintf(stdout, "Addr = %p\n", addr); munmap((void *) addr, (size_t) lena_size); fclose(fd); fclose(fd_log); return EXIT_SUCCESS; }
I ommitted checking return values for clarities sake.
So after the mmap i tried to somehow get the address, but i usually end up with a segmentation fault as to my understanding the memory is protected by my operating system.
int fetch_lena(void) { FILE *fd = NULL; FILE *fd_out = NULL; size_t lenna_size; FILE *addr = (FILE *) 0x12346000; fd = fopen("lena.png", "r"); fd_out = fopen("lena_out.png", "rw"); fseek(fd, 0, SEEK_END); lenna_size = ftell(fd); // Segfault fwrite((FILE *) addr, (size_t) 1, (size_t) lenna_size, (FILE *) fd_out); fclose(fd); fclose(fd_out); return 0; }
Please also note that i hard coded the adresses in this example, so whenever you run mmap_lena the value i use in fetch_lena could be wrong as the operating system takes the first parameter to mmap only as a hint (on my system it always defaults to 0x12346000 somehow).
If there is any trivial coding error i am sorry as my C skills have not fully developed.
I would like to now if there is any way to get to the data i want without implementing any malloc hooks or memory allocator hacks.
Thanks in advance, David