diff options
| author | Josh Ferrell <josh@vector35.com> | 2024-09-16 12:22:47 -0400 |
|---|---|---|
| committer | Josh Ferrell <josh@vector35.com> | 2024-09-16 12:26:49 -0400 |
| commit | f65b9b035f2492ef02115326369149d1c92b294d (patch) | |
| tree | 6be8eed8e586f2d800df1beaf9318d3c2ae84481 /view/pe | |
| parent | e7bf7eced13853ef10a38949117679aac5f60a77 (diff) | |
Fail to resolve long PE section name when string table is invalid
Diffstat (limited to 'view/pe')
| -rw-r--r-- | view/pe/coffview.cpp | 22 | ||||
| -rw-r--r-- | view/pe/peview.cpp | 22 |
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; |
