diff --git a/datashadow/datashadow_callbacks.c b/datashadow/datashadow_callbacks.c index dd5c1b79375a64acf936db9ddc0d79726610cdf7..a744b5b78bc902801a0c0b6177056263a3886094 100644 --- a/datashadow/datashadow_callbacks.c +++ b/datashadow/datashadow_callbacks.c @@ -1,8 +1,9 @@ /* - * Function pointer shadowing + * Function pointer/data shadowing */ #include <stdlib.h> + #ifdef STRATA #include "all.h" #include "../insn.h" @@ -15,7 +16,6 @@ static char strata_detector_policy_str[128]; // "exit" or "continue" // specifies policy when detector triggers static int strata_detector_policy = P_CONTROLLED_EXIT; - __attribute__ ((externally_visible)) __attribute((used)) void fptr_shadow_define_64(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void *p_shadowValue); __attribute__ ((externally_visible)) __attribute((used)) void fptr_shadow_check_64(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void **p_shadowValue); @@ -84,54 +84,103 @@ static void getDiagnostics(char *p_diagnostic, int p_shadowIndex, void* p_shadow } #endif +static void my_strcpy(char *dest, char *src) +{ + if (!src) return; + 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(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void *p_shadowValue) +void fptr_shadow_define_64(void *p_retAddress, void *p_instrumented, int p_shadowIndex, void *p_shadowValue) { -#ifdef STRATA char msg[MAX_DIAGNOSTIC_SIZE]; -#endif add_shadow_entry(p_shadowIndex, p_shadowValue); #ifdef STRATA - strata_sprintf(msg,"FPTRSHADOW:DEFINE shadowid[%d] shadowvalue[0x%p]", p_shadowIndex, p_shadowValue); + strata_sprintf(msg,"FPTRSHADOW:DEFINE shadowid[%d] shadowvalue[0x%p]\n", p_shadowIndex, p_shadowValue); detected_error(CWE_NONE, CWE_NONE, E_FPTR_OVERWRITE, msg, D_BUFFER, P_CONTINUE_EXECUTION); +#else + // @todo: print first and last element of p_rv and see what we get + // verify against pushed values in the transform + my_strcpy(msg, "FPTRSHADOW:DEFINE "); + my_strcpy(&msg[strlen(msg)], " retaddress: "); + itox(p_retAddress, &msg[strlen(msg)]); +/* + my_strcpy(&msg[strlen(msg)], " reg_values: "); + itox(p_rv, &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: "); + itox(p_shadowValue, &msg[strlen(msg)]); + my_strcpy(&msg[strlen(msg)], " \n"); + write(1, msg, strlen(msg)); #endif } // check to make sure values match -void fptr_shadow_check_64(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void **p_shadow) +//void fptr_shadow_check_64(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void **p_shadow) +void fptr_shadow_check_64(void *p_retAddress, void *p_instrumented, int p_shadowIndex, void **p_shadow) { -#ifdef STRATA char msg[MAX_DIAGNOSTIC_SIZE]; -#endif void *restored; int count = 0; -/* - sprintf(msg, "FPTRCHECK:ENTER shadowid[%d] value[0x%p]", p_shadowIndex, *p_shadow); +#ifdef STRATA + strata_sprintf(msg, "FPTRSHADOW:CHECK shadowid[%d] value[0x%p]\n", p_shadowIndex, *p_shadow); detected_error(CWE_NONE, CWE_NONE, E_FPTR_OVERWRITE, msg, D_BUFFER, P_CONTINUE_EXECUTION); -*/ +#else + my_strcpy(msg, "FPTRSHADOW:CHECK: "); + 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)], " shadowValue: "); + itox(*p_shadow, &msg[strlen(msg)]); + my_strcpy(&msg[strlen(msg)], " \n"); + write(1, msg, strlen(msg)); +#endif int success = check_shadow_value(p_shadowIndex, *p_shadow, &restored, &count); if (!success) { // oh oh, need to restore #ifdef STRATA - strata_sprintf(msg,"FPTRCHECK:RESTORE shadowid[%d] value[0x%p] restored[0x%p] #[%d]", p_shadowIndex, *p_shadow, restored, count); + strata_sprintf(msg,"FPTRSHADOW:CHECK shadowid[%d] value[0x%p] restored[0x%p] #[%d]", p_shadowIndex, *p_shadow, restored, count); #endif *p_shadow = restored; #ifdef STRATA detected_error(CWE_NONE, CWE_NONE, E_FPTR_OVERWRITE, msg, D_BUFFER, P_CONTINUE_EXECUTION); +#else + my_strcpy(msg, "FPTRSHADOW:CHECK failed: "); + my_strcpy(&msg[strlen(msg)], " value saved: "); + itox(restored, &msg[strlen(msg)]); + my_strcpy(&msg[strlen(msg)], " restoredValue(copy out): "); + itox(*p_shadow, &msg[strlen(msg)]); + my_strcpy(&msg[strlen(msg)], " \n"); + write(1, msg, strlen(msg)); #endif } else { #ifdef STRATA - strata_sprintf(msg,"FPTRCHECK:OK shadowid[%d] value[0x%p] shadow[0x%p] #[%d]", p_shadowIndex, *p_shadow, restored, count); + strata_sprintf(msg,"FPTRSHADOW:OK shadowid[%d] value[0x%p] shadow[0x%p] #[%d]", p_shadowIndex, *p_shadow, restored, count); detected_error(CWE_NONE, CWE_NONE, E_FPTR_OVERWRITE, msg, D_BUFFER, P_CONTINUE_EXECUTION); +#else + my_strcpy(msg, "FPTRSHADOW: OK: "); + my_strcpy(&msg[strlen(msg)], " shadowValue: "); + itox(*p_shadow, &msg[strlen(msg)]); + my_strcpy(&msg[strlen(msg)], " \n"); + write(1, msg, strlen(msg)); #endif } }