From cc3abe9bedf66fa45a442053be9f28bb6c3d713d Mon Sep 17 00:00:00 2001 From: an7s <an7s@git.zephyr-software.com> Date: Mon, 1 May 2017 22:10:51 +0000 Subject: [PATCH] Simplified shadow callbacks --- datashadow/datashadow_callbacks.c | 89 +++---------------------------- 1 file changed, 7 insertions(+), 82 deletions(-) diff --git a/datashadow/datashadow_callbacks.c b/datashadow/datashadow_callbacks.c index 858d777..4636c74 100644 --- a/datashadow/datashadow_callbacks.c +++ b/datashadow/datashadow_callbacks.c @@ -4,23 +4,6 @@ #include <stdlib.h> -#ifdef STRATA -#include "all.h" -#include "../insn.h" - -// possible policies expressed as strings passed on the strata command line -#define DETECTOR_POLICY_EXIT_STRING "exit" -#define DETECTOR_POLICY_CONTINUE_STRING "continue" -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); - -#endif - // // When writing a callback handler/detector // @@ -31,21 +14,6 @@ __attribute__ ((externally_visible)) __attribute((used)) void fptr_shadow_check_ #define MAX_DIAGNOSTIC_SIZE 1024 -/* -typedef struct -{ - int edi; - int esi; - int ebp; - int esp_dummy; - int ebx; - int edx; - int ecx; - int eax; - int flags; -} reg_values_t; -*/ - /* the registers are saved onto the stack in this order */ typedef struct reg_values reg_values_t; struct reg_values @@ -69,21 +37,6 @@ struct reg_values size_t rsp; }; -#ifdef STRATA -// leave this function so that the linker includes this file -void data_shadow_init() -{ -} - -static void getDiagnostics(char *p_diagnostic, int p_shadowIndex, void* p_shadow, char *p_msg) -{ - strata_sprintf(p_msg, "diagnosis:%s shadowid:%d shadowval:0x%p", - p_diagnostic, - p_shadowIndex, - p_shadow); -} -#endif - static void my_strcpy(char *dest, char *src) { if (!src) return; @@ -95,25 +48,22 @@ static void my_strcpy(char *dest, char *src) // 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, void *p_instrumented, int p_shadowIndex, void *p_shadowValue) +void fptr_shadow_define_64(int p_shadowIndex, void *p_shadowValue) { char msg[MAX_DIAGNOSTIC_SIZE]; add_shadow_entry(p_shadowIndex, p_shadowValue); -#ifdef STRATA - 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 #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: "); @@ -122,67 +72,42 @@ void fptr_shadow_define_64(void *p_retAddress, void *p_instrumented, int p_shado write(2, msg, strlen(msg)); #endif -#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, void *p_instrumented, int p_shadowIndex, void **p_shadow) +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 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 - -#ifdef DEBUG 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: "); + 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 - -#endif int success = check_shadow_value(p_shadowIndex, *p_shadow, &restored, &count); if (!success) { // oh oh, need to restore -#ifdef STRATA - 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, "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 } else { -#ifdef STRATA - 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 #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)); -#endif #endif } } -- GitLab