From 33a2f4fc3b1dce14857fc1fee04c59d6bb15e5d8 Mon Sep 17 00:00:00 2001 From: an7s <an7s@git.zephyr-software.com> Date: Sun, 30 Oct 2011 16:46:14 +0000 Subject: [PATCH] Backing up... Former-commit-id: 86fc5cab9dbdfe7f4f1ebf2bd5564df869defd3d --- .gitattributes | 3 ++ libMEDSannotation/include/MEDS.hpp | 10 +++++ .../include/MEDS_AnnotationParser.hpp | 5 +++ .../MEDS_InstructionCheckAnnotation.hpp | 31 ++++++++++++++-- libMEDSannotation/include/MEDS_Register.hpp | 17 +++++++++ .../src/MEDS_AnnotationParser.cpp | 1 + .../src/MEDS_InstructionCheckAnnotation.cpp | 37 ++++++++++++++++++- libMEDSannotation/src/MEDS_Register.cpp | 37 +++++++++++++++++++ libMEDSannotation/src/Makefile | 2 +- 9 files changed, 138 insertions(+), 5 deletions(-) create mode 100644 libMEDSannotation/include/MEDS.hpp create mode 100644 libMEDSannotation/include/MEDS_Register.hpp create mode 100644 libMEDSannotation/src/MEDS_Register.cpp diff --git a/.gitattributes b/.gitattributes index bfee7a5fd..2e45f284a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -277,11 +277,14 @@ libIRDB/test/read_variantir.cpp -text libIRDB/test/unfix_calls.cpp -text libIRDB/test/unwind-pe.h -text libMEDSannotation/Makefile -text +libMEDSannotation/include/MEDS.hpp -text libMEDSannotation/include/MEDS_AnnotationParser.hpp -text libMEDSannotation/include/MEDS_InstructionCheckAnnotation.hpp -text +libMEDSannotation/include/MEDS_Register.hpp -text libMEDSannotation/include/VirtualOffset.hpp -text libMEDSannotation/src/MEDS_AnnotationParser.cpp -text libMEDSannotation/src/MEDS_InstructionCheckAnnotation.cpp -text +libMEDSannotation/src/MEDS_Register.cpp -text libMEDSannotation/src/Makefile -text libMEDSannotation/src/VirtualOffset.cpp -text libintegertransform/Makefile -text diff --git a/libMEDSannotation/include/MEDS.hpp b/libMEDSannotation/include/MEDS.hpp new file mode 100644 index 000000000..7560c3798 --- /dev/null +++ b/libMEDSannotation/include/MEDS.hpp @@ -0,0 +1,10 @@ +#ifndef _MEDS_H +#define _MEDS_H + +class MEDS +{ + public: + enum Register { UNKNOWN, EAX, EBX, ECX, EDX }; +} + +#endif diff --git a/libMEDSannotation/include/MEDS_AnnotationParser.hpp b/libMEDSannotation/include/MEDS_AnnotationParser.hpp index 41cdba582..94f9c6dbb 100644 --- a/libMEDSannotation/include/MEDS_AnnotationParser.hpp +++ b/libMEDSannotation/include/MEDS_AnnotationParser.hpp @@ -6,6 +6,9 @@ #include "MEDS_InstructionCheckAnnotation.hpp" #include "VirtualOffset.hpp" +namespace MEDS_Annotation +{ + class MEDS_AnnotationParser { public: @@ -16,4 +19,6 @@ class MEDS_AnnotationParser std::map<VirtualOffset, MEDS_InstructionCheckAnnotation> m_annotations; }; +} + #endif diff --git a/libMEDSannotation/include/MEDS_InstructionCheckAnnotation.hpp b/libMEDSannotation/include/MEDS_InstructionCheckAnnotation.hpp index b1e6a197e..9a0f7c160 100644 --- a/libMEDSannotation/include/MEDS_InstructionCheckAnnotation.hpp +++ b/libMEDSannotation/include/MEDS_InstructionCheckAnnotation.hpp @@ -3,7 +3,13 @@ #include <string> #include "VirtualOffset.hpp" +#include "MEDS_Register.hpp" + +namespace MEDS_Annotation +{ + +// These strings must match those emitted by MEDS in the information annotation file exactly #define MEDS_ANNOT_INSTR "INSTR" #define MEDS_ANNOT_CHECK "CHECK" #define MEDS_ANNOT_OVERFLOW "OVERFLOW" @@ -12,6 +18,10 @@ #define MEDS_ANNOT_TRUNCATION "TRUNCATION" #define MEDS_ANNOT_SIGNED "SIGNED" #define MEDS_ANNOT_UNSIGNED "UNSIGNED" +#define MEDS_ANNOT_UNKNOWNSIGN "UNKNOWNSIGN" + +using namespace std; +using namespace MEDS_Annotation; // // Class to handle one MEDS (integer vulnerability) annotation @@ -20,7 +30,7 @@ class MEDS_InstructionCheckAnnotation { public: MEDS_InstructionCheckAnnotation() { m_isValid = false; } - MEDS_InstructionCheckAnnotation(const std::string &p_rawLine); + MEDS_InstructionCheckAnnotation(const string &p_rawLine); // valid annotation? bool isValid() const { return m_isValid; } @@ -34,25 +44,40 @@ class MEDS_InstructionCheckAnnotation // signed vs. unsigned bool isUnsigned() const { return m_isUnsigned; } bool isSigned() const { return m_isSigned; } + bool isUnknownSign() const { return m_isUnknownSign; } + + // get bitwidth + int getBitWidth() const { return m_bitWidth; } + int getTruncationFromWidth() const { return m_truncationFromWidth; } + int getTruncationToWidth() const { return m_truncationToWidth; } + + // get register + MEDS_Annotation::Register::RegisterName getRegister() const { return m_register; } // virtual offset VirtualOffset getVirtualOffset() const; - std::string& toString() { return m_rawInputLine; } + const string& toString() const { return m_rawInputLine; } private: void parse(); private: - std::string m_rawInputLine; + string m_rawInputLine; bool m_isOverflow; bool m_isUnderflow; bool m_isSignedness; bool m_isTruncation; bool m_isSigned; bool m_isUnsigned; + bool m_isUnknownSign; + int m_bitWidth; + int m_truncationFromWidth; + int m_truncationToWidth; VirtualOffset m_virtualOffset; bool m_isValid; + MEDS_Annotation::Register::RegisterName m_register; }; +} #endif diff --git a/libMEDSannotation/include/MEDS_Register.hpp b/libMEDSannotation/include/MEDS_Register.hpp new file mode 100644 index 000000000..bc0388f04 --- /dev/null +++ b/libMEDSannotation/include/MEDS_Register.hpp @@ -0,0 +1,17 @@ +#ifndef _MEDS_REGISTER_H +#define _MEDS_REGISTER_H + +#include <string> + +namespace MEDS_Annotation +{ + +class Register { +public: + enum RegisterName { UNKNOWN, EAX, EBX, ECX, EDX, AX, BX, CX, DX, AL, BL, CL, DL }; + static RegisterName getRegister(std::string); +}; + +} + +#endif diff --git a/libMEDSannotation/src/MEDS_AnnotationParser.cpp b/libMEDSannotation/src/MEDS_AnnotationParser.cpp index d80fcb35f..dfcc7555e 100644 --- a/libMEDSannotation/src/MEDS_AnnotationParser.cpp +++ b/libMEDSannotation/src/MEDS_AnnotationParser.cpp @@ -4,6 +4,7 @@ #define MAX_BUF_SIZE 2048 using namespace std; +using namespace MEDS_Annotation; MEDS_AnnotationParser::MEDS_AnnotationParser(istream &p_inputStream) { diff --git a/libMEDSannotation/src/MEDS_InstructionCheckAnnotation.cpp b/libMEDSannotation/src/MEDS_InstructionCheckAnnotation.cpp index d8730f620..93591c299 100644 --- a/libMEDSannotation/src/MEDS_InstructionCheckAnnotation.cpp +++ b/libMEDSannotation/src/MEDS_InstructionCheckAnnotation.cpp @@ -2,9 +2,11 @@ #include <cstdio> #include <string> +#include "MEDS_Register.hpp" #include "MEDS_InstructionCheckAnnotation.hpp" using namespace std; +using namespace MEDS_Annotation; /* Example format (as of 10/18/2011) -- subject to change: @@ -29,6 +31,11 @@ MEDS_InstructionCheckAnnotation::MEDS_InstructionCheckAnnotation(const std::stri m_isSignedness = false; m_isSigned = false; m_isUnsigned = false; + m_isUnknownSign = true; + m_bitWidth = -1; + m_truncationFromWidth = -1; + m_truncationToWidth = -1; + m_register = Register::UNKNOWN; parse(); } @@ -43,7 +50,7 @@ void MEDS_InstructionCheckAnnotation::parse() // field 3 - INSTR // field 4 - CHECK // field 5 - {OVERFLOW | UNDERFLOW | SIGNEDNESS | TRUNCATION } - // field 6 - {SIGNED | UNSIGNED | 16 | 32} + // field 6 - {SIGNED | UNSIGNED | UNKNOWNSIGN | 16 | 32} // field 7 - {<register> | <memory reference>} if (m_rawInputLine.find(MEDS_ANNOT_INSTR)==string::npos || m_rawInputLine.find(MEDS_ANNOT_CHECK)==string::npos) @@ -53,6 +60,9 @@ void MEDS_InstructionCheckAnnotation::parse() VirtualOffset vo(m_rawInputLine); m_virtualOffset = vo; + // The annotation format is very simple so we don't bother with any fancy parsing + // Later, this may need to be changed + // get check type if (m_rawInputLine.find(MEDS_ANNOT_OVERFLOW)!=string::npos) m_isOverflow = true; @@ -68,9 +78,34 @@ void MEDS_InstructionCheckAnnotation::parse() // signed vs. unsigned if (m_rawInputLine.find(MEDS_ANNOT_UNSIGNED)!=string::npos) + { m_isUnsigned = true; + m_isUnknownSign = false; + } else if (m_rawInputLine.find(MEDS_ANNOT_SIGNED)!=string::npos) + { m_isSigned = true; + m_isUnknownSign = false; + } + else if (m_rawInputLine.find(MEDS_ANNOT_UNKNOWNSIGN)!=string::npos) + { + m_isUnsigned = false; + m_isSigned = false; + m_isUnknownSign = true; + } + + // get bit width information for overflow & underflow + if (m_isOverflow || m_isUnderflow) + { + sscanf(m_rawInputLine.c_str(), "%*s %*d %*s %*s %*s %*s %d", &m_bitWidth); + } + else if (m_isTruncation) // get bid width from/to information for truncation + { + char buf[1024] = ""; + // [ADDR] [SIZE] INSTR CHECK TRUNCATION UNKNOWNSIGN 32 EAX 16 AX ZZ mov [esp+2Ah], ax + sscanf(m_rawInputLine.c_str(), "%*s %*d %*s %*s %*s %*s %d %s %d", &m_truncationFromWidth, buf, &m_truncationToWidth); + m_register = Register::getRegister(string(buf)); + } m_isValid = true; diff --git a/libMEDSannotation/src/MEDS_Register.cpp b/libMEDSannotation/src/MEDS_Register.cpp new file mode 100644 index 000000000..ba4e829ad --- /dev/null +++ b/libMEDSannotation/src/MEDS_Register.cpp @@ -0,0 +1,37 @@ +#include <string> +#include <strings.h> + +#include "MEDS_Register.hpp" + +using namespace MEDS_Annotation; + +Register::RegisterName Register::getRegister(std::string p_reg) +{ + if (strcasecmp(p_reg.c_str(), "EAX") == 0) + return EAX; + else if (strcasecmp(p_reg.c_str(), "EBX") == 0) + return EBX; + else if (strcasecmp(p_reg.c_str(), "ECX") == 0) + return ECX; + else if (strcasecmp(p_reg.c_str(), "EDX") == 0) + return EDX; + else if (strcasecmp(p_reg.c_str(), "AX") == 0) + return AX; + else if (strcasecmp(p_reg.c_str(), "BX") == 0) + return BX; + else if (strcasecmp(p_reg.c_str(), "CX") == 0) + return CX; + else if (strcasecmp(p_reg.c_str(), "DX") == 0) + return DX; + else if (strcasecmp(p_reg.c_str(), "AL") == 0) + return AL; + else if (strcasecmp(p_reg.c_str(), "BL") == 0) + return BL; + else if (strcasecmp(p_reg.c_str(), "CL") == 0) + return CL; + else if (strcasecmp(p_reg.c_str(), "DL") == 0) + return DL; + else + return UNKNOWN; +} + diff --git a/libMEDSannotation/src/Makefile b/libMEDSannotation/src/Makefile index ce5933b59..76cd72b4e 100644 --- a/libMEDSannotation/src/Makefile +++ b/libMEDSannotation/src/Makefile @@ -1,7 +1,7 @@ LIB=../lib/libMEDSannotation.a -OBJS=VirtualOffset.o MEDS_AnnotationParser.o MEDS_InstructionCheckAnnotation.o +OBJS=VirtualOffset.o MEDS_Register.o MEDS_AnnotationParser.o MEDS_InstructionCheckAnnotation.o all: $(OBJS) -- GitLab