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:
@@ -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
|
||||
};
|
||||
|
||||
@@ -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 +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
|
||||
|
||||
Reference in New Issue
Block a user