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