From 92f57edde24ddfbc60935a5e425f1a38a7bfac87 Mon Sep 17 00:00:00 2001 From: dev747368 <48332326+dev747368@users.noreply.github.com> Date: Wed, 15 Dec 2021 17:13:06 -0500 Subject: [PATCH] GP-1592 Process symbols in .gnu_debugdata. .gnu_debugdata is a xz compressed ELF file that only contains a symtabthat has been stripped out of the main binary.If its present, decompress it and markup the symbols when loading the main binary. --- .../app/util/bin/format/elf/ElfHeader.java | 5 +- .../app/util/opinion/ElfProgramBuilder.java | 74 +++++++++++++++++-- Ghidra/Framework/Project/Module.manifest | 1 + Ghidra/Framework/Project/build.gradle | 1 + 4 files changed, 73 insertions(+), 8 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfHeader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfHeader.java index e34edbdb8a..5ec0a7bcc9 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfHeader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfHeader.java @@ -15,9 +15,10 @@ */ package ghidra.app.util.bin.format.elf; +import java.util.*; + import java.io.IOException; import java.io.RandomAccessFile; -import java.util.*; import generic.continues.GenericFactory; import ghidra.app.util.bin.*; @@ -614,7 +615,7 @@ public class ElfHeader implements StructConverter, Writeable { // The p_offset may not refer to the start of the DYNAMIC table so we must use // p_vaddr to find it relative to a PT_LOAD segment long vaddr = dynamicHeaders[0].getVirtualAddress(); - if (vaddr == 0) { + if (vaddr == 0 || dynamicHeaders[0].getFileSize() == 0) { Msg.warn(this, "ELF Dynamic table appears to have been stripped from binary"); return; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java index 1159e134ea..f331bf6991 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java @@ -15,24 +15,28 @@ */ package ghidra.app.util.opinion; -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; -import java.text.NumberFormat; import java.util.*; +import java.io.*; +import java.math.BigInteger; +import java.nio.file.AccessMode; +import java.text.NumberFormat; + +import org.apache.commons.compress.compressors.xz.XZCompressorInputStream; import org.apache.commons.lang3.StringUtils; +import generic.continues.GenericFactory; import ghidra.app.cmd.label.SetLabelPrimaryCmd; import ghidra.app.util.MemoryBlockUtils; import ghidra.app.util.Option; -import ghidra.app.util.bin.ByteProvider; +import ghidra.app.util.bin.*; import ghidra.app.util.bin.format.MemoryLoadable; import ghidra.app.util.bin.format.elf.*; import ghidra.app.util.bin.format.elf.ElfDynamicType.ElfDynamicValueType; import ghidra.app.util.bin.format.elf.extend.ElfLoadAdapter; import ghidra.app.util.bin.format.elf.relocation.*; import ghidra.app.util.importer.MessageLog; +import ghidra.app.util.importer.MessageLogContinuesFactory; import ghidra.framework.options.Options; import ghidra.program.database.mem.FileBytes; import ghidra.program.database.register.AddressRangeObjectMap; @@ -53,6 +57,7 @@ import ghidra.util.*; import ghidra.util.datastruct.*; import ghidra.util.exception.*; import ghidra.util.task.TaskMonitor; +import utilities.util.FileUtilities; class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper { @@ -1319,7 +1324,10 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper { // Mapped data/object symbol addresses with specific sizes HashMap
dataAllocationMap = new HashMap<>(); - ElfSymbolTable[] symbolTables = elf.getSymbolTables(); + List
+ * The ".gnu_debugdata" section contains a xz compressed minimal ELF file that has symbols that
+ * have been stripped from this binary.
+ *
+ * @param monitor checked for cancelation when copying data
+ * @return list of ElfSymbolTables, empty if not present
+ */
+ private List