From b078ba9ac199b0bf79937f8c576633e85e9e3105 Mon Sep 17 00:00:00 2001 From: Lucas Schumacher Date: Thu, 11 Jul 2024 13:05:27 -0400 Subject: [PATCH] initial commit --- mem.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 mem.c diff --git a/mem.c b/mem.c new file mode 100644 index 0000000..d57f4c9 --- /dev/null +++ b/mem.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include + +// Global flag and jump buffer for recovery +static jmp_buf env_buffer; +static volatile int enable_handler = 0; + +void segfault_handler(int signal_num) { + if (enable_handler == 1) { + longjmp(env_buffer, 1); + } else { + printf("Segmentation Fault :("); + exit(signal_num); + } +} +int tryDereference(uintptr_t* pointer, uintptr_t* output) { + uintptr_t val; + if (setjmp(env_buffer) == 0) { + enable_handler = 1; + *output = *pointer; + enable_handler = 0; + return 1; + } + else { + enable_handler = 0; + return 0; + } +} +void printMem(uint8_t* location) { + if (setjmp(env_buffer) == 0) { + enable_handler = 1; + printf("%p: 0x%02x\n", location, *location); + enable_handler = 0; + } + else { + enable_handler = 0; + printf("%p: SEGFAULT\n", location); + } +} + + +uint8_t* flipBit(uint8_t* data, int bit) { + return (uint8_t*)((1< 0; p<<=1) ++n; + return n; +} + +int main(int argc, char *argv[]) +{ + signal(SIGSEGV, segfault_handler); + uint32_t nbits = nBits(); + printf("Using %u bit addresses\n", nbits); + + uint8_t a = 0x55; + uint8_t* var = &a; + printMem(var-1); + printMem(var); + printMem(var+1); + for (uint32_t i = 0; i < nbits; ++i) { + //printf("flipping bit %u\n", i); + printMem(flipBit(var, i)); + } + + return EXIT_SUCCESS; +}