diff options
| author | Mason Reed <mason@vector35.com> | 2024-11-05 17:50:49 -0500 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2024-11-05 17:51:06 -0500 |
| commit | 00622fa4829c3852ffad840fb7f94cc96ecee83f (patch) | |
| tree | 6404a5125f67209c5e1bde15b5e64fe48828d1de /plugins | |
| parent | 350726c8f8e149942aab677f7926aece536fc0e7 (diff) | |
MSVC RTTI: More robust CompleteObjectLocator verification
Must be within section now
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/msvc_rtti/rtti.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/plugins/msvc_rtti/rtti.cpp b/plugins/msvc_rtti/rtti.cpp index 56b53477..073acdd6 100644 --- a/plugins/msvc_rtti/rtti.cpp +++ b/plugins/msvc_rtti/rtti.cpp @@ -75,7 +75,10 @@ std::optional<CompleteObjectLocator> ReadCompleteObjectorLocator(BinaryView *vie { auto coLocator = CompleteObjectLocator(view, address); uint64_t startAddr = view->GetOriginalImageBase(); - uint64_t endAddr = view->GetEnd(); + + auto outsideSection = [&](uint64_t addr) { + return view->GetSectionsAt(addr).empty(); + }; if (coLocator.signature > 1) return std::nullopt; @@ -86,18 +89,19 @@ std::optional<CompleteObjectLocator> ReadCompleteObjectorLocator(BinaryView *vie return std::nullopt; // Relative addrs - if (coLocator.pTypeDescriptor + startAddr > endAddr) + if (outsideSection(coLocator.pTypeDescriptor + startAddr)) return std::nullopt; - if (coLocator.pClassHeirarchyDescriptor + startAddr > endAddr) + if (outsideSection(coLocator.pClassHeirarchyDescriptor + startAddr)) return std::nullopt; - } else + } + else { // Absolute addrs - if (coLocator.pTypeDescriptor < startAddr || coLocator.pTypeDescriptor > endAddr) + if (outsideSection(coLocator.pTypeDescriptor)) return std::nullopt; - if (coLocator.pClassHeirarchyDescriptor < startAddr || coLocator.pClassHeirarchyDescriptor > endAddr) + if (outsideSection(coLocator.pClassHeirarchyDescriptor)) return std::nullopt; } |
