Fix AT_PHDR and AT_ENTRY for amd64-linux.elf (-pie, libmusl)

modified:   stub/src/amd64-linux.elf-main.c

	modified:   ../.github/travis_testsuite_1.sh
	modified:   stub/amd64-linux.elf-fold.h
	modified:   stub/tmp/amd64-linux.elf-fold.map
This commit is contained in:
John Reiser
2017-06-07 09:04:02 -07:00
parent f496010273
commit 62815f5c3c
4 changed files with 57 additions and 56 deletions
+32 -32
View File
@@ -1,5 +1,5 @@
/* amd64-linux.elf-fold.h
created from amd64-linux.elf-fold.bin, 2080 (0x820) bytes
created from amd64-linux.elf-fold.bin, 2073 (0x819) bytes
This file is part of the UPX executable compressor.
@@ -31,20 +31,20 @@
*/
#define STUB_AMD64_LINUX_ELF_FOLD_SIZE 2080
#define STUB_AMD64_LINUX_ELF_FOLD_ADLER32 0xb97519dc
#define STUB_AMD64_LINUX_ELF_FOLD_CRC32 0x24735e3b
#define STUB_AMD64_LINUX_ELF_FOLD_SIZE 2073
#define STUB_AMD64_LINUX_ELF_FOLD_ADLER32 0x04ae143b
#define STUB_AMD64_LINUX_ELF_FOLD_CRC32 0x08c80b0e
unsigned char stub_amd64_linux_elf_fold[2080] = {
unsigned char stub_amd64_linux_elf_fold[2073] = {
/* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 2, 0, 62, 0, 1, 0, 0, 0,188, 0, 16, 0, 0, 0, 0, 0,
/* 0x0020 */ 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0030 */ 0, 0, 0, 0, 64, 0, 56, 0, 2, 0, 0, 0, 0, 0, 0, 0,
/* 0x0040 */ 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0050 */ 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0,
/* 0x0060 */ 32, 8, 0, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 0,
/* 0x0060 */ 25, 8, 0, 0, 0, 0, 0, 0, 28, 8, 0, 0, 0, 0, 0, 0,
/* 0x0070 */ 0, 0, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
/* 0x0080 */ 32, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0080 */ 25, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0090 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x00a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0,
/* 0x00b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 89, 0, 0,
@@ -139,31 +139,31 @@ unsigned char stub_amd64_linux_elf_fold[2080] = {
/* 0x0640 */ 148, 36,160, 0, 0, 0, 72,137, 2, 73,139, 87, 24, 72, 1, 84,
/* 0x0650 */ 36, 24, 72,139, 68, 36, 24, 72,131,196,104, 91, 93, 65, 92, 65,
/* 0x0660 */ 93, 65, 94, 65, 95,195, 65, 87, 77,137,207, 65, 86, 73,137,206,
/* 0x0670 */ 49,201, 65, 85, 77,137,197, 65, 84, 85, 72,137,213, 83, 72,141,
/* 0x0680 */ 90, 64, 72,131,236, 56,139, 7, 72,137, 52, 36, 72,137,116, 36,
/* 0x0670 */ 49,201, 65, 85, 77,137,197, 65, 84, 85, 83, 72,137,211, 72,141,
/* 0x0680 */ 107, 64, 72,131,236, 56,139, 7, 72,137, 52, 36, 72,137,116, 36,
/* 0x0690 */ 16, 72,141,116, 36, 32, 72,137, 84, 36, 40, 72,137,124, 36, 8,
/* 0x06a0 */ 76,137,194, 72,137,124, 36, 24, 72,137,231, 72,137, 68, 36, 32,
/* 0x06b0 */ 232,215,251,255,255, 72,139, 83, 16,190, 3, 0, 0, 0, 76,137,
/* 0x06c0 */ 247,232,211,252,255,255, 72, 15,183, 85, 56,190, 5, 0, 0, 0,
/* 0x06d0 */ 76,137,247,232,193,252,255,255, 68, 15,183,101, 16, 65,131,252,
/* 0x06e0 */ 3,117, 74, 72,139, 84, 36,112, 72, 3, 85, 24,190, 9, 0, 0,
/* 0x06f0 */ 0,102,199, 69, 16, 2, 0, 76,137,247,232,154,252,255,255, 15,
/* 0x0700 */ 183, 69, 56,133,192,116, 21, 72,139, 84, 36,112, 72, 1, 83, 16,
/* 0x0710 */ 72, 1, 83, 24, 72,131,195, 56,255,200,117,240, 72,139, 85, 80,
/* 0x0720 */ 190, 3, 0, 0, 0, 76,137,247,232,108,252,255,255, 65, 83, 77,
/* 0x0730 */ 137,249, 77,137,232, 49,210, 76,137,241, 72,141, 68, 36,120, 72,
/* 0x0740 */ 141,116, 36, 24, 72,137,239, 80,232,126,252,255,255, 65, 89, 65,
/* 0x0750 */ 131,252, 3, 73,137,197, 65, 90,116, 16, 72,137,194,190, 9, 0,
/* 0x0760 */ 0, 0, 76,137,247,232, 47,252,255,255, 69, 49,255,102,131,125,
/* 0x0770 */ 56, 0, 72,141, 93, 64, 15,132,146, 0, 0, 0,131, 59, 3,117,
/* 0x0780 */ 121, 72,139,124, 36,112, 72, 3,123, 16, 49,210, 49,246,232,172,
/* 0x0790 */ 250,255,255,133,192, 65,137,196,120, 23,186, 0, 4, 0, 0, 72,
/* 0x07a0 */ 137,238,137,199,232,166,250,255,255, 72, 61, 0, 4, 0, 0,116,
/* 0x07b0 */ 10,191,127, 0, 0, 0,232,120,250,255,255, 65, 80, 69, 49,201,
/* 0x07c0 */ 69, 49,192, 49,201, 68,137,226, 72,141, 68, 36,120, 49,246, 72,
/* 0x07d0 */ 137,239, 80,232,243,251,255,255, 72,139,148, 36,128, 0, 0, 0,
/* 0x07e0 */ 190, 7, 0, 0, 0, 76,137,247, 73,137,197,232,169,251,255,255,
/* 0x07f0 */ 68,137,231,232, 67,250,255,255, 94, 95, 15,183, 69, 56, 65,255,
/* 0x0800 */ 199, 72,131,195, 56, 65, 57,199, 15,130,110,255,255,255, 72,131,
/* 0x0810 */ 196, 56, 76,137,232, 91, 93, 65, 92, 65, 93, 65, 94, 65, 95,195
/* 0x06b0 */ 232,215,251,255,255, 72,139, 83, 32, 72, 3, 84, 36,112,190, 3,
/* 0x06c0 */ 0, 0, 0, 76,137,247,232,206,252,255,255, 72, 15,183, 83, 56,
/* 0x06d0 */ 190, 5, 0, 0, 0, 76,137,247,232,188,252,255,255, 68, 15,183,
/* 0x06e0 */ 99, 16, 65,131,252, 3,117, 61, 72,139, 84, 36,112, 72, 3, 83,
/* 0x06f0 */ 24,190, 9, 0, 0, 0,102,199, 67, 16, 2, 0, 76,137,247, 72,
/* 0x0700 */ 137, 83, 24,232,145,252,255,255, 15,183, 67, 56,133,192,116, 21,
/* 0x0710 */ 72,139, 84, 36,112, 72, 1, 85, 16, 72, 1, 85, 24, 72,131,197,
/* 0x0720 */ 56,255,200,117,240, 65, 83, 77,137,249, 77,137,232, 49,210, 76,
/* 0x0730 */ 137,241, 72,141, 68, 36,120, 72,141,116, 36, 24, 72,137,223, 80,
/* 0x0740 */ 232,134,252,255,255, 65, 89, 65,131,252, 3, 73,137,197, 65, 90,
/* 0x0750 */ 116, 16, 72,137,194,190, 9, 0, 0, 0, 76,137,247,232, 55,252,
/* 0x0760 */ 255,255, 69, 49,255,102,131,123, 56, 0, 72,141,107, 64, 15,132,
/* 0x0770 */ 147, 0, 0, 0,131,125, 0, 3,117,121, 72,139,124, 36,112, 72,
/* 0x0780 */ 3,125, 16, 49,210, 49,246,232,179,250,255,255,133,192, 65,137,
/* 0x0790 */ 196,120, 23,186, 0, 4, 0, 0, 72,137,222,137,199,232,173,250,
/* 0x07a0 */ 255,255, 72, 61, 0, 4, 0, 0,116, 10,191,127, 0, 0, 0,232,
/* 0x07b0 */ 127,250,255,255, 65, 80, 69, 49,201, 69, 49,192, 49,201, 68,137,
/* 0x07c0 */ 226, 72,141, 68, 36,120, 49,246, 72,137,223, 80,232,250,251,255,
/* 0x07d0 */ 255, 72,139,148, 36,128, 0, 0, 0,190, 7, 0, 0, 0, 76,137,
/* 0x07e0 */ 247, 73,137,197,232,176,251,255,255, 68,137,231,232, 74,250,255,
/* 0x07f0 */ 255, 94, 95, 15,183, 67, 56, 65,255,199, 72,131,197, 56, 65, 57,
/* 0x0800 */ 199, 15,130,109,255,255,255, 72,131,196, 56, 76,137,232, 91, 93,
/* 0x0810 */ 65, 92, 65, 93, 65, 94, 65, 95,195
};
+10 -10
View File
@@ -283,6 +283,7 @@ do_xmap(
char *v_brk;
unsigned long const reloc = xfind_pages(
((ET_DYN!=ehdr->e_type) ? MAP_FIXED : 0), phdr, ehdr->e_phnum, &v_brk);
DPRINTF("do_xmap reloc=%%p", reloc);
int j;
for (j=0; j < ehdr->e_phnum; ++phdr, ++j)
if (xi && PT_PHDR==phdr->p_type) {
@@ -363,8 +364,6 @@ upx_main( // returns entry address
Elf64_Addr reloc // IN OUT; value result for ET_DYN
)
{
Elf64_Phdr *phdr = (Elf64_Phdr *)(1+ ehdr);
Extent xo, xi1, xi2;
xo.buf = (char *)ehdr;
xo.size = bi->sz_unc;
@@ -375,27 +374,28 @@ upx_main( // returns entry address
unpackExtent(&xi2, &xo, f_decompress, 0); // never filtered?
// AT_PHDR.a_un.a_val is set again by do_xmap if PT_PHDR is present.
auxv_up(av, AT_PHDR , (unsigned long)phdr->p_vaddr);
auxv_up(av, AT_PHNUM , ehdr->e_phnum);
auxv_up(av, AT_PHDR , reloc + ehdr->e_phoff);
auxv_up(av, AT_PHNUM, ehdr->e_phnum);
//auxv_up(av, AT_PHENT , ehdr->e_phentsize); /* this can never change */
//auxv_up(av, AT_PAGESZ, PAGE_SIZE); /* ld-linux.so.2 does not need this */
DPRINTF("upx_main1 .e_entry=%%p reloc=%%p", ehdr->e_entry, reloc);
Elf64_Phdr *phdr = (Elf64_Phdr *)(1+ ehdr);
unsigned const orig_e_type = ehdr->e_type;
if (ET_DYN==orig_e_type /*&& phdr->p_vaddr==0*/) { // -fpie /*FIXME: and not pre-linked*/
if (ET_DYN==orig_e_type /*&& phdr->p_vaddr==0*/) { // -pie /*FIXME: and not pre-linked*/
// Unpacked must start at same place as packed, so that brk(0) works.
ehdr->e_type = ET_EXEC;
auxv_up(av, AT_ENTRY, ehdr->e_entry + reloc);
phdr = (Elf64_Phdr *)(1+ ehdr);
auxv_up(av, AT_ENTRY, ehdr->e_entry += reloc);
unsigned j;
for (j=0; j < ehdr->e_phnum; ++phdr, ++j) {
phdr->p_vaddr += reloc;
phdr->p_paddr += reloc;
}
// Needed for libmusl which has no PT_PHDR
auxv_up(av, AT_PHDR, (unsigned long)((Elf64_Phdr *)(1+ ehdr))->p_vaddr);
}
Elf64_Addr entry = do_xmap(ehdr, &xi1, 0, av, f_decompress, f_unf, &reloc); // "rewind"
// De-compress Ehdr again into actual position, then de-compress the rest.
Elf64_Addr entry = do_xmap(ehdr, &xi1, 0, av, f_decompress, f_unf, &reloc);
DPRINTF("upx_main2 entry=%%p reloc=%%p", entry, reloc);
if (ET_DYN!=orig_e_type) {
auxv_up(av, AT_ENTRY , entry);
}
+8 -7
View File
@@ -8,7 +8,7 @@ Linker script and memory map
0x00000000001000bc . = ((0x100000 + SIZEOF_HEADERS) + 0xc)
.text 0x00000000001000bc 0x764
.text 0x00000000001000bc 0x760
*(.text)
.text 0x00000000001000bc 0x197 tmp/amd64-linux.elf-fold.o
0x0000000000100243 munmap
@@ -21,17 +21,18 @@ Linker script and memory map
0x0000000000100247 mprotect
0x000000000010023b close
*fill* 0x0000000000100253 0x1 00
.text 0x0000000000100254 0x5cc tmp/amd64-linux.elf-main.o
.text 0x0000000000100254 0x5c5 tmp/amd64-linux.elf-main.o
0x0000000000100666 upx_main
*(.data)
.data 0x0000000000100820 0x0 tmp/amd64-linux.elf-fold.o
.data 0x0000000000100820 0x0 tmp/amd64-linux.elf-main.o
*fill* 0x0000000000100819 0x3 00
.data 0x000000000010081c 0x0 tmp/amd64-linux.elf-fold.o
.data 0x000000000010081c 0x0 tmp/amd64-linux.elf-main.o
.data
.bss 0x0000000000100820 0x0
.bss 0x0000000000100820 0x0 tmp/amd64-linux.elf-fold.o
.bss 0x0000000000100820 0x0 tmp/amd64-linux.elf-main.o
.bss 0x000000000010081c 0x0
.bss 0x000000000010081c 0x0 tmp/amd64-linux.elf-fold.o
.bss 0x000000000010081c 0x0 tmp/amd64-linux.elf-main.o
.rela.dyn 0x0000000000100820 0x0
.rela.text 0x0000000000000000 0x0 tmp/amd64-linux.elf-fold.o