论文部分内容阅读
C++语言编程方式灵活、执行效率高,但是与Java等其他高级语言相比,需要开发人员手动管理内存的申请与释放,因此存在大量未定义行为,容易产生安全缺陷。内存管理缺陷和缓冲区溢出缺陷是C++应用程序中常见的安全缺陷,具有很高的隐蔽性和危害性,针对这两种缺陷的检测进行研究具有重要的现实意义。动态二进制插桩检测技术不需要程序的源代码,可以在程序动态运行过程中插入探针,实时跟踪记录程序的运行状态,为程序缺陷检测提供程序运行信息,因此在程序检测领域具有广泛的应用。二进制代码抽象层次低且具有平台相关性,因此加大了动态二进制插桩程序的编写难度。本文首先介绍了 C++应用程序中常见的缺陷类型和检测方法,并着重研究了动态插桩技术以及主流的二进制插桩平台,选取Pin作为本课题使用的插桩平台。接着对C++应用程序的缺陷检测技术进行研究,并针对C++应用程序的内存布局设计了基于组合映射的高效影子内存,内存占用仅为传统影子内存的35%左右。然后课题针对具体缺陷类型,提出了基于内存块可达性分析的内存泄漏检测方案、基于地址可访问判定的堆缓冲区溢出检测方案以及基于局部变量边界映射的栈缓冲区溢出检测方案。在上述研究的理论基础上,设计实现了一款缺陷检测工具,使用二进制插桩平台Pin对检测程序进行插桩分析,基于指令插桩和库函数替换技术实现对程序运行状态的跟踪,将程序内存操作信息记录在影子内存中,根据影子内存记录的内存信息和设计的检测机制实现对程序的缺陷检测。最后通过实验对检测方法的运行开销和准确性进行测试,证明了方法的有效性。