Guest User

Untitled

a guest
Dec 9th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.46 KB | None | 0 0
  1. #include <elf.h>
  2. #include <fcntl.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6.  
  7. inline int
  8. checkHeader(Elf32_Ehdr *header)
  9. {
  10.     const char message[] = "Not supported ELF file";
  11.     if (header->e_ident[EI_MAG0] != ELFMAG0 || header->e_ident[EI_MAG1] != ELFMAG1 ||
  12.     header->e_ident[EI_MAG2] != ELFMAG2 || header->e_ident[EI_MAG3] != ELFMAG3) {
  13.         fprintf(stderr, "Not an ELF file\n");
  14.         return 1;
  15.     } else if (header->e_ident[EI_CLASS] != ELFCLASS32) {
  16.         fprintf(stderr, "%s\n", message);
  17.         return 1; /* wrong architecture */
  18.     } else if (header->e_ident[EI_DATA] != ELFDATA2LSB) {
  19.         fprintf(stderr, "%s\n", message);
  20.         return 1; /* wrong byte order */
  21.     } else if (header->e_ident[EI_VERSION] != EV_CURRENT) {
  22.         fprintf(stderr, "%s\n", message);
  23.         return 1; /* our elf version stinks */
  24.     } else if (header->e_ident[7] != 0) {
  25.         fprintf(stderr, "%s\n", message);
  26.         return 1; /* missed smth Linux-specific */
  27.     } else if (header->e_ident[8] != 0) {
  28.         fprintf(stderr, "%s\n", message);
  29.         return 1; /* same reason as previous */
  30.     } else if (!(header->e_type == ET_NONE || header->e_type == ET_REL ||
  31.         header->e_type == ET_EXEC || header->e_type == ET_DYN || header->e_type == ET_CORE)) {
  32.         fprintf(stderr, "%s\n", message);
  33.         return 1; /* we don't know which type this ELF is */
  34.     } else if (header->e_machine != EM_386) {
  35.         fprintf(stderr, "%s\n", message);
  36.         return 1; /* wrong processor */
  37.     } else if (header->e_version != EV_CURRENT) {
  38.         fprintf(stderr, "%s\n", message);
  39.         return 1; /* version mismatch */
  40.     }
  41.     return 0; /* this is a perfectly valid Elf32 header for i386 */
  42. }
  43.  
  44. inline void
  45. displayType(Elf32_Ehdr *header)
  46. {
  47.     switch (header->e_type) {
  48.         case 0:
  49.             printf("TYPE: NONE\n");
  50.             break;
  51.         case 1:
  52.             printf("TYPE: REL\n");
  53.             break;
  54.         case 2:
  55.             printf("TYPE: EXEC\n");
  56.             break;
  57.         case 3:
  58.             printf("TYPE: DYN\n");
  59.             break;
  60.         case 4:
  61.             printf("TYPE: CORE\n");
  62.             break;
  63.         default:
  64.             break;
  65.     }
  66. }
  67.  
  68. inline int
  69. performRead(int fd, void *target, int size, int offset)
  70. {
  71.     int i = 0, j = 0;
  72.     if (lseek(fd, offset, SEEK_SET) == -1) {
  73.         fprintf(stderr, "Error while reading ELF Header\n");
  74.         return 1;
  75.     }
  76.     while (i < size) {
  77.         i += (j = read(fd, (char *) target + i, size - i));
  78.         if (j == -1 || (j == 0 && i < size)) {
  79.             fprintf(stderr, "Error while reading ELF Header\n");
  80.             return 1;
  81.         }
  82.     }
  83.     return 0;
  84. }
  85.  
  86. int
  87. main(int argc, char **argv)
  88. {
  89.     int elffile = open(argv[1], O_RDONLY);
  90.     if (elffile == -1) {
  91.         fprintf(stderr, "Couldn't open input file\n");
  92.         return 1;
  93.     }
  94.  
  95.     Elf32_Ehdr *elf_header = (Elf32_Ehdr *) calloc(1, sizeof(Elf32_Ehdr));
  96.     if (performRead(elffile, elf_header, sizeof(Elf32_Ehdr), 0)) { /* are we literate? */
  97.         return 1;
  98.     }
  99.     if (checkHeader(elf_header)) { /* is this the wrong header for i386? */
  100.         return 1;
  101.     }
  102.  
  103.     displayType(elf_header);
  104.     Elf32_Shdr *section_header = (Elf32_Shdr *) calloc(1, sizeof(Elf32_Shdr));
  105.     /* retrieve section that stores other sections' names */
  106.     /* if ther's none - that should not be a problem */
  107.     if (performRead(elffile, section_header, sizeof(Elf32_Shdr),
  108.         elf_header->e_shoff + elf_header->e_shstrndx * sizeof(Elf32_Shdr))) {
  109.         return 1;
  110.     }
  111.     char *names = (char *) malloc(section_header->sh_size);
  112.     if (elf_header->e_shnum > 1) { /* since 0th section reserved but counted */
  113.         printf("%20s %10s %10s %10s %6s\n", "NAME", "ADDR", "OFFSET", "SIZE", "ALGN");
  114.         if (performRead(elffile, names, section_header->sh_size, section_header->sh_offset)) {
  115.             return 1;
  116.         }
  117.     }
  118.     for (int i = 1; i < elf_header->e_shnum; i++) {
  119.         if (performRead(elffile, section_header, sizeof(Elf32_Shdr),
  120.             elf_header->e_shoff + i * sizeof(Elf32_Shdr))) {
  121.             return 1;
  122.         }
  123.         printf("%20s 0x%08x %10d %10d 0x%04x\n", &names[section_header->sh_name],
  124.         section_header->sh_addr, section_header->sh_offset, section_header->sh_size,
  125.         section_header->sh_addralign);
  126.     }
  127.     close(elffile);
  128.     free(section_header);
  129.     free(elf_header);
  130.     free(names);
  131.     return 0;
  132. }
Add Comment
Please, Sign In to add comment