Skip to content

Commit 1ffd063

Browse files
clubby789negasora
authored andcommitted
Add Elf{32,64}_{Rel,Rela} table to ELF view
1 parent 750c2ff commit 1ffd063

File tree

2 files changed

+73
-17
lines changed

2 files changed

+73
-17
lines changed

view/elf/elfview.cpp

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ ElfView::ElfView(BinaryView* data, bool parseOnly): BinaryView("ELF", data->GetF
6464
memset(&m_dynamicSymbolTableSection, 0, sizeof(m_dynamicSymbolTableSection));
6565
memset(&m_dynamicStringTable, 0, sizeof(m_dynamicStringTable));
6666
memset(&m_dynamicTable, 0, sizeof(m_dynamicTable));
67+
memset(&m_relocSection, 0, sizeof(m_relocSection));
68+
memset(&m_relocaSection, 0, sizeof(m_relocaSection));
6769
memset(&m_tlsSegment, 0, sizeof(m_tlsSegment));
6870
memset(&m_auxSymbolTable, 0, sizeof(m_auxSymbolTable));
6971
memset(&m_sectionStringTable, 0, sizeof(m_sectionStringTable));
@@ -784,10 +786,8 @@ bool ElfView::Init()
784786
uint64_t adjustedVirtualAddr = m_dynamicTable.virtualAddress + imageBaseAdjustment;
785787
reader.Seek(adjustedVirtualAddr - dynSeg->GetStart() + dynSeg->GetDataOffset());
786788

787-
Elf64SectionHeader reloca, plt, rel;
788-
memset(&reloca, 0, sizeof(reloca));
789+
Elf64SectionHeader plt;
789790
memset(&plt, 0, sizeof(plt));
790-
memset(&rel, 0, sizeof(rel));
791791
uint64_t pltType = ELF_DT_RELA;
792792
bool end = false;
793793
uint64_t entrySize = m_elf32 ? 8 : 16;
@@ -852,25 +852,25 @@ bool ElfView::Init()
852852
m_gnuHashHeader = value + imageBaseAdjustment;
853853
break;
854854
case ELF_DT_RELA:
855-
reloca.offset = value + imageBaseAdjustment;
855+
m_relocaSection.offset = value + imageBaseAdjustment;
856856
break;
857857
case ELF_DT_RELASZ:
858-
reloca.size = value;
858+
m_relocaSection.size = value;
859859
break;
860860
case ELF_DT_RELAENT:
861-
reloca.entrySize = value;
861+
m_relocaSection.entrySize = value;
862862
break;
863863
case ELF_DT_STRSZ:
864864
m_dynamicStringTable.size = value;
865865
break;
866866
case ELF_DT_REL:
867-
rel.offset = value + imageBaseAdjustment;
867+
m_relocSection.offset = value + imageBaseAdjustment;
868868
break;
869869
case ELF_DT_RELSZ:
870-
rel.size = value;
870+
m_relocSection.size = value;
871871
break;
872872
case ELF_DT_RELENT:
873-
rel.entrySize = value;
873+
m_relocSection.entrySize = value;
874874
break;
875875
case ELF_DT_PLTGOT:
876876
gotStart = value + imageBaseAdjustment;
@@ -925,16 +925,17 @@ bool ElfView::Init()
925925
StoreMetadata("Libraries", new Metadata(libraries), true);
926926
StoreMetadata("LibraryFound", new Metadata(libraryFound), true);
927927

928-
if (reloca.size > 0)
928+
if (m_relocaSection.size > 0)
929929
{
930930
bool alreadyExists = false;
931931
for (auto& relSec : relocASections)
932-
if (relSec.offset == reloca.offset)
932+
if (relSec.offset == m_relocaSection.offset)
933933
alreadyExists = true;
934934
if (!alreadyExists)
935935
{
936-
dynRelocASections.push_back(reloca);
937-
AddAutoSection(".dynamic_rela", reloca.offset, reloca.size, ReadOnlyDataSectionSemantics);
936+
dynRelocASections.push_back(m_relocaSection);
937+
AddAutoSection(
938+
".dynamic_rela", m_relocaSection.offset, m_relocaSection.size, ReadOnlyDataSectionSemantics);
938939
}
939940
}
940941
if (plt.size > 0)
@@ -964,16 +965,17 @@ bool ElfView::Init()
964965
}
965966
}
966967
}
967-
if (rel.size > 0)
968+
if (m_relocSection.size > 0)
968969
{
969970
bool alreadyExists = false;
970971
for (auto& relSec : relocSections)
971-
if ((relSec.address + imageBaseAdjustment) == rel.offset)
972+
if ((relSec.address + imageBaseAdjustment) == m_relocSection.offset)
972973
alreadyExists = true;
973974
if (!alreadyExists)
974975
{
975-
dynRelocSections.push_back(rel);
976-
AddAutoSection(".dynamic_rel", rel.offset, rel.size, ReadOnlyDataSectionSemantics);
976+
dynRelocSections.push_back(m_relocSection);
977+
AddAutoSection(
978+
".dynamic_rel", m_relocSection.offset, m_relocSection.size, ReadOnlyDataSectionSemantics);
977979
}
978980
}
979981
}
@@ -2237,6 +2239,58 @@ bool ElfView::Init()
22372239
}
22382240
}
22392241

