diff --git a/configure_for_datashadow b/configure_for_datashadow index 7d3d1ab9653e53923ef74a8e8064572123d2aa71..6bc959f2acc3dacef0d00fb74ae71c62155a22d1 100755 --- a/configure_for_datashadow +++ b/configure_for_datashadow @@ -1,3 +1,5 @@ #!/bin/bash -./configure --enable-debugging --enable-datashadow --enable-libc --prefix=$ZIPR_INSTALL $* +#./configure --enable-debugging --enable-datashadow --enable-libc --prefix=$ZIPR_INSTALL $* +./configure --enable-datashadow --enable-libc --prefix=$ZIPR_INSTALL $* + diff --git a/datashadow/datashadow_callbacks.c b/datashadow/datashadow_callbacks.c index 4636c740889fa205a69ee75cfa88d8c403cc35cb..d745c737eb7b782a41915238b557be24acabba25 100644 --- a/datashadow/datashadow_callbacks.c +++ b/datashadow/datashadow_callbacks.c @@ -2,40 +2,13 @@ * Function pointer/data shadowing */ -#include <stdlib.h> - -// -// When writing a callback handler/detector -// -// argument #1 : return address -// argument #2 : register data structure -// argument #3..#6: optional set of args specific to the callback handler -// +// #include <stdlib.h> #define MAX_DIAGNOSTIC_SIZE 1024 -/* the registers are saved onto the stack in this order */ -typedef struct reg_values reg_values_t; -struct reg_values -{ - size_t flags; - size_t r15; - size_t r14; - size_t r13; - size_t r12; - size_t r11; - size_t r10; - size_t r9; - size_t r8; - size_t rax; - size_t rbx; - size_t rcx; - size_t rdx; - size_t rsi; - size_t rdi; - size_t rbp; - size_t rsp; -}; +// Has to match client side (fptr_shadow) +#define SHADOW_TERMINATE 1 +#define SHADOW_CONTINUE 2 static void my_strcpy(char *dest, char *src) { @@ -43,27 +16,12 @@ static void my_strcpy(char *dest, char *src) while(*dest++ = *src++); } - -// void signedness_detector_signed(void *p_retAddress, reg_values_t *p_rv, void* p_addressTruncated, volatile long int p_policy) -// shadowMap[p_shadowIndex] = p_shadowValue -// add to multi-valued table -//void fptr_shadow_define_64(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void *p_shadowValue) void fptr_shadow_define_64(int p_shadowIndex, void *p_shadowValue) { +#ifdef DEBUG char msg[MAX_DIAGNOSTIC_SIZE]; - add_shadow_entry(p_shadowIndex, p_shadowValue); - - // @todo: print first and last element of p_rv and see what we get - // verify against pushed values in the transform -#ifdef DEBUG my_strcpy(msg, "FPTRSHADOW:DEFINE "); -/* - my_strcpy(&msg[strlen(msg)], " retaddress: "); - itox(p_retAddress, &msg[strlen(msg)]); - my_strcpy(&msg[strlen(msg)], " instrumented: "); - itox(p_instrumented, &msg[strlen(msg)]); -*/ my_strcpy(&msg[strlen(msg)], " shadowid: "); itox(p_shadowIndex, &msg[strlen(msg)]); my_strcpy(&msg[strlen(msg)], " value: "); @@ -72,42 +30,68 @@ void fptr_shadow_define_64(int p_shadowIndex, void *p_shadowValue) write(2, msg, strlen(msg)); #endif + add_shadow_entry(p_shadowIndex, p_shadowValue); } // check to make sure values match void fptr_shadow_check_64(int p_shadowIndex, int p_policy, void **p_shadow) { - char msg[MAX_DIAGNOSTIC_SIZE]; void *restored; int count = 0; +#ifdef DEBUG + char msg[MAX_DIAGNOSTIC_SIZE]; my_strcpy(msg, "FPTRSHADOW:CHECK: "); my_strcpy(&msg[strlen(msg)], " shadowid: "); itox(p_shadowIndex, &msg[strlen(msg)]); + my_strcpy(&msg[strlen(msg)], " policy: "); + itox(p_policy, &msg[strlen(msg)]); + write(2, msg, strlen(msg)); + + my_strcpy(msg, " shadowValue(loc): "); + itox(p_shadow, &msg[strlen(msg)]); write(2, msg, strlen(msg)); my_strcpy(msg, " shadowValue: "); itox(*p_shadow, &msg[strlen(msg)]); my_strcpy(&msg[strlen(msg)], " \n"); write(2, msg, strlen(msg)); +#endif int success = check_shadow_value(p_shadowIndex, *p_shadow, &restored, &count); if (!success) { // oh oh, need to restore *p_shadow = restored; + + switch (p_policy) { + case SHADOW_CONTINUE: +#ifdef DEBUG my_strcpy(msg, "Warning: overwrite of function pointer detected -- restoring saved value: 0x"); itox(*p_shadow, &msg[strlen(msg)]); my_strcpy(&msg[strlen(msg)], " \n"); write(2, msg, strlen(msg)); +#endif + break; + case SHADOW_TERMINATE: + default: + { + char msg[MAX_DIAGNOSTIC_SIZE]; + my_strcpy(msg, "Warning: overwrite of function pointer detected -- induce segfault\n"); + write(2, msg, strlen(msg)); + my_strcpy(0,""); // induce crash + } + + break; + } } else { #ifdef DEBUG - my_strcpy(msg, "FPTRSHADOW: OK: "); - my_strcpy(&msg[strlen(msg)], " shadowValue: "); - itox(*p_shadow, &msg[strlen(msg)]); - my_strcpy(&msg[strlen(msg)], " \n"); - write(2, msg, strlen(msg)); + my_strcpy(msg, "FPTRSHADOW: OK: "); + my_strcpy(&msg[strlen(msg)], " shadowValue: "); + itox(*p_shadow, &msg[strlen(msg)]); + my_strcpy(&msg[strlen(msg)], " \n"); + write(2, msg, strlen(msg)); #endif } }