How to find the offset of the section header string table of an elf file?

前端 未结 4 1573
醉酒成梦
醉酒成梦 2020-12-08 17:48

I have to write a C program that prints an ELF file. I\'m having trouble figuring out where the section header string table is.

Let\'s say I have a file that gave me

4条回答
  •  庸人自扰
    2020-12-08 18:21

    This is what I do:

    #pragma pack(push,1)
    
    typedef struct
    {
      uint8  e_ident[16];
      uint16 e_type;
      uint16 e_machine;
      uint32 e_version;
      uint32 e_entry;
      uint32 e_phoff;
      uint32 e_shoff;
      uint32 e_flags;
      uint16 e_ehsize;
      uint16 e_phentsize;
      uint16 e_phnum;
      uint16 e_shentsize;
      uint16 e_shnum;
      uint16 e_shstrndx;
    } Elf32Hdr;
    
    typedef struct
    {
      uint32 sh_name;
      uint32 sh_type;
      uint32 sh_flags;
      uint32 sh_addr;
      uint32 sh_offset;
      uint32 sh_size;
      uint32 sh_link;
      uint32 sh_info;
      uint32 sh_addralign;
      uint32 sh_entsize;
    } Elf32SectHdr;
    
    #pragma pack(pop)
    
    {
      FILE* ElfFile = NULL;
      char* SectNames = NULL;
      Elf32Hdr elfHdr;
      Elf32SectHdr sectHdr;
      uint idx;
    
      // ...
    
      // read ELF header
      fread(&elfHdr, 1, sizeof elfHdr, ElfFile);
    
      // read section name string table
      // first, read its header
      fseek(ElfFile, elfHdr.e_shoff + elfHdr.e_shstrndx * sizeof sectHdr, SEEK_SET);
      fread(§Hdr, 1, sizeof sectHdr, ElfFile);
    
      // next, read the section, string data
      SectNames = malloc(sectHdr.sh_size);
      fseek(ElfFile, sectHdr.sh_offset, SEEK_SET);
      fread(SectNames, 1, sectHdr.sh_size, ElfFile);
    
      // read all section headers
      for (idx = 0; idx < elfHdr.e_shnum; idx++)
      {
        const char* name = "";
    
        fseek(ElfFile, elfHdr.e_shoff + idx * sizeof sectHdr, SEEK_SET);
        fread(§Hdr, 1, sizeof sectHdr, ElfFile);
    
        // print section name
        if (sectHdr.sh_name);
          name = SectNames + sectHdr.sh_name;
        printf("%2u %s\n", idx, name);
      }
    
      // ...
    }
    

提交回复
热议问题