summaryrefslogtreecommitdiff
path: root/view/pe
diff options
context:
space:
mode:
authorJosh Ferrell <josh@vector35.com>2024-09-16 12:22:47 -0400
committerJosh Ferrell <josh@vector35.com>2024-09-16 12:26:49 -0400
commitf65b9b035f2492ef02115326369149d1c92b294d (patch)
tree6be8eed8e586f2d800df1beaf9318d3c2ae84481 /view/pe
parente7bf7eced13853ef10a38949117679aac5f60a77 (diff)
Fail to resolve long PE section name when string table is invalid
Diffstat (limited to 'view/pe')
-rw-r--r--view/pe/coffview.cpp22
-rw-r--r--view/pe/peview.cpp22
2 files changed, 36 insertions, 8 deletions
diff --git a/view/pe/coffview.cpp b/view/pe/coffview.cpp
index f7d02fa8..edd4acbc 100644
--- a/view/pe/coffview.cpp
+++ b/view/pe/coffview.cpp
@@ -254,13 +254,27 @@ bool COFFView::Init()
string resolvedName = name;
if (name[0] == '/' && header.coffSymbolTable)
{
- uint32_t stringTableBase = header.coffSymbolTable + (header.coffSymbolCount * 18);
errno = 0;
uint32_t offset = strtoul(name+1, nullptr, 10);
- if (errno == 0 && offset > 0 && stringTableBase + offset < GetParentView()->GetEnd())
+ if (errno == 0 && offset > 0)
{
- sectionNameReader.Seek(stringTableBase + offset);
- resolvedName = sectionNameReader.ReadCString();
+ BinaryReader stringReader(GetParentView(), LittleEndian);
+ uint64_t stringTableBase = header.coffSymbolTable + (header.coffSymbolCount * 18);
+ stringReader.Seek(stringTableBase);
+ uint32_t stringTableLen = stringReader.Read32();
+ if ((stringTableBase + stringTableLen) > GetParentView()->GetEnd())
+ {
+ LogError("Cannot resolve section name \"%s\": String table is invalid length", name);
+ }
+ else if (stringTableBase + offset < GetParentView()->GetEnd())
+ {
+ sectionNameReader.Seek(stringTableBase + offset);
+ resolvedName = sectionNameReader.ReadCString();
+ }
+ else
+ {
+ LogError("Cannot resolve section name \"%s\": Offset is past end of string table", name);
+ }
}
}
section.name = resolvedName;
diff --git a/view/pe/peview.cpp b/view/pe/peview.cpp
index 3ae26ea5..cfeb63b2 100644
--- a/view/pe/peview.cpp
+++ b/view/pe/peview.cpp
@@ -752,13 +752,27 @@ bool PEView::Init()
string resolvedName = name;
if (name[0] == '/' && header.coffSymbolTable)
{
- uint32_t stringTableBase = header.coffSymbolTable + (header.coffSymbolCount * 18);
errno = 0;
uint32_t offset = strtoul(name+1, nullptr, 10);
- if (errno == 0 && offset > 0 && stringTableBase + offset < GetParentView()->GetEnd())
+ if (errno == 0 && offset > 0)
{
- sectionNameReader.Seek(stringTableBase + offset);
- resolvedName = sectionNameReader.ReadCString();
+ BinaryReader stringReader(GetParentView(), LittleEndian);
+ uint64_t stringTableBase = header.coffSymbolTable + (header.coffSymbolCount * 18);
+ stringReader.Seek(stringTableBase);
+ uint32_t stringTableLen = stringReader.Read32();
+ if ((stringTableBase + stringTableLen) > GetParentView()->GetEnd())
+ {
+ m_logger->LogError("Cannot resolve section name \"%s\": String table is invalid length", name);
+ }
+ else if (stringTableBase + offset < GetParentView()->GetEnd())
+ {
+ sectionNameReader.Seek(stringTableBase + offset);
+ resolvedName = sectionNameReader.ReadCString();
+ }
+ else
+ {
+ m_logger->LogError("Cannot resolve section name \"%s\": Offset is past end of string table", name);
+ }
}
}
section.name = resolvedName;