2242+
if (m_relocSection.size)
2243+
{
2244+
StructureBuilder relocationTableBuilder;
2245+
if (m_elf32)
2246+
{
2247+
relocationTableBuilder.AddMember(Type::IntegerType(4, false), "r_offset");
2248+
relocationTableBuilder.AddMember(Type::IntegerType(4, false), "r_info");
2249+
}
2250+
else
2251+
{
2252+
relocationTableBuilder.AddMember(Type::IntegerType(8, false), "r_offset");
2253+
relocationTableBuilder.AddMember(Type::IntegerType(8, false), "r_info");
2254+
};
2255+
Ref<Structure> relocationTableStruct = relocationTableBuilder.Finalize();
2256+
Ref<Type> relocationTableType = Type::StructureType(relocationTableStruct);
2257+
QualifiedName relocationTableName = m_elf32 ? string("Elf32_Rel") : string("Elf64_Rel");
2258+
const string relocationTableTypeId = Type::GenerateAutoTypeId("elf", relocationTableName);
2259+
2260+
QualifiedName relocTableTypeName = DefineType(relocationTableTypeId, relocationTableName, relocationTableType);
2261+
DefineDataVariable(m_relocSection.offset,
2262+
Type::ArrayType(Type::NamedType(this, relocTableTypeName), m_relocSection.size / m_relocSection.entrySize));
2263+
DefineAutoSymbol(new Symbol(DataSymbol, "__elf_rel_table", m_relocSection.offset, NoBinding));
2264+
}
2265+
2266+
if (m_relocaSection.size)
2267+
{
2268+
StructureBuilder relocationATableBuilder;
2269+
if (m_elf32)
2270+
{
2271+
relocationATableBuilder.AddMember(Type::IntegerType(4, false), "r_offset");
2272+
relocationATableBuilder.AddMember(Type::IntegerType(4, false), "r_info");
2273+
relocationATableBuilder.AddMember(Type::IntegerType(4, true), "r_addend");
2274+
}
2275+
else
2276+
{
2277+
relocationATableBuilder.AddMember(Type::IntegerType(8, false), "r_offset");
2278+
relocationATableBuilder.AddMember(Type::IntegerType(8, false), "r_info");
2279+
relocationATableBuilder.AddMember(Type::IntegerType(8, true), "r_addend");
2280+
};
2281+
Ref<Structure> relocationATableStruct = relocationATableBuilder.Finalize();
2282+
Ref<Type> relocationATableType = Type::StructureType(relocationATableStruct);
2283+
QualifiedName relocationATableName = m_elf32 ? string("Elf32_Rela") : string("Elf64_Rela");
2284+
const string relocationATableTypeId = Type::GenerateAutoTypeId("elf", relocationATableName);
2285+
2286+
QualifiedName relocaTableTypeName =
2287+
DefineType(relocationATableTypeId, relocationATableName, relocationATableType);
2288+
DefineDataVariable(m_relocaSection.offset,
2289+
Type::ArrayType(
2290+
Type::NamedType(this, relocaTableTypeName), m_relocaSection.size / m_relocaSection.entrySize));
2291+
DefineAutoSymbol(new Symbol(DataSymbol, "__elf_rela_table", m_relocaSection.offset, NoBinding));
2292+
}
2293+
22402294
// In 32-bit mips with .got, add .extern symbol "RTL_Resolve"
22412295
if (gotStart && In(m_arch->GetName(), {"mips32", "mipsel32", "mips64", "nanomips"}))
22422296
{

view/elf/elfview.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,8 @@ namespace BinaryNinja
501501
std::vector<Elf64ProgramHeader> m_programHeaders;
502502
Elf64SectionHeader m_symbolTableSection, m_dynamicSymbolTableSection;
503503
Elf64SectionHeader m_auxSymbolTable, m_dynamicStringTable, m_sectionStringTable, m_sectionOpd;
504+
Elf64SectionHeader m_relocSection;
505+
Elf64SectionHeader m_relocaSection;
504506
Elf64ProgramHeader m_dynamicTable;
505507
Elf64ProgramHeader m_tlsSegment;
506508
std::map<uint64_t, uint64_t> m_localGotEntries;

0 commit comments

Comments
 (0)