mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
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
This commit is contained in:
parent
f606b5879b
commit
44328aee76
|
@ -204,8 +204,8 @@ PackLinuxElf64::checkEhdr(Elf64_Ehdr const *ehdr) const
|
||||||
PackLinuxElf::PackLinuxElf(InputFile *f)
|
PackLinuxElf::PackLinuxElf(InputFile *f)
|
||||||
: super(f), e_phnum(0), dynstr(NULL),
|
: super(f), e_phnum(0), dynstr(NULL),
|
||||||
sz_phdrs(0), sz_elf_hdrs(0), sz_pack2(0), sz_pack2a(0),
|
sz_phdrs(0), sz_elf_hdrs(0), sz_pack2(0), sz_pack2a(0),
|
||||||
lg2_page(12), page_size(1u<<lg2_page), xct_off(0), xct_va(0),
|
lg2_page(12), page_size(1u<<lg2_page), is_big(0),
|
||||||
jni_onload_va(0),
|
xct_off(0), xct_va(0), jni_onload_va(0),
|
||||||
e_machine(0), ei_class(0), ei_data(0), ei_osabi(0), osabi_note(NULL),
|
e_machine(0), ei_class(0), ei_data(0), ei_osabi(0), osabi_note(NULL),
|
||||||
o_elf_shnum(0)
|
o_elf_shnum(0)
|
||||||
{
|
{
|
||||||
|
@ -516,11 +516,11 @@ void PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
|
||||||
void
|
void
|
||||||
PackLinuxElf::addStubEntrySections(Filter const *)
|
PackLinuxElf::addStubEntrySections(Filter const *)
|
||||||
{
|
{
|
||||||
|
int all_pages = opt->o_unix.unmap_all_pages | is_big;
|
||||||
addLoader("ELFMAINX", NULL);
|
addLoader("ELFMAINX", NULL);
|
||||||
if (hasLoaderSection("ELFMAINXu")) {
|
if (hasLoaderSection("ELFMAINXu")) {
|
||||||
int const all_pages = opt->o_unix.unmap_all_pages ||
|
|
||||||
// brk() trouble if static
|
// 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((all_pages ? "LUNMP000" : "LUNMP001"), "ELFMAINXu", NULL);
|
||||||
}
|
}
|
||||||
//addLoader(getDecompressorSections(), NULL);
|
//addLoader(getDecompressorSections(), NULL);
|
||||||
|
@ -534,7 +534,7 @@ PackLinuxElf::addStubEntrySections(Filter const *)
|
||||||
addLoader("CFLUSH");
|
addLoader("CFLUSH");
|
||||||
addLoader("ELFMAINY,IDENTSTR,+40,ELFMAINZ", NULL);
|
addLoader("ELFMAINY,IDENTSTR,+40,ELFMAINZ", NULL);
|
||||||
if (hasLoaderSection("ELFMAINZu")) {
|
if (hasLoaderSection("ELFMAINZu")) {
|
||||||
addLoader((opt->o_unix.unmap_all_pages ? "LUNMP000" : "LUNMP001"), "ELFMAINZu", NULL);
|
addLoader((all_pages ? "LUNMP000" : "LUNMP001"), "ELFMAINZu", NULL);
|
||||||
}
|
}
|
||||||
addLoader("FOLDEXEC", NULL);
|
addLoader("FOLDEXEC", NULL);
|
||||||
}
|
}
|
||||||
|
@ -881,7 +881,8 @@ void PackLinuxElf32x86::addStubEntrySections(Filter const *ft)
|
||||||
if (Elf32_Ehdr::ET_DYN==get_te16(&ehdri.e_type)) {
|
if (Elf32_Ehdr::ET_DYN==get_te16(&ehdri.e_type)) {
|
||||||
addLoader("LEXECDYN", NULL);
|
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);
|
addLoader("FOLDEXEC", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1041,7 +1042,7 @@ PackLinuxElf64amd::defineSymbols(Filter const *)
|
||||||
unsigned lenm;
|
unsigned lenm;
|
||||||
unsigned lenu;
|
unsigned lenu;
|
||||||
len += (7&-lsize) + lsize;
|
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)) {
|
if (is_big && ehdri.ET_EXEC==get_te16(&ehdri.e_type)) {
|
||||||
set_te64( &elfout.ehdr.e_entry,
|
set_te64( &elfout.ehdr.e_entry,
|
||||||
get_te64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
|
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 adrc;
|
||||||
unsigned adrm;
|
unsigned adrm;
|
||||||
|
|
||||||
bool const is_big = true; // kernel disallows mapping below 0x8000.
|
is_big = true; // kernel disallows mapping below 0x8000.
|
||||||
if (is_big) {
|
if (is_big) {
|
||||||
set_te32( &elfout.ehdr.e_entry, linker->getSymbolOffset("_start") +
|
set_te32( &elfout.ehdr.e_entry, linker->getSymbolOffset("_start") +
|
||||||
get_te32(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
|
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 lenm;
|
||||||
unsigned lenu;
|
unsigned lenu;
|
||||||
len += (7&-lsize) + lsize;
|
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) {
|
if (is_big) {
|
||||||
set_te32( &elfout.ehdr.e_entry,
|
set_te32( &elfout.ehdr.e_entry,
|
||||||
get_te32(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
|
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 lenm;
|
||||||
unsigned lenu;
|
unsigned lenu;
|
||||||
len += (7&-lsize) + lsize;
|
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) {
|
if (is_big) {
|
||||||
set_te32( &elfout.ehdr.e_entry,
|
set_te32( &elfout.ehdr.e_entry,
|
||||||
get_te32(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
|
get_te32(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
|
||||||
|
|
|
@ -81,6 +81,7 @@ protected:
|
||||||
unsigned sz_pack2a; // after pack2() of all PT_LOAD
|
unsigned sz_pack2a; // after pack2() of all PT_LOAD
|
||||||
unsigned lg2_page; // log2(PAGE_SIZE)
|
unsigned lg2_page; // log2(PAGE_SIZE)
|
||||||
unsigned page_size; // 1u<<lg2_page
|
unsigned page_size; // 1u<<lg2_page
|
||||||
|
unsigned is_big; // stub style: must use area above the brk
|
||||||
unsigned xct_off; // shared library: file offset of SHT_EXECINSTR
|
unsigned xct_off; // shared library: file offset of SHT_EXECINSTR
|
||||||
unsigned hatch_off; // file offset of escape hatch
|
unsigned hatch_off; // file offset of escape hatch
|
||||||
upx_uint64_t load_va; // PT_LOAD[0].p_vaddr
|
upx_uint64_t load_va; // PT_LOAD[0].p_vaddr
|
||||||
|
|
Loading…
Reference in New Issue
Block a user