#190·N64Recomp

在输入 ELF 中的 reloc_names 中读取超出 o32 基础的重定位类型时出现越界读取 (在 Windows 上发生崩溃)

作者: bryankruman创建于 2026年7月4日更新于 2026年7月4日

问题

src/main.cpp 中的 reloc_names 有 8 个条目,仅包含基本的 o32 重定位类型(R_MIPS_NONER_MIPS_GPREL16)。但是,Reloc::type 直接从原始 ELF r_type 字段中填充,没有范围检查(elf.cpp: static_cast<RelocType>(rel_type))。包含可重定位/PIC 代码的 ELF 可以包含更高数字的重定位类型 - R_MIPS_GOT16 (9)、R_MIPS_CALL16 (11)、R_MIPS_GPREL32 (12) 等等,因此 reloc_names[reloc.type] 读取超出了向量的末尾。

内容来源: N64Recomp/N64Recomp