From 01db19f604a5038881d32186514c63a18f3ee3e6 Mon Sep 17 00:00:00 2001 From: bdr7fv <bdr7fv@git.zephyr-software.com> Date: Mon, 28 May 2012 04:46:19 +0000 Subject: [PATCH] Modified OffsetInference to consider dynamic stack frames non-canary safe. Also modified Rewrite_Utility and PnTransformDriver to keep track of inserted instructions so they can be removed on undo. This now sets up the possibility for a binary search style algorithm for transformation. Former-commit-id: 6689033a8143434f3b3e74187d91f6a3f8b34b6d --- tools/transforms/OffsetInference.cpp | 7 ++++ tools/transforms/PNTransformDriver.cpp | 49 ++++++++++++++++++++++---- tools/transforms/PNTransformDriver.hpp | 1 + tools/transforms/Rewrite_Utility.cpp | 7 ++++ 4 files changed, 58 insertions(+), 6 deletions(-) diff --git a/tools/transforms/OffsetInference.cpp b/tools/transforms/OffsetInference.cpp index c2039ad1c..4fba2e4f7 100644 --- a/tools/transforms/OffsetInference.cpp +++ b/tools/transforms/OffsetInference.cpp @@ -403,6 +403,13 @@ void OffsetInference::FindAllOffsets(Function_t *func) pn_p1_offsets->SetStaticStack(false); PN_safe = false; + //Consider this case not canary safe for now + //TODO: can I make this canary safe? + pn_direct_offsets->SetCanarySafe(false); + pn_scaled_offsets->SetCanarySafe(false); + pn_all_offsets->SetCanarySafe(false); + pn_p1_offsets->SetCanarySafe(false); + //TODO: this output should be removed after TNE //only used to give Jason an indication that a //non-static func has been detected. diff --git a/tools/transforms/PNTransformDriver.cpp b/tools/transforms/PNTransformDriver.cpp index 92f6cca2f..c70fbeea9 100644 --- a/tools/transforms/PNTransformDriver.cpp +++ b/tools/transforms/PNTransformDriver.cpp @@ -12,6 +12,8 @@ using namespace libIRDB; //TODO: this var is a hack for TNE extern bool DO_CANARIES; +extern set<Instruction_t*>inserted_instr; +extern set<AddressID_t*>inserted_addr; void sigusr1Handler(int signum); bool PNTransformDriver::timeExpired = false; @@ -301,8 +303,10 @@ bool PNTransformDriver::CanaryTransformHandler(PNStackLayout *layout, Function_t } } //cleanup?? - undo_list.clear();//TODO: handle undo better? - + //undo_list.clear();//TODO: handle undo better? + + reset_undo(); + //TODO: cleanup new_virp? I don't want to double free. //new_pidp->DropFromDB(); @@ -344,7 +348,8 @@ bool PNTransformDriver::PaddingTransformHandler(PNStackLayout *layout, Function_ cerr<<"PNTransformDriver: Final Transformation Success: "<<layout->ToString()<<endl; transformed_history[layout->GetLayoutName()].push_back(layout); success = true; - undo_list.clear(); + //undo_list.clear(); + reset_undo(); } //orig_virp->WriteToDB(); @@ -372,7 +377,8 @@ bool PNTransformDriver::LayoutRandTransformHandler(PNStackLayout *layout, Functi cerr<<"PNTransformDriver: Final Transformation Success: "<<layout->ToString()<<endl; transformed_history[layout->GetLayoutName()].push_back(layout); success = true; - undo_list.clear(); + //undo_list.clear(); + reset_undo(); } //orig_virp->WriteToDB(); @@ -1045,10 +1051,12 @@ bool PNTransformDriver::Canary_Rewrite(PNStackLayout *orig_layout, Function_t *f for(unsigned int i=0;i<canaries.size();i++) { ss.str(""); - ss<<"mov dword [esp+0x"<<hex<<canaries[i].esp_offset<<"], 0x"<<hex<<canaries[i].canary_val; instr = insertAssemblyAfter(virp,instr,ss.str()); - instr->SetComment("Canary Setup: "+ss.str()); + if(i==0) + instr->SetComment("Canary Setup Entry: "+ss.str()); + else + instr->SetComment("Canary Setup: "+ss.str()); } } else if(regexec(&(pn_regex.regex_ret), disasm_str.c_str(),5,pmatch,0)==0) @@ -1678,7 +1686,36 @@ void PNTransformDriver::undo(map<Instruction_t*, Instruction_t*> undo_list, Func // delete orig; } + + + for(set<Instruction_t*>::const_iterator it=inserted_instr.begin(); + it != inserted_instr.end(); + ++it + ) + { + orig_virp->GetInstructions().erase(*it); + delete *it; + } + + for(set<AddressID_t*>::const_iterator it=inserted_addr.begin(); + it != inserted_addr.end(); + ++it + ) + { + orig_virp->GetAddresses().erase(*it); + delete *it; + } + + + reset_undo(); + //undo_list.clear(); +} + +void PNTransformDriver::reset_undo() +{ undo_list.clear(); + inserted_instr.clear(); + inserted_addr.clear(); } void sigusr1Handler(int signum) diff --git a/tools/transforms/PNTransformDriver.hpp b/tools/transforms/PNTransformDriver.hpp index d83965a90..ce8ea7c9b 100644 --- a/tools/transforms/PNTransformDriver.hpp +++ b/tools/transforms/PNTransformDriver.hpp @@ -42,6 +42,7 @@ protected: virtual bool Validate(libIRDB::VariantIR_t *virp, libIRDB::Function_t *func); //virtual void undo(std::map<libIRDB::Instruction_t*,std::string> undo_list, libIRDB::Function_t *func); virtual void undo(std::map<libIRDB::Instruction_t*,libIRDB::Instruction_t*> undo_list, libIRDB::Function_t *func); + virtual void reset_undo(); virtual std::vector<PNStackLayout*> GenerateInferences(libIRDB::Function_t *func, int level); virtual bool ShuffleValidation(int reps, PNStackLayout *layout,libIRDB::Function_t *func); //virtual void GenerateTransforms2(libIRDB::VariantIR_t *virp,std::vector<libIRDB::Function_t*> funcs,std::string BED_script, int progid); diff --git a/tools/transforms/Rewrite_Utility.cpp b/tools/transforms/Rewrite_Utility.cpp index da29cd9b1..d3816e919 100644 --- a/tools/transforms/Rewrite_Utility.cpp +++ b/tools/transforms/Rewrite_Utility.cpp @@ -2,6 +2,9 @@ using namespace std; using namespace libIRDB; +set<Instruction_t*>inserted_instr; //used to undo inserted instructions +set<AddressID_t*>inserted_addr; //used to undo inserted addresses + void setExitCode(VariantIR_t* virp, Instruction_t* exit_code); //For all insertBefore functions: @@ -107,6 +110,10 @@ Instruction_t* allocateNewInstruction(VariantIR_t* virp, db_id_t p_fileID,Functi virp->GetInstructions().insert(instr); virp->GetAddresses().insert(a); + + inserted_instr.insert(instr); + inserted_addr.insert(a); + return instr; } -- GitLab