15 template< typename T >
16 T host_to(int be, long long v, T &t)
18 #if __BYTE_ORDER == __LITTLE_ENDIAN
26 for (unsigned i = 0; i < sizeof(T); ++i)
27 ((unsigned char*)&t)[i] = ((unsigned char *)&_v)[sizeof(T)-i-1];
35 #define Elf(x) Elf32_ ## x
36 #include "elf-patcher.h"
39 #define Elf(x) Elf64_ ## x
40 #include "elf-patcher.h"
42 static unsigned long long
43 get_param(const char *opt, int argc, const char *argv[])
45 size_t l = strlen(opt);
47 for (i = 2; i < argc; ++i)
49 if (strncmp(opt, argv[i], l) == 0)
51 if (strlen(argv[i]) >= l + 2)
52 return strtoll(argv[i] + l + 1, NULL, 0);
55 fprintf(stderr, "error parsing argument '%s'\n", opt);
64 check_elf(void *_elf, const char *name)
66 Elf32_Ehdr *elf = (Elf32_Ehdr*)_elf;
67 if (memcmp(elf->e_ident, ELFMAG, sizeof(ELFMAG)-1) != 0)
69 fprintf(stderr, "'%s' is not an ELF binary\n", name);
76 patch_phdrs(void *_elf, int argc, const char *argv[])
78 Elf32_Ehdr *elf = (Elf32_Ehdr*)_elf;
79 unsigned long long stack_addr, stack_size, kip_addr;
81 stack_addr = get_param("--stack_addr", argc, argv);
82 stack_size = get_param("--stack_size", argc, argv);
83 kip_addr = get_param("--kip_addr" , argc, argv);
85 if (stack_addr == ~0ULL || stack_size == ~0ULL || kip_addr == ~0ULL)
88 if (elf->e_ident[EI_CLASS] == ELFCLASS64)
89 return Elf64_patch_phdrs(elf, stack_addr, stack_size, kip_addr);
90 else if (elf->e_ident[EI_CLASS] == ELFCLASS32)
91 return Elf32_patch_phdrs(elf, stack_addr, stack_size, kip_addr);
94 fprintf(stderr, "invalid elf class\n");
100 patch_shdrs(void *_elf, int argc, const char *argv[])
102 Elf32_Ehdr *elf = (Elf32_Ehdr*)_elf;
103 unsigned long long min_align = get_param("--min-section-align", argc, argv);
105 if (min_align == ~0ULL)
108 if (elf->e_ident[EI_CLASS] == ELFCLASS64)
109 return Elf64_patch_shdrs(elf, min_align);
110 else if (elf->e_ident[EI_CLASS] == ELFCLASS32)
111 return Elf32_patch_shdrs(elf, min_align);
114 fprintf(stderr, "invalid elf class\n");
119 int main(int argc, const char *argv[])
122 struct stat victim_sb;
127 fprintf(stderr,"usage: %s <elf-binary> [--stack_addr=<addr> --stack_size=<size> --kip_addr=<addr>] [--min-section-align=value]\n", argv[0]);
131 victim = open(argv[1], O_RDWR);
134 fprintf(stderr, "could not open '%s':", argv[1]);
139 if (fstat(victim, &victim_sb) == -1)
141 fprintf(stderr, "could not get size of '%s':", argv[1]);
146 elf_addr = mmap(NULL, victim_sb.st_size, PROT_READ | PROT_WRITE,
147 MAP_SHARED, victim, 0);
149 if (elf_addr == MAP_FAILED)
151 fprintf(stderr, "could not mmap '%s':", argv[1]);
156 if (check_elf(elf_addr, argv[1]))
159 patch_phdrs(elf_addr, argc, argv);
160 patch_shdrs(elf_addr, argc, argv);