Detect bogus DT_SYMENT.
https://github.com/upx/upx/issues/331 modified: p_lx_elf.cpp
This commit is contained in:
@@ -1614,9 +1614,17 @@ PackLinuxElf32::invert_pt_dynamic(Elf32_Dyn const *dynp)
|
|||||||
unsigned const z_sym = dt_table[Elf32_Dyn::DT_SYMENT];
|
unsigned const z_sym = dt_table[Elf32_Dyn::DT_SYMENT];
|
||||||
unsigned const sz_sym = !z_sym ? sizeof(Elf32_Sym)
|
unsigned const sz_sym = !z_sym ? sizeof(Elf32_Sym)
|
||||||
: get_te32(&dynp0[-1+ z_sym].d_val);
|
: get_te32(&dynp0[-1+ z_sym].d_val);
|
||||||
|
if (sz_sym < sizeof(Elf32_Sym)) {
|
||||||
|
char msg[50]; snprintf(msg, sizeof(msg),
|
||||||
|
"bad DT_SYMENT %x", sz_sym);
|
||||||
|
throwCantPack(msg);
|
||||||
|
}
|
||||||
if (v_sym < v_str) {
|
if (v_sym < v_str) {
|
||||||
symnum_end = (v_str - v_sym) / sz_sym;
|
symnum_end = (v_str - v_sym) / sz_sym;
|
||||||
}
|
}
|
||||||
|
if (symnum_end < 1) {
|
||||||
|
throwCantPack("bad DT_SYMTAB");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// DT_HASH often ends at DT_SYMTAB
|
// DT_HASH often ends at DT_SYMTAB
|
||||||
unsigned const v_hsh = elf_unsigned_dynamic(Elf32_Dyn::DT_HASH);
|
unsigned const v_hsh = elf_unsigned_dynamic(Elf32_Dyn::DT_HASH);
|
||||||
@@ -5104,9 +5112,17 @@ PackLinuxElf64::invert_pt_dynamic(Elf64_Dyn const *dynp)
|
|||||||
unsigned const z_sym = dt_table[Elf64_Dyn::DT_SYMENT];
|
unsigned const z_sym = dt_table[Elf64_Dyn::DT_SYMENT];
|
||||||
unsigned const sz_sym = !z_sym ? sizeof(Elf64_Sym)
|
unsigned const sz_sym = !z_sym ? sizeof(Elf64_Sym)
|
||||||
: get_te64(&dynp0[-1+ z_sym].d_val);
|
: get_te64(&dynp0[-1+ z_sym].d_val);
|
||||||
|
if (sz_sym < sizeof(Elf64_Sym)) {
|
||||||
|
char msg[50]; snprintf(msg, sizeof(msg),
|
||||||
|
"bad DT_SYMENT %x", sz_sym);
|
||||||
|
throwCantPack(msg);
|
||||||
|
}
|
||||||
if (v_sym < v_str) {
|
if (v_sym < v_str) {
|
||||||
symnum_end = (v_str - v_sym) / sz_sym;
|
symnum_end = (v_str - v_sym) / sz_sym;
|
||||||
}
|
}
|
||||||
|
if (symnum_end < 1) {
|
||||||
|
throwCantPack("bad DT_SYMTAB");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// DT_HASH often ends at DT_SYMTAB
|
// DT_HASH often ends at DT_SYMTAB
|
||||||
unsigned const v_hsh = elf_unsigned_dynamic(Elf64_Dyn::DT_HASH);
|
unsigned const v_hsh = elf_unsigned_dynamic(Elf64_Dyn::DT_HASH);
|
||||||
|
|||||||
Reference in New Issue
Block a user