PeFile: Defend against bad crafted import descriptors
https://github.com/upx/upx/issues/143 modified: pefile.cpp modified: pefile.h
This commit is contained in:
+43
-6
@@ -547,12 +547,49 @@ void PeFile64::processRelocs() // pass1
|
|||||||
// import handling
|
// import handling
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
__packed_struct(import_desc)
|
//__packed_struct(import_desc)
|
||||||
LE32 oft; // orig first thunk
|
// LE32 oft; // orig first thunk
|
||||||
char _[8];
|
// char _[8];
|
||||||
LE32 dllname;
|
// LE32 dllname;
|
||||||
LE32 iat; // import address table
|
// LE32 iat; // import address table
|
||||||
__packed_struct_end()
|
//__packed_struct_end()
|
||||||
|
|
||||||
|
LE32& PeFile::IDSIZE(unsigned x) {
|
||||||
|
if ((file_size - sizeof(import_desc)) < iddirs[x].size) {
|
||||||
|
char buf[52];
|
||||||
|
snprintf(buf,sizeof(buf),"bad import[%d].size %#x",
|
||||||
|
(unsigned)x, (unsigned)iddirs[x].size);
|
||||||
|
throwCantPack(buf);
|
||||||
|
}
|
||||||
|
return iddirs[x].size;
|
||||||
|
}
|
||||||
|
LE32& PeFile::IDADDR(unsigned x) {
|
||||||
|
if ((file_size - sizeof(import_desc)) < iddirs[x].vaddr) {
|
||||||
|
char buf[52];
|
||||||
|
snprintf(buf,sizeof(buf),"bad import[%d].vaddr %#x",
|
||||||
|
(unsigned)x, (unsigned)iddirs[x].vaddr);
|
||||||
|
throwCantPack(buf);
|
||||||
|
}
|
||||||
|
return iddirs[x].vaddr;
|
||||||
|
}
|
||||||
|
LE32& PeFile::ODSIZE(unsigned x) {
|
||||||
|
if ((file_size - sizeof(import_desc)) < oddirs[x].size) {
|
||||||
|
char buf[52];
|
||||||
|
snprintf(buf,sizeof(buf),"bad export[%d].size %#x",
|
||||||
|
(unsigned)x, (unsigned)oddirs[x].size);
|
||||||
|
throwCantPack(buf);
|
||||||
|
}
|
||||||
|
return oddirs[x].size;
|
||||||
|
}
|
||||||
|
LE32& PeFile::ODADDR(unsigned x) {
|
||||||
|
if ((file_size - sizeof(import_desc)) < oddirs[x].vaddr) {
|
||||||
|
char buf[52];
|
||||||
|
snprintf(buf,sizeof(buf),"bad export[%d].vaddr %#x",
|
||||||
|
(unsigned)x, (unsigned)oddirs[x].vaddr);
|
||||||
|
throwCantPack(buf);
|
||||||
|
}
|
||||||
|
return oddirs[x].vaddr;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ImportLinker: 32 and 64 bit import table building.
|
ImportLinker: 32 and 64 bit import table building.
|
||||||
|
|||||||
+11
-4
@@ -178,10 +178,17 @@ protected:
|
|||||||
ddirs_t *iddirs;
|
ddirs_t *iddirs;
|
||||||
ddirs_t *oddirs;
|
ddirs_t *oddirs;
|
||||||
|
|
||||||
LE32 &IDSIZE(unsigned x) { return iddirs[x].size; }
|
__packed_struct(import_desc)
|
||||||
LE32 &IDADDR(unsigned x) { return iddirs[x].vaddr; }
|
LE32 oft; // orig first thunk
|
||||||
LE32 &ODSIZE(unsigned x) { return oddirs[x].size; }
|
char _[8];
|
||||||
LE32 &ODADDR(unsigned x) { return oddirs[x].vaddr; }
|
LE32 dllname;
|
||||||
|
LE32 iat; // import address table
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
LE32 &IDSIZE(unsigned x);
|
||||||
|
LE32 &IDADDR(unsigned x);
|
||||||
|
LE32 &ODSIZE(unsigned x);
|
||||||
|
LE32 &ODADDR(unsigned x);
|
||||||
|
|
||||||
__packed_struct(pe_section_t)
|
__packed_struct(pe_section_t)
|
||||||
char name[8];
|
char name[8];
|
||||||
|
|||||||
Reference in New Issue
Block a user