payload.c (811B)
1 #define _GNU_SOURCE 2 3 #include <elf.h> 4 #include <fcntl.h> 5 #include <sys/mman.h> 6 #include <sys/sendfile.h> 7 #include <unistd.h> 8 9 #include "payload.h" 10 11 #if defined(__LP64__) 12 #define ElfW(type) Elf64_##type 13 #else 14 #define ElfW(type) Elf32_##type 15 #endif 16 17 fd get_payload(string path) { 18 static fd try_return = -1; 19 20 fd in = try(open(path, O_RDONLY)); 21 22 ElfW(Ehdr) header; 23 try(read(in, &header, sizeof(header))); 24 25 size_t size = try(lseek(in, 0, SEEK_END)); 26 off_t offset = header.e_shoff + (header.e_shentsize * header.e_shnum); 27 size_t payload_size = size - offset; 28 29 if (payload_size == 0) { 30 close(in); 31 return ENOPAYLOAD; 32 } 33 34 int payload = try(memfd_create("payload", 0)); 35 try(sendfile(payload, in, &offset, payload_size)); 36 try(lseek(payload, SEEK_SET, 0)); 37 38 close(in); 39 40 return payload; 41 }