diff --git a/src/stub/Makefile b/src/stub/Makefile index d09518cc..74d96ac7 100644 --- a/src/stub/Makefile +++ b/src/stub/Makefile @@ -429,10 +429,19 @@ amd64-linux.elf-entry.h: $(srcdir)/src/$$T.S $(call tc,f-embed_objinfo,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ -amd64-linux.elf-so_entry.h: $(srcdir)/src/$$T.S - @echo; echo TARGET=$@ PATH=$(PATH); echo - $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin - $(call tc,f-embed_objinfo,tmp/$T.bin) +amd64-linux.elf-so_entry.h : $(srcdir)/src/amd64-linux.elf-so_entry.lds \ + $(srcdir)/src/$$T.S \ + tmp/amd64-linux.elf-help_umf.o \ + tmp/amd64-linux.elf-upxfd_android.o \ + tmp/amd64-linux.elf-upxfd_linux.o + $(call tc,gcc) -c $(srcdir)/src/$T.S -o tmp/$T.o + multiarch-ld-2.17 -r -Map tmp/$T.map -o tmp/$T.bin \ + -T src/amd64-linux.elf-so_entry.lds \ + tmp/$T.o \ + tmp/amd64-linux.elf-help_umf.o \ + tmp/amd64-linux.elf-upxfd_android.o \ + tmp/amd64-linux.elf-upxfd_linux.o + $(call tc,f-embed_objinfo_without_xstrip,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ amd64-linux.elf-fold.h : $(srcdir)/src/$$T.lds \ @@ -449,6 +458,7 @@ amd64-linux.elf-fold.h : $(srcdir)/src/$$T.lds \ amd64-linux.elf-so_fold.h : $(srcdir)/src/$$T.lds \ tmp/$$T.o \ tmp/amd64-expand.o \ + tmp/amd64-linux.elf-help_umf.o \ tmp/amd64-linux.elf-upxfd_linux.o \ tmp/amd64-linux.elf-so_main.o @echo; echo TARGET=$@ PATH=$(PATH); echo @@ -467,6 +477,19 @@ tmp/amd64-linux.elf-so_fold.o : $(srcdir)/src/$$T.S tmp/amd64-expand.o: $(srcdir)/src/$$T.S $(call tc,gcc) -c $< -o $@ +tmp/amd64-linux.elf-help_umf.o: $(srcdir)/src/$$T.S + $(call tc,gcc) -c $< -o $@ + +tmp/amd64-linux.elf-upxfd_android.o : $(srcdir)/src/upxfd_android.c + $(call tc,gcc) -c -O $< -o $@ + $(call tc,objcopy) --rename-section .text=UMF_ANDROID -R .comment -R .data -R .bss -R .note.GNU-stack $@ + $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm + +tmp/amd64-linux.elf-upxfd_linux.o : $(srcdir)/src/upxfd_linux.c + $(call tc,gcc) -c -O $< -o $@ + $(call tc,objcopy) --rename-section .text=UMF_LINUX -R .comment -R .data -R .bss -R .note.GNU-stack $@ + $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm + tmp/amd64-linux.elf-fold.o : $(srcdir)/src/$$T.S $(call tc,gcc) -c $< -o $@ $(call tc,f-objstrip,$@) @@ -810,7 +833,8 @@ tc.arm64-linux.elf.gcc = arm64-linux-gcc-4.9.2 -nostdinc -DDAISY_CHAIN=1 -MMD - tc.arm64-linux.elf.gcc += -fno-exceptions -fno-asynchronous-unwind-tables tc.arm64-linux.elf.gcc += -Wall -W -Wcast-align -Wcast-qual -Wstrict-prototypes -Wwrite-strings -Werror -+tc.arm64-expand.gcc = $(tc.arm64-linux.elf.gcc) +tc.arm64-expand.gcc = $(tc.arm64-linux.elf.gcc) +tc.arm64-linux.elf-upxfd_linux.gcc = $(tc.arm64-linux.elf.gcc) tc.arm64-linux.elf-fold.ld = arm64-linux-ld-2.25 tc.arm64-linux.elf-so_fold.ld = arm64-linux-ld-2.25 @@ -821,6 +845,7 @@ tc.arm64-linux.elf-fold.objcopy = arm64-linux-objcopy-2.25 -F elf64-littlea tc.arm64-linux.elf-so_fold.objcopy = arm64-linux-objcopy-2.25 -F elf64-littleaarch64 tc.arm64-linux.elf-main2.objcopy = arm64-linux-objcopy-2.25 -F elf64-littleaarch64 tc.arm64-linux.elf-so_main.objcopy = arm64-linux-objcopy-2.25 -F elf64-littleaarch64 +tc.arm64-linux.elf-upxfd_linux.objcopy = arm64-linux-objcopy-2.25 -F elf64-littleaarch64 tc.arm64-linux.elf-entry.objdump = arm64-linux-objdump-2.25 tc.arm64-linux.elf-so_entry.objdump = arm64-linux-objdump-2.25 @@ -828,6 +853,7 @@ tc.arm64-linux.elf-fold.objdump = arm64-linux-objdump-2.25 tc.arm64-linux.elf-so_fold.objdump = arm64-linux-objdump-2.25 tc.arm64-linux.elf-main2.objdump = arm64-linux-objdump-2.25 tc.arm64-linux.elf-so_main.objdump = arm64-linux-objdump-2.25 +tc.arm64-linux.elf-upxfd_linux.objdump = arm64-linux-objdump-2.25 tc.arm64-expand.objdump = arm64-linux-objdump-2.25 arm64-linux.elf-entry.h : $(srcdir)/src/$$T.S @@ -849,8 +875,17 @@ arm64-linux.elf-fold.h : $(srcdir)/src/$$T.lds \ $(call tc,f-embed_objinfo_without_xstrip_keep_dot_text,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ -arm64-linux.elf-so_fold.h : tmp/$$T.o tmp/arm64-linux.elf-so_main.o $(srcdir)/src/$$T.lds tmp/arm64-expand.o - $(call tc,ld) -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin +arm64-linux.elf-so_fold.h : $(srcdir)/src/$$T.lds \ + tmp/$$T.o \ + tmp/arm64-expand.o \ + tmp/arm64-linux.elf-help_umf.o \ + tmp/arm64-linux.elf-upxfd_linux.o \ + tmp/arm64-linux.elf-so_main.o + @echo; echo TARGET=$@ PATH=$(PATH); echo +# FIXME: multiarch-ld-2.18 creates a huge file here, so use 2.17 + $(call tc,ld) -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin +# multiarch-ld-2.17 -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin + ls -l tmp/$T.bin $(call tc,f-embed_objinfo_without_xstrip,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ @@ -867,7 +902,10 @@ tmp/arm64-expand.o: $(srcdir)/src/$$T.S $(call tc,gcc) -c $< -o $@ arm64-linux-objdump-2.25 -Dr $(tc_objdump_disasm_options) tmp/$T.o | $(RTRIM) > tmp/$T.o.disasm -tmp/amd64-linux.elf-upxfd_linux.o : $(srcdir)/src/upxfd_linux.c +tmp/arm64-linux.elf-help_umf.o: $(srcdir)/src/$$T.S + $(call tc,gcc) -c $< -o $@ + +tmp/arm64-linux.elf-upxfd_linux.o : $(srcdir)/src/upxfd_linux.c $(call tc,gcc) -c -O $< -o $@ $(call tc,objcopy) --rename-section .text=UMF_LINUX -R .comment -R .data -R .bss -R .note.GNU-stack $@ $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm diff --git a/src/stub/src/amd64-linux.elf-so_entry.S b/src/stub/src/amd64-linux.elf-so_entry.S index 096bbdbb..88073452 100644 --- a/src/stub/src/amd64-linux.elf-so_entry.S +++ b/src/stub/src/amd64-linux.elf-so_entry.S @@ -54,15 +54,16 @@ MAP_PRIVATE= 2 MAP_FIXED= 0x10 MAP_ANONYMOUS= 0x20 +__NR_close= 3 +__NR_exit= 60 __NR_mmap= 9 // 64-bit mode only! /usr/include/asm/unistd_64.h __NR_mprotect= 10 __NR_munmap= 11 __NR_memfd_create= 0x13f // 319 MFD_EXEC= 0x10 - +__NR_openat= 257 +__NR_read= 0 __NR_write= 1 -__NR_close= 3 -__NR_exit= 60 PAGE_SHIFT= 12 PAGE_MASK= (~0< "jmp top_n2b" + jmp top_n2b + +/* rotate next bit into bottom bit of reg */ +#define getnextb(reg) GETBIT; adcl reg,reg +getbit: + endbr64 + addl bits,bits; jz refill // Carry= next bit + rep; ret // rep: stop instruction pipeline (spend 1 byte for speed) +refill: // infrequent (1/32) + movl (%rsi),bits; subq $-4,%rsi // next 32 bits; set Carry + adcl bits,bits // LSB= 1 (CarryIn); CarryOut= next bit + ret + lit_n2b: movsb // *dst++ = *src++; top_n2b: @@ -219,7 +243,7 @@ no_memfd: // so try /dev/shm hlt // FIXME /dev/shm ok_memfd: pop %rcx // MATCH_22 discard "upx" - + pop /*0*NBPW*/(%rsp) // actual PAGE_MASK replaces compiled-in default push %rax; pop %arg1 // mfd push %rsp; pop %arg2 // buffer push %rax // MATCH_47 save mfd @@ -241,6 +265,7 @@ ok_memfd: push $__NR_close; call do_sys // %rsp: +// MATCH_42 ? FIXME // MATCH_11 ptr unfolded_code; for escape hatch // MATCH_10 len unfolded code; for escape hatch // MATCH_14 &so_info @@ -252,6 +277,7 @@ ok_memfd: // MATCH_07 envp pop %rax; push %rax // MATCH_11 ptr unfolded code + add $2*NBPW,%rax jmp *%rax // enter C code do_sys: // on-stack parameter: hint on error @@ -259,12 +285,12 @@ do_sys: // on-stack parameter: hint on error cmp $-4096,%rax; jb 0f; int3; 0: ret $NBPW +str_psa: + .asciz "/proc/self/auxv" + // IDENTSTR goes here section ELFMAINZ -L70: - pop %rdx // MATCH_08 &getbit - call L20 // MATCH_09 push $&fold_info fold_info: // b_info (sz_unc, sz_cpr, method) of folded code (C-language, etc.) diff --git a/src/stub/src/amd64-linux.elf-so_fold.S b/src/stub/src/amd64-linux.elf-so_fold.S index a40267cb..777b0747 100644 --- a/src/stub/src/amd64-linux.elf-so_fold.S +++ b/src/stub/src/amd64-linux.elf-so_fold.S @@ -23,6 +23,8 @@ NBPW= 8 // MATCH_07 envp section SO_HEAD +PAGE_MASK: .quad 0xfffffffffffff000 + .quad 0 // ? FIXME fold: pop %rbx // MATCH_11 ptr unfolded code pop %rbp // MATCH_10 len unfolded code @@ -45,6 +47,10 @@ fold: // pop %arg3 // MATCH_07 envp // ret // ==> user_DT_INIT +get_page_mask: .globl get_page_mask + mov PAGE_MASK(%rip),%rax + ret + section ptr_NEXT // pop %rax; call *%rax // "lea f_exp(%rip)," addressing on x86_64 subsumes the need for code, diff --git a/src/stub/src/arm64-linux.elf-so_entry.S b/src/stub/src/arm64-linux.elf-so_entry.S index 0389e8d9..2f3c34cd 100644 --- a/src/stub/src/arm64-linux.elf-so_entry.S +++ b/src/stub/src/arm64-linux.elf-so_entry.S @@ -53,10 +53,6 @@ MAP_PRIVATE= 2 MAP_FIXED= 0x10 MAP_ANONYMOUS= 0x20 -PAGE_SHIFT= 12 -PAGE_MASK= (~0<