mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
put overlay into PT_LOAD, in order to protect from /usr/bin/strip,
and prepare to discontinue use of /proc/exe by stub p_unix.cpp p_unix.h stub/Makefile stub/l_lx_exec86.lds committer: jreiser <jreiser> 958837765 +0000
This commit is contained in:
parent
e6e9229942
commit
7854a924c7
|
@ -191,6 +191,8 @@ void PackUnix::pack(OutputFile *fo)
|
|||
set_native32(obuf, lsize);
|
||||
fo->write(obuf, 4);
|
||||
|
||||
updateLoader(fo);
|
||||
|
||||
// finally check compression ratio
|
||||
if (!Packer::checkCompressionRatio(fo->getBytesWritten(), ph.u_len))
|
||||
throwNotCompressible();
|
||||
|
@ -425,13 +427,14 @@ void PackLinuxI386::patchLoader()
|
|||
patchVersion(loader,lsize);
|
||||
|
||||
// The beginning of our loader consists of a elf_hdr (52 bytes) and
|
||||
// two sections elf_phdr (2 * 32 byte), so we have 12 free bytes
|
||||
// one section elf_phdr (32 byte) now,
|
||||
// another section elf_phdr (32 byte) later, so we have 12 free bytes
|
||||
// from offset 116 to the program start at offset 128.
|
||||
assert(get_le32(loader + 28) == 52); // e_phoff
|
||||
assert(get_le32(loader + 32) == 0); // e_shoff
|
||||
assert(get_le16(loader + 40) == 52); // e_ehsize
|
||||
assert(get_le16(loader + 42) == 32); // e_phentsize
|
||||
assert(get_le16(loader + 44) == 2); // e_phnum
|
||||
assert(get_le16(loader + 44) == 1); // e_phnum
|
||||
assert(get_le16(loader + 48) == 0); // e_shnum
|
||||
assert(lsize > 128 && lsize < 4096);
|
||||
|
||||
|
@ -454,6 +457,32 @@ void PackLinuxI386::patchLoaderChecksum()
|
|||
}
|
||||
|
||||
|
||||
void PackLinuxI386::updateLoader(OutputFile *fo)
|
||||
{
|
||||
#define PAGE_MASK (~0<<12)
|
||||
Elf_LE32_Ehdr *ehdr = (Elf_LE32_Ehdr *)(unsigned char *)loader;
|
||||
ehdr->e_phnum = 2;
|
||||
|
||||
// The first Phdr maps the stub (instructions, data, bss) rwx.
|
||||
// Round up hi address to page boundary.
|
||||
Elf_LE32_Phdr *phdro = (Elf_LE32_Phdr *)(sizeof(Elf_LE32_Ehdr)+loader);
|
||||
unsigned const vaddr2 = PAGE_MASK & (~PAGE_MASK + phdro->p_memsz + phdro->p_vaddr);
|
||||
|
||||
// The second Phdr maps the overlay r--,
|
||||
// to defend against /usr/bin/strip removing the overlay.
|
||||
++phdro;
|
||||
phdro->p_type = PT_LOAD;
|
||||
phdro->p_offset = lsize;
|
||||
phdro->p_paddr = phdro->p_vaddr = vaddr2 + (lsize &~ PAGE_MASK);
|
||||
phdro->p_memsz = phdro->p_filesz = fo->getBytesWritten() - lsize;
|
||||
phdro->p_flags = PF_R;
|
||||
phdro->p_align = -PAGE_MASK;
|
||||
|
||||
patchLoaderChecksum();
|
||||
fo->seek(0, SEEK_SET);
|
||||
fo->rewrite(loader, 0x80);
|
||||
#undef PAGE_MASK
|
||||
}
|
||||
/*
|
||||
vi:ts=4:et
|
||||
*/
|
||||
|
|
|
@ -53,6 +53,7 @@ protected:
|
|||
// called by the generic pack()
|
||||
virtual void patchLoader() = 0;
|
||||
virtual void patchLoaderChecksum() {}
|
||||
virtual void updateLoader(OutputFile *) = 0;
|
||||
|
||||
// in order too share as much code as possible we introduce
|
||||
// an endian abstraction here
|
||||
|
@ -146,6 +147,7 @@ protected:
|
|||
|
||||
virtual void patchLoader();
|
||||
virtual void patchLoaderChecksum();
|
||||
virtual void updateLoader(OutputFile *);
|
||||
|
||||
enum {
|
||||
UPX_ELF_MAGIC = 0x5850557f // "\x7fUPX"
|
||||
|
|
|
@ -186,9 +186,9 @@ l_w32pe.h: l_w32pe.asx
|
|||
# // linux rules (exec, elf, sh, sep)
|
||||
# ************************************************************************/
|
||||
|
||||
l_lx_n2b.h: l_lx_exec.c l_xe_n2b.o
|
||||
$(CC_LINUX) -DNRV2B -s -o $T.o -c $<
|
||||
ld -s -Map l_lx_n2b.map -o $T.bin \
|
||||
l_lx_n2b.h: l_lx_exec.c l_xe_n2b.o l_lx_exec86.lds
|
||||
$(CC_LINUX) -DNRV2B -o $T.o -c $<
|
||||
ld -T l_lx_exec86.lds -Map l_lx_n2b.map -o $T.bin \
|
||||
l_xe_n2b.o $T.o
|
||||
objcopy -S -R .comment -R .note $T.bin
|
||||
$(STRIPELF) $T.bin
|
||||
|
@ -196,8 +196,8 @@ l_lx_n2b.h: l_lx_exec.c l_xe_n2b.o
|
|||
$(BIN2H) $T.bin linux_i386exec_nrv2b_loader $@
|
||||
|
||||
l_le_n2b.h: l_lx_elf.c l_6e_n2b.o l_lx_elf86.lds
|
||||
$(CC_LINUX) -DNRV2B -s -o $T.o -c $<
|
||||
ld -T l_lx_elf86.lds -s -Map $T.map -o $T.bin \
|
||||
$(CC_LINUX) -DNRV2B -o $T.o -c $<
|
||||
ld -T l_lx_elf86.lds -Map $T.map -o $T.bin \
|
||||
l_6e_n2b.o $T.o
|
||||
objcopy -S -R .comment -R .note $T.bin
|
||||
$(SETFOLD) $T.bin 0x`nm l_6e_n2b.o | grep fold_begin`
|
||||
|
@ -206,8 +206,8 @@ l_le_n2b.h: l_lx_elf.c l_6e_n2b.o l_lx_elf86.lds
|
|||
$(BIN2H) $T.bin linux_i386elf_nrv2b_loader $@
|
||||
|
||||
l_sh_n2b.h: l_lx_sh.c l_6h_n2b.o l_lx_sh86.lds
|
||||
$(CC_LINUX) -DNRV2B -s -o $T.o -c $<
|
||||
ld -T l_lx_sh86.lds -s -Map $T.map -o $T.bin \
|
||||
$(CC_LINUX) -DNRV2B -o $T.o -c $<
|
||||
ld -T l_lx_sh86.lds -Map $T.map -o $T.bin \
|
||||
l_6h_n2b.o $T.o
|
||||
objcopy -S -R .comment -R .note $T.bin
|
||||
$(SETFOLD) $T.bin 0x`nm l_6h_n2b.o | grep fold_begin`
|
||||
|
@ -225,9 +225,9 @@ l_6h_n2b.o: l_lx_sh86.asm
|
|||
$(NASM) -i$(UCL_I386)/ -f elf -dNRV2B -o $@ $<
|
||||
|
||||
|
||||
l_lx_n2d.h: l_lx_exec.c l_xe_n2d.o
|
||||
$(CC_LINUX) -DNRV2D -s -o $T.o -c $<
|
||||
ld -s -Map $T.map -o $T.bin \
|
||||
l_lx_n2d.h: l_lx_exec.c l_xe_n2d.o l_lx_exec86.lds
|
||||
$(CC_LINUX) -DNRV2D -o $T.o -c $<
|
||||
ld -T l_lx_exec86.lds -Map $T.map -o $T.bin \
|
||||
l_xe_n2d.o $T.o
|
||||
objcopy -S -R .comment -R .note $T.bin
|
||||
$(STRIPELF) $T.bin
|
||||
|
@ -235,8 +235,8 @@ l_lx_n2d.h: l_lx_exec.c l_xe_n2d.o
|
|||
$(BIN2H) $T.bin linux_i386exec_nrv2d_loader $@
|
||||
|
||||
l_le_n2d.h: l_lx_elf.c l_6e_n2d.o l_lx_elf86.lds
|
||||
$(CC_LINUX) -DNRV2D -s -o $T.o -c $<
|
||||
ld -T l_lx_elf86.lds -s -Map $T.map -o $T.bin \
|
||||
$(CC_LINUX) -DNRV2D -o $T.o -c $<
|
||||
ld -T l_lx_elf86.lds -Map $T.map -o $T.bin \
|
||||
l_6e_n2d.o $T.o
|
||||
objcopy -S -R .comment -R .note $T.bin
|
||||
$(SETFOLD) $T.bin 0x`nm l_6e_n2d.o | grep fold_begin`
|
||||
|
@ -245,8 +245,8 @@ l_le_n2d.h: l_lx_elf.c l_6e_n2d.o l_lx_elf86.lds
|
|||
$(BIN2H) $T.bin linux_i386elf_nrv2d_loader $@
|
||||
|
||||
l_sh_n2d.h: l_lx_sh.c l_6h_n2d.o l_lx_sh86.lds
|
||||
$(CC_LINUX) -DNRV2D -s -o $T.o -c $<
|
||||
ld -T l_lx_sh86.lds -s -Map $T.map -o $T.bin \
|
||||
$(CC_LINUX) -DNRV2D -o $T.o -c $<
|
||||
ld -T l_lx_sh86.lds -Map $T.map -o $T.bin \
|
||||
l_6h_n2d.o $T.o
|
||||
objcopy -S -R .comment -R .note $T.bin
|
||||
$(SETFOLD) $T.bin 0x`nm l_6h_n2d.o | grep fold_begin`
|
||||
|
|
17
src/stub/l_lx_exec86.lds
Normal file
17
src/stub/l_lx_exec86.lds
Normal file
|
@ -0,0 +1,17 @@
|
|||
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
|
||||
OUTPUT_ARCH(i386)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
/* 0x08048000: customary Linux/x86 Elf .text start */
|
||||
. = 0x08048000 + SIZEOF_HEADERS;
|
||||
. = ALIGN(0x80); /* room for Ehdr, 2*Phdr, l_info */
|
||||
.data : { /* put everything together in one Phdr */
|
||||
*(.text)
|
||||
*(.rodata)
|
||||
*(.data)
|
||||
*(.bss)
|
||||
*(COMMON)
|
||||
}
|
||||
/* save other Phdr for the overlay */
|
||||
}
|
Loading…
Reference in New Issue
Block a user