From 61f7b74a7e64caf772a8044cd490ee7e342b1392 Mon Sep 17 00:00:00 2001 From: Jason Hiser <jdhiser@gmail.com> Date: Tue, 24 Jul 2018 15:12:24 +0000 Subject: [PATCH] implemented appendPltEntry and appendGotEntry Former-commit-id: 3fee6e2078daeb6c50d7105f93caaf252b4788cb --- libElfDep/include/libElfDep.hpp | 4 ++-- libElfDep/src/elfdep.cpp | 26 ++++++++++++++++++++++---- libElfDep/test/SConscript | 2 +- libElfDep/test/edt.cpp | 24 +++++++++++++++++------- libElfDep/test/elf_dep_test.cpp | 3 +++ libElfDep/test/testit.sh | 13 +++++++++---- 6 files changed, 54 insertions(+), 18 deletions(-) diff --git a/libElfDep/include/libElfDep.hpp b/libElfDep/include/libElfDep.hpp index 7ab48cfaf..b4444eba3 100644 --- a/libElfDep/include/libElfDep.hpp +++ b/libElfDep/include/libElfDep.hpp @@ -55,8 +55,8 @@ class ElfDependencies_t : public Transform private: bool add_dl_support(); Instruction_t* find_runtime_resolve(DataScoop_t* gotplt_scoop); - void add_got_entry(const std::string& name); - bool add_got_entries(); + DataScoop_t* add_got_entry(const std::string& name); + //bool add_got_entries(); bool add_libdl_as_needed_support(string libName); bool execute(); diff --git a/libElfDep/src/elfdep.cpp b/libElfDep/src/elfdep.cpp index dd4762605..9746052bc 100644 --- a/libElfDep/src/elfdep.cpp +++ b/libElfDep/src/elfdep.cpp @@ -185,13 +185,29 @@ ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_Elf_Dyn,reloc_ty template<typename T_Elf_Sym, typename T_Elf_Rela, typename T_Elf_Dyn, int reloc_type, int rela_shift, int ptrsize> pair<DataScoop_t*,int> ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_Elf_Dyn,reloc_type,rela_shift,ptrsize>::appendGotEntry(const string &name) { - assert(0); + auto got_scoop=add_got_entry(name); + return {got_scoop,0}; } template<typename T_Elf_Sym, typename T_Elf_Rela, typename T_Elf_Dyn, int reloc_type, int rela_shift, int ptrsize> Instruction_t* ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_Elf_Dyn,reloc_type,rela_shift,ptrsize>::appendPltEntry(const string &name) { - assert(0); + + static int labelcounter=0; + + stringstream labelstream; + labelstream << "L_pltentry_" << labelcounter++; + + auto got_scoop=add_got_entry(name); + + auto newinsn=addNewAssembly(labelstream.str()+": jmp [rel "+labelstream.str()+"]"); + + auto newreloc=new Relocation_t(BaseObj_t::NOT_IN_DATABASE, 0, "pcrel", got_scoop); + + newinsn->GetRelocations().insert(newreloc); + getFileIR()->GetRelocations().insert(newreloc); + + return newinsn; } @@ -200,7 +216,6 @@ Instruction_t* ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_E // please keep this if 0, as we likely want to add plt/got entries in a library later, but // we need a use case to test this code -- it was copied from CFI. -#if 0 template<typename T_Elf_Sym, typename T_Elf_Rela, typename T_Elf_Dyn, int reloc_type, int rela_shift, int ptrsize> Instruction_t* ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_Elf_Dyn,reloc_type,rela_shift,ptrsize>::find_runtime_resolve(DataScoop_t* gotplt_scoop) @@ -222,7 +237,7 @@ Instruction_t* ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_E } template<typename T_Elf_Sym, typename T_Elf_Rela, typename T_Elf_Dyn, int reloc_type, int rela_shift, int ptrsize> -void ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_Elf_Dyn,reloc_type,rela_shift,ptrsize>::add_got_entry(const std::string& name) +DataScoop_t* ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_Elf_Dyn,reloc_type,rela_shift,ptrsize>::add_got_entry(const std::string& name) { const auto firp=getFileIR(); // find relevant scoops @@ -304,8 +319,11 @@ void ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_Elf_Dyn,rel dyn_entry.d_un.d_val-=sizeof(T_Elf_Rela); } + return external_func_addr_scoop; } +#if 0 + template<typename T_Elf_Sym, typename T_Elf_Rela, typename T_Elf_Dyn, int reloc_type, int rela_shift, int ptrsize> bool ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_Elf_Dyn,reloc_type,rela_shift,ptrsize>::add_got_entries() { diff --git a/libElfDep/test/SConscript b/libElfDep/test/SConscript index 46b24492b..e07d67e74 100644 --- a/libElfDep/test/SConscript +++ b/libElfDep/test/SConscript @@ -10,7 +10,7 @@ myenv.Replace(SECURITY_TRANSFORMS_HOME=os.environ['SECURITY_TRANSFORMS_HOME']) myenv.Replace(ZIPR_HOME=os.environ['ZIPR_HOME']) myenv.Replace(ZIPR_SDK=os.environ['ZIPR_SDK']) myenv.Replace(ZIPR_INSTALL=os.environ['ZIPR_INSTALL']) -myenv.Append(CXXFLAGS = " -std=c++11 -Wall ") +myenv.Replace(CXXFLAGS = " -g -std=c++11 -Wall ") cpppath=''' $SECURITY_TRANSFORMS_HOME/include diff --git a/libElfDep/test/edt.cpp b/libElfDep/test/edt.cpp index dce737d0c..12e1ea24f 100644 --- a/libElfDep/test/edt.cpp +++ b/libElfDep/test/edt.cpp @@ -40,14 +40,24 @@ int ElfDep_Tester_t::execute() // insert the instrumentation - auto tmp=(Instruction_t*)NULL; - auto old_entry=insertAssemblyBefore(getFileIR(), insert_loc," call 0 ", edpcb) ; - (void)old_entry; // avoid warning, but label the return value from insertAssemblyBefore - tmp=insert_loc; - tmp=insertAssemblyAfter(getFileIR(), tmp," mov rcx, [rel 0x0]"); + auto tmp=insert_loc; + (void)insertAssemblyBefore(getFileIR(),tmp," push rdi") ; + tmp= insertAssemblyAfter(getFileIR(), tmp," push rsi ") ; + tmp= insertAssemblyAfter(getFileIR(), tmp," push rdx") ; + tmp= insertAssemblyAfter(getFileIR(), tmp," push rcx ") ; + tmp= insertAssemblyAfter(getFileIR(), tmp," push r8 ") ; + tmp= insertAssemblyAfter(getFileIR(), tmp," push r9 ") ; + tmp= insertAssemblyAfter(getFileIR(), tmp," call 0 ", edpcb) ; + tmp= insertAssemblyAfter(getFileIR(), tmp," L1: mov rcx, [rel L1]"); auto got_insn=tmp; - tmp=insertAssemblyAfter(getFileIR(), tmp," inc [rcx]"); - tmp=insertAssemblyAfter(getFileIR(), tmp," call 0", edpcb); + tmp= insertAssemblyAfter(getFileIR(), tmp," inc dword [rcx]"); + tmp= insertAssemblyAfter(getFileIR(), tmp," call 0", edpcb); + tmp= insertAssemblyAfter(getFileIR(), tmp," pop r9"); + tmp= insertAssemblyAfter(getFileIR(), tmp," pop r8"); + tmp= insertAssemblyAfter(getFileIR(), tmp," pop rcx"); + tmp= insertAssemblyAfter(getFileIR(), tmp," pop rdx"); + tmp= insertAssemblyAfter(getFileIR(), tmp," pop rsi"); + tmp= insertAssemblyAfter(getFileIR(), tmp," pop rdi"); // map the load to point at the GOT entry. diff --git a/libElfDep/test/elf_dep_test.cpp b/libElfDep/test/elf_dep_test.cpp index fef1a6cd0..5f77c041e 100644 --- a/libElfDep/test/elf_dep_test.cpp +++ b/libElfDep/test/elf_dep_test.cpp @@ -1,5 +1,7 @@ #include <stdio.h> +extern "C" +{ int elf_dep_test_var=0; @@ -8,3 +10,4 @@ void elf_dep_test_callback() printf("Elf_dep_test var = %d\n", elf_dep_test_var); } +} diff --git a/libElfDep/test/testit.sh b/libElfDep/test/testit.sh index c8f526e49..051b6c013 100755 --- a/libElfDep/test/testit.sh +++ b/libElfDep/test/testit.sh @@ -2,16 +2,21 @@ cleanup() { - echo test failed. + echo "************" + echo "test failed." + echo "************" exit 1 } + # make sure xforms are built scons || cleanup $PSZ /bin/ls ./xxx -c move_globals=on -o move_globals:--elftables -c edt=on || cleanup -/bin/ls /tmp |tee tmp.out || cleanup -./xxx /tmp |tee edt.out || cleanup +/bin/ls /tmp || cleanup +./xxx /tmp || cleanup -echo test passed. +echo +echo "test passed." +echo -- GitLab