mirror of
https://github.com/upx/upx.git
synced 2025-08-11 22:52:30 +08:00
Change stub for arm64 shlib to work with SELinux
modified: stub/src/arm64-linux.elf-so_entry.S modified: stub/src/arm64-linux.elf-so_fold.S
This commit is contained in:
@ -58,7 +58,9 @@ PAGE_MASK= (~0<<PAGE_SHIFT)
|
|||||||
PAGE_SIZE= -PAGE_MASK
|
PAGE_SIZE= -PAGE_MASK
|
||||||
|
|
||||||
// /usr/include/asm-generic/unistd.h
|
// /usr/include/asm-generic/unistd.h
|
||||||
|
__NR_close = 0x39 // 57
|
||||||
__NR_exit = 0x5d // 93
|
__NR_exit = 0x5d // 93
|
||||||
|
__NR_memfd_create = 0x117 // 279
|
||||||
__NR_mmap = 0xde // 222
|
__NR_mmap = 0xde // 222
|
||||||
__NR_mprotect = 0xe2 // 226
|
__NR_mprotect = 0xe2 // 226
|
||||||
__NR_munmap = 0xd7 // 215
|
__NR_munmap = 0xd7 // 215
|
||||||
@ -91,7 +93,7 @@ arg6w .req w5
|
|||||||
|
|
||||||
.balign 4
|
.balign 4
|
||||||
_start: .globl _start
|
_start: .globl _start
|
||||||
nop // bkpt DEBUG
|
nop // bkpt // DEBUG
|
||||||
PUSH4 (x0,x1,x2,lr) // MATCH_00
|
PUSH4 (x0,x1,x2,lr) // MATCH_00
|
||||||
|
|
||||||
sub sp,sp,#2*NBPW // space for ADRU, LENU
|
sub sp,sp,#2*NBPW // space for ADRU, LENU
|
||||||
@ -99,33 +101,54 @@ F_ADRU= 0 * NBPW
|
|||||||
F_LENU= 1 * NBPW
|
F_LENU= 1 * NBPW
|
||||||
F_ARGC= 2 * NBPW
|
F_ARGC= 2 * NBPW
|
||||||
|
|
||||||
call L70
|
old_sp .req x15
|
||||||
L70ret:
|
foldi .req x14
|
||||||
foldi .req lr // &fold_info
|
u_ptr .req x12
|
||||||
mov arg6,#0 // cleanliness
|
mfd .req w11
|
||||||
mov arg5w,#-1 // fd
|
bl L70
|
||||||
mov arg4w,#MAP_PRIVATE|MAP_ANONYMOUS // modes
|
L70_ret:
|
||||||
mov arg3w,#PROT_READ|PROT_WRITE // prot
|
mov foldi,lr
|
||||||
ldr arg2w,[foldi, #sz_unc] // dstlen
|
|
||||||
str arg2,[sp, #F_LENU]
|
|
||||||
mov arg1,#0 // addr (kernel chooses)
|
|
||||||
do_sys __NR_mmap; cmn x0,#4096; bcc 0f; bkpt; 0:
|
|
||||||
str x0,[sp, #F_ADRU]
|
|
||||||
|
|
||||||
add arg4,sp,#F_LENU // &dstlen
|
mov old_sp,sp
|
||||||
mov arg3,x0 // dst
|
ldr w0,[foldi,#sz_unc]
|
||||||
ldr arg2w,[foldi, #sz_cpr] // srclen
|
str x0,[old_sp,#F_LENU]
|
||||||
|
sub x0,sp,x0 // alloca
|
||||||
|
and sp,x0,#-2*NBPW // align stack
|
||||||
|
|
||||||
|
add arg4,old_sp,#F_LENU // &dstlen
|
||||||
|
mov arg3,sp // dst for decompress
|
||||||
|
ldr arg2w,[foldi,#sz_cpr] // srclen
|
||||||
add arg1,foldi,#sz_b_info // src
|
add arg1,foldi,#sz_b_info // src
|
||||||
call f_decompress // includes cache flush
|
bl f_decompress
|
||||||
|
|
||||||
ldp arg1,arg2,[sp, #F_ADRU] // and F_LENU
|
mov arg2w,#0
|
||||||
mov arg3w,#PROT_EXEC|PROT_READ
|
adr arg1,str_upx
|
||||||
do_sys __NR_mprotect
|
do_sys __NR_memfd_create; mov mfd, w0
|
||||||
|
|
||||||
|
mov arg2,sp
|
||||||
|
ldr arg3,[old_sp,#F_LENU]
|
||||||
|
do_sys __NR_write
|
||||||
|
mov sp,old_sp // de-alloca
|
||||||
|
|
||||||
|
mov arg6,#0 // beginning of file
|
||||||
|
mov arg5w,mfd
|
||||||
|
mov arg4w,#MAP_PRIVATE // modes
|
||||||
|
mov arg3w,#PROT_READ|PROT_EXEC // prot
|
||||||
|
ldr arg2,[sp,#F_LENU]
|
||||||
|
mov arg1,#0 // addr (kernel chooses)
|
||||||
|
do_sys __NR_mmap; str x0,[sp,#F_ADRU]
|
||||||
|
mov u_ptr,x0
|
||||||
|
|
||||||
|
mov arg1w,mfd
|
||||||
|
do_sys __NR_close
|
||||||
|
|
||||||
|
adr arg1,_start - 4*4 // &SO_INFO
|
||||||
|
add arg2,sp,#F_ARGC // &{argc, argv, envp}
|
||||||
|
br u_ptr
|
||||||
|
|
||||||
|
str_upx:
|
||||||
|
.asciz "upx"
|
||||||
|
|
||||||
adr x0,_start - 4*4 // &SO_INFO
|
|
||||||
add x1,sp,#F_ARGC
|
|
||||||
ldr x2,[sp, #F_ADRU] // invoke folded code
|
|
||||||
br x2
|
|
||||||
//%esp:
|
//%esp:
|
||||||
// MATCH_04 ptr unfolded_code
|
// MATCH_04 ptr unfolded_code
|
||||||
// MATCH_10 len unfolded_code
|
// MATCH_10 len unfolded_code
|
||||||
|
@ -32,37 +32,14 @@
|
|||||||
NBPW= 8
|
NBPW= 8
|
||||||
#define bkpt brk #0
|
#define bkpt brk #0
|
||||||
|
|
||||||
sz_Elf64_Ehdr = 8*4
|
|
||||||
sz_Elf64_Phdr = 7*4
|
|
||||||
p_vaddr= 4+4
|
|
||||||
sz_l_info = 12
|
|
||||||
sz_p_info = 12
|
|
||||||
sz_b_info = 12
|
|
||||||
sz_unc= 0
|
|
||||||
sz_cpr= 4
|
|
||||||
b_method= 8
|
|
||||||
|
|
||||||
MAP_ANONYMOUS= 0x20
|
MAP_ANONYMOUS= 0x20
|
||||||
MAP_PRIVATE= 0x02
|
MAP_PRIVATE= 0x02
|
||||||
MAP_FIXED= 0x10
|
MAP_FIXED= 0x10
|
||||||
|
|
||||||
PROT_READ= 0x1
|
|
||||||
PROT_WRITE= 0x2
|
|
||||||
|
|
||||||
O_RDONLY= 0
|
|
||||||
|
|
||||||
PAGE_SHIFT= 12
|
|
||||||
PAGE_SIZE = -(~0<<PAGE_SHIFT)
|
|
||||||
PATHMAX= 4096
|
|
||||||
|
|
||||||
PATH_MAX= 4096
|
|
||||||
|
|
||||||
#ifndef DEBUG /*{*/
|
#ifndef DEBUG /*{*/
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
#define TRACE_REGS r0-r12,r14,r15
|
|
||||||
#endif /*}*/
|
#endif /*}*/
|
||||||
|
|
||||||
#define OVERHEAD 2048
|
|
||||||
#define call bl
|
#define call bl
|
||||||
|
|
||||||
section SO_HEAD
|
section SO_HEAD
|
||||||
|
Reference in New Issue
Block a user