// goal: // replace "file" + "checksec" #include #include #include #include #include #define MAX_FILENAME 256 #define EI_NIDENT 16 #define MAX_HEADER_LEN 2048 #define Elf32_Half uint16_t #define Elf32_Word uint32_t #define Elf32_Addr uint32_t #define Elf32_Off uint32_t struct Elf32_Ehdr { unsigned char e_ident[EI_NIDENT]; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; }; int parse_elf_header32(struct Elf32_Ehdr* header, FILE* fp) { fread(header, sizeof(struct Elf32_Ehdr), 1, fp); return EXIT_SUCCESS; } int main(int argc, char* argv[]) { // Accessing file arg if (argc < 2) { printf("Usage: %s \n", argv[0]); return -EINVAL; } char* filename = argv[1]; // 0. is ELF32 or ELF64 ??? // 1. create ELF header struct // 2. populate ELF header struct // 3. display ELF header struct if (!filename) { printf("Error parsing filename.\n"); return -EINVAL; } FILE* elf_file = fopen(filename, "rb"); if (!elf_file) { printf("Couldn't open file '%s'\n", filename); return -ENOENT; } struct Elf32_Ehdr elf_header = {0}; int res = parse_elf_header32(&elf_header, elf_file); if (res) { printf("Error parsing ELF header.\n"); return -EINVAL; } if (!(memcmp(elf_header.e_ident, "\177ELF", 4) == 0)) { printf("Not an ELF file..\n"); return -EINVAL; } printf("ELF file\n"); return EXIT_SUCCESS; }