Skip to content
Snippets Groups Projects
Commit 61f7b74a authored by Jason Hiser's avatar Jason Hiser :tractor:
Browse files

implemented appendPltEntry and appendGotEntry

Former-commit-id: 3fee6e2078daeb6c50d7105f93caaf252b4788cb
parent d1190f02
Branches
Tags cfar-phase3-final
No related merge requests found
...@@ -55,8 +55,8 @@ class ElfDependencies_t : public Transform ...@@ -55,8 +55,8 @@ class ElfDependencies_t : public Transform
private: private:
bool add_dl_support(); bool add_dl_support();
Instruction_t* find_runtime_resolve(DataScoop_t* gotplt_scoop); Instruction_t* find_runtime_resolve(DataScoop_t* gotplt_scoop);
void add_got_entry(const std::string& name); DataScoop_t* add_got_entry(const std::string& name);
bool add_got_entries(); //bool add_got_entries();
bool add_libdl_as_needed_support(string libName); bool add_libdl_as_needed_support(string libName);
bool execute(); bool execute();
......
...@@ -185,13 +185,29 @@ ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_Elf_Dyn,reloc_ty ...@@ -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> 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) 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> 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) 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 ...@@ -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 // 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. // 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> 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) 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 ...@@ -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> 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(); const auto firp=getFileIR();
// find relevant scoops // find relevant scoops
...@@ -304,8 +319,11 @@ void ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_Elf_Dyn,rel ...@@ -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); 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> 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() bool ElfDependencies_t::ElfDependenciesImpl_t<T_Elf_Sym,T_Elf_Rela,T_Elf_Dyn,reloc_type,rela_shift,ptrsize>::add_got_entries()
{ {
......
...@@ -10,7 +10,7 @@ myenv.Replace(SECURITY_TRANSFORMS_HOME=os.environ['SECURITY_TRANSFORMS_HOME']) ...@@ -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_HOME=os.environ['ZIPR_HOME'])
myenv.Replace(ZIPR_SDK=os.environ['ZIPR_SDK']) myenv.Replace(ZIPR_SDK=os.environ['ZIPR_SDK'])
myenv.Replace(ZIPR_INSTALL=os.environ['ZIPR_INSTALL']) myenv.Replace(ZIPR_INSTALL=os.environ['ZIPR_INSTALL'])
myenv.Append(CXXFLAGS = " -std=c++11 -Wall ") myenv.Replace(CXXFLAGS = " -g -std=c++11 -Wall ")
cpppath=''' cpppath='''
$SECURITY_TRANSFORMS_HOME/include $SECURITY_TRANSFORMS_HOME/include
......
...@@ -40,14 +40,24 @@ int ElfDep_Tester_t::execute() ...@@ -40,14 +40,24 @@ int ElfDep_Tester_t::execute()
// insert the instrumentation // insert the instrumentation
auto tmp=(Instruction_t*)NULL; auto tmp=insert_loc;
auto old_entry=insertAssemblyBefore(getFileIR(), insert_loc," call 0 ", edpcb) ; (void)insertAssemblyBefore(getFileIR(),tmp," push rdi") ;
(void)old_entry; // avoid warning, but label the return value from insertAssemblyBefore tmp= insertAssemblyAfter(getFileIR(), tmp," push rsi ") ;
tmp=insert_loc; tmp= insertAssemblyAfter(getFileIR(), tmp," push rdx") ;
tmp=insertAssemblyAfter(getFileIR(), tmp," mov rcx, [rel 0x0]"); 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; auto got_insn=tmp;
tmp=insertAssemblyAfter(getFileIR(), tmp," inc [rcx]"); tmp= insertAssemblyAfter(getFileIR(), tmp," inc dword [rcx]");
tmp=insertAssemblyAfter(getFileIR(), tmp," call 0", edpcb); 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. // map the load to point at the GOT entry.
......
#include <stdio.h> #include <stdio.h>
extern "C"
{
int elf_dep_test_var=0; int elf_dep_test_var=0;
...@@ -8,3 +10,4 @@ void elf_dep_test_callback() ...@@ -8,3 +10,4 @@ void elf_dep_test_callback()
printf("Elf_dep_test var = %d\n", elf_dep_test_var); printf("Elf_dep_test var = %d\n", elf_dep_test_var);
} }
}
...@@ -2,16 +2,21 @@ ...@@ -2,16 +2,21 @@
cleanup() cleanup()
{ {
echo test failed. echo "************"
echo "test failed."
echo "************"
exit 1 exit 1
} }
# make sure xforms are built # make sure xforms are built
scons || cleanup scons || cleanup
$PSZ /bin/ls ./xxx -c move_globals=on -o move_globals:--elftables -c edt=on || cleanup $PSZ /bin/ls ./xxx -c move_globals=on -o move_globals:--elftables -c edt=on || cleanup
/bin/ls /tmp |tee tmp.out || cleanup /bin/ls /tmp || cleanup
./xxx /tmp |tee edt.out || cleanup ./xxx /tmp || cleanup
echo test passed. echo
echo "test passed."
echo
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment