#include <elf.h> #include <string.h> #include <unistd.h>
int main() { unsigned char CODE[32] = { 0xba, 0x0f, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x35, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x01, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0xc3, };
char RODATA[16] = "Hello, world!\n";
char strtab[16] = "\0" "main\0" "write\0"; int null_nameofs = 0; int main_nameofs = null_nameofs + strlen("") + 1; int write_nameofs = main_nameofs + strlen("main") + 1;
Elf64_Sym symtab[] = { { .st_name = null_nameofs, .st_info = ELF64_ST_INFO(STB_LOCAL, STT_NOTYPE), }, { .st_name = null_nameofs, .st_info = ELF64_ST_INFO(STB_LOCAL, STT_SECTION), .st_shndx = 2, }, { .st_name = main_nameofs, .st_info = ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), .st_shndx = 1, .st_value = 0, }, { .st_name = write_nameofs, .st_info = ELF64_ST_INFO(STB_GLOBAL, STT_NOTYPE), .st_shndx = 0, }, };
Elf64_Rela relatext[] = { { .r_offset = 0x12, .r_info = ELF64_R_INFO(3, R_X86_64_PLT32), .r_addend = -4, }, { .r_offset = 0x08, .r_info = ELF64_R_INFO(1, R_X86_64_PC32), .r_addend = 0 - 4, }, };
char shstrtab[64] = "\0" ".text\0" ".rodata\0" ".rela.text\0" ".strtab\0" ".symtab\0" ".shstrtab\0"; int text_nameofs = null_nameofs + strlen("") + 1; int rodata_nameofs = text_nameofs + strlen(".text") + 1; int relatext_nameofs = rodata_nameofs + strlen(".rodata") + 1; int strtab_nameofs = relatext_nameofs + strlen(".rela.text") + 1; int symtab_nameofs = strtab_nameofs + strlen(".strtab") + 1; int shstrtab_nameofs = symtab_nameofs + strlen(".symtab") + 1;
uintptr_t code_ofs = sizeof(Elf64_Ehdr); size_t code_size = sizeof(CODE); uintptr_t rodata_ofs = code_ofs + code_size; size_t rodata_size = sizeof(RODATA); uintptr_t strtab_ofs = rodata_ofs + rodata_size; size_t strtab_size = sizeof(strtab); uintptr_t symtab_ofs = strtab_ofs + strtab_size; size_t symtab_size = sizeof(symtab); uintptr_t relatext_ofs = symtab_ofs + symtab_size; size_t relatext_size = sizeof(relatext); uintptr_t shstrtab_ofs = relatext_ofs + relatext_size; size_t shstrtab_size = sizeof(shstrtab); uintptr_t sectionheader_ofs = shstrtab_ofs + shstrtab_size;
Elf64_Shdr section_headers[] = { { .sh_name = null_nameofs, .sh_type = SHT_NULL, }, { .sh_name = text_nameofs, .sh_type = SHT_PROGBITS, .sh_flags = SHF_ALLOC | SHF_EXECINSTR, .sh_addr = 0, .sh_offset = code_ofs, .sh_size = code_size, .sh_link = 0, .sh_info = 0, .sh_addralign = 1, .sh_entsize = 0, }, { .sh_name = rodata_nameofs, .sh_type = SHT_PROGBITS, .sh_flags = SHF_ALLOC, .sh_addr = 0, .sh_offset = rodata_ofs, .sh_size = rodata_size, .sh_link = 0, .sh_info = 0, .sh_addralign = 1, .sh_entsize = 0, }, { .sh_name = strtab_nameofs, .sh_type = SHT_STRTAB, .sh_flags = 0, .sh_addr = 0, .sh_offset = strtab_ofs, .sh_size = strtab_size, .sh_link = 0, .sh_info = 0, .sh_addralign = 1, .sh_entsize = 0, }, { .sh_name = symtab_nameofs, .sh_type = SHT_SYMTAB, .sh_flags = 0, .sh_addr = 0, .sh_offset = symtab_ofs, .sh_size = symtab_size, .sh_link = 3, .sh_info = 2, .sh_addralign = 8, .sh_entsize = sizeof(Elf64_Sym), }, { .sh_name = relatext_nameofs, .sh_type = SHT_RELA, .sh_flags = SHF_INFO_LINK, .sh_addr = 0, .sh_offset = relatext_ofs, .sh_size = relatext_size, .sh_link = 4, .sh_info = 1, .sh_addralign = 8, .sh_entsize = sizeof(Elf64_Rela), }, { .sh_name = shstrtab_nameofs, .sh_type = SHT_STRTAB, .sh_flags = 0, .sh_addr = 0, .sh_offset = shstrtab_ofs, .sh_size = shstrtab_size, .sh_link = 0, .sh_info = 0, .sh_addralign = 1, .sh_entsize = 0, }, };
Elf64_Ehdr ehdr = { .e_ident = { ELFMAG0, ELFMAG1, ELFMAG2 ,ELFMAG3, ELFCLASS64, ELFDATA2LSB, EV_CURRENT, ELFOSABI_SYSV }, .e_type = ET_REL, .e_machine = EM_X86_64, .e_version = EV_CURRENT, .e_entry = 0, .e_phoff = 0, .e_shoff = sectionheader_ofs, .e_flags = 0x0, .e_ehsize = sizeof(Elf64_Ehdr), .e_phentsize = sizeof(Elf64_Phdr), .e_phnum = 0, .e_shentsize = sizeof(Elf64_Shdr), .e_shnum = sizeof(section_headers) / sizeof(*section_headers), .e_shstrndx = sizeof(section_headers) / sizeof(*section_headers) - 1, };
int fd = STDOUT_FILENO; write(fd, &ehdr, sizeof(Elf64_Ehdr)); write(fd, CODE, sizeof(CODE)); write(fd, RODATA, sizeof(RODATA)); write(fd, strtab, sizeof(strtab)); write(fd, symtab, sizeof(symtab)); write(fd, relatext, sizeof(relatext)); write(fd, shstrtab, sizeof(shstrtab)); write(fd, section_headers, sizeof(section_headers)); close(fd);
return 0; }
|