From 44328aee76961311afb488229834e72e42b0832e Mon Sep 17 00:00:00 2001 From: John Reiser Date: Sat, 15 Oct 2016 14:06:56 -0700 Subject: [PATCH] fix brk() problem when is_big: stub must munmap all_pages https://github.com/upx/upx/issues/5 modified: p_lx_elf.cpp modified: p_lx_elf.h --- src/p_lx_elf.cpp | 21 +++++++++++---------- src/p_lx_elf.h | 1 + 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index 024f21ff..5e915023 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -204,8 +204,8 @@ PackLinuxElf64::checkEhdr(Elf64_Ehdr const *ehdr) const PackLinuxElf::PackLinuxElf(InputFile *f) : super(f), e_phnum(0), dynstr(NULL), sz_phdrs(0), sz_elf_hdrs(0), sz_pack2(0), sz_pack2a(0), - lg2_page(12), page_size(1u<o_unix.unmap_all_pages | is_big; addLoader("ELFMAINX", NULL); if (hasLoaderSection("ELFMAINXu")) { - int const all_pages = opt->o_unix.unmap_all_pages || // brk() trouble if static - (Elf32_Ehdr::EM_ARM==e_machine && 0x8000==load_va); + all_pages |= (Elf32_Ehdr::EM_ARM==e_machine && 0x8000==load_va); addLoader((all_pages ? "LUNMP000" : "LUNMP001"), "ELFMAINXu", NULL); } //addLoader(getDecompressorSections(), NULL); @@ -534,7 +534,7 @@ PackLinuxElf::addStubEntrySections(Filter const *) addLoader("CFLUSH"); addLoader("ELFMAINY,IDENTSTR,+40,ELFMAINZ", NULL); if (hasLoaderSection("ELFMAINZu")) { - addLoader((opt->o_unix.unmap_all_pages ? "LUNMP000" : "LUNMP001"), "ELFMAINZu", NULL); + addLoader((all_pages ? "LUNMP000" : "LUNMP001"), "ELFMAINZu", NULL); } addLoader("FOLDEXEC", NULL); } @@ -881,7 +881,8 @@ void PackLinuxElf32x86::addStubEntrySections(Filter const *ft) if (Elf32_Ehdr::ET_DYN==get_te16(&ehdri.e_type)) { addLoader("LEXECDYN", NULL); } - addLoader((opt->o_unix.unmap_all_pages ? "LUNMP000" : "LUNMP001"), "LEXEC025", NULL); + addLoader(((opt->o_unix.unmap_all_pages|is_big) ? "LUNMP000" : "LUNMP001"), + "LEXEC025", NULL); addLoader("FOLDEXEC", NULL); } @@ -1041,7 +1042,7 @@ PackLinuxElf64amd::defineSymbols(Filter const *) unsigned lenm; unsigned lenu; len += (7&-lsize) + lsize; - bool const is_big = (lo_va_user < (lo_va_stub + len + 2*page_size)); + is_big = (lo_va_user < (lo_va_stub + len + 2*page_size)); if (is_big && ehdri.ET_EXEC==get_te16(&ehdri.e_type)) { set_te64( &elfout.ehdr.e_entry, get_te64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub); @@ -2958,7 +2959,7 @@ void PackLinuxElf32::ARM_defineSymbols(Filter const * /*ft*/) unsigned adrc; unsigned adrm; - bool const is_big = true; // kernel disallows mapping below 0x8000. + is_big = true; // kernel disallows mapping below 0x8000. if (is_big) { set_te32( &elfout.ehdr.e_entry, linker->getSymbolOffset("_start") + get_te32(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub); @@ -3026,7 +3027,7 @@ void PackLinuxElf32mipseb::defineSymbols(Filter const * /*ft*/) unsigned lenm; unsigned lenu; len += (7&-lsize) + lsize; - bool const is_big = (lo_va_user < (lo_va_stub + len + 2*page_size)); + is_big = (lo_va_user < (lo_va_stub + len + 2*page_size)); if (is_big) { set_te32( &elfout.ehdr.e_entry, get_te32(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub); @@ -3099,7 +3100,7 @@ void PackLinuxElf32mipsel::defineSymbols(Filter const * /*ft*/) unsigned lenm; unsigned lenu; len += (7&-lsize) + lsize; - bool const is_big = (lo_va_user < (lo_va_stub + len + 2*page_size)); + is_big = (lo_va_user < (lo_va_stub + len + 2*page_size)); if (is_big) { set_te32( &elfout.ehdr.e_entry, get_te32(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub); diff --git a/src/p_lx_elf.h b/src/p_lx_elf.h index 4bd5736d..f70de120 100644 --- a/src/p_lx_elf.h +++ b/src/p_lx_elf.h @@ -81,6 +81,7 @@ protected: unsigned sz_pack2a; // after pack2() of all PT_LOAD unsigned lg2_page; // log2(PAGE_SIZE) unsigned page_size; // 1u<