stabbish

:)
git clone https://git.sr.ht/~ashymad/stabbish
Log | Files | Refs | README | LICENSE

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 }