Angr符号执行练习–对付OLLVM Bogus Control Flow/虚假控制流

💡 原文中文,约9300字,阅读约需23分钟。
📝

内容提要

本文介绍了如何使用angr工具去除LLVM OLLVM生成的虚假控制流,通过静态分析识别不可达基本块并将其NOP化或JMP化,以简化反汇编结果,帮助理解原始代码逻辑。作者展示了具体的Python实现,强调了angr在反混淆中的应用。

🎯

关键要点

  • OLLVM支持虚假控制流,生成的二进制包含不可达基本块,影响静态分析。
  • 使用angr工具识别不可达块并进行NOP化或JMP化,以简化反汇编结果。
  • 作者展示了具体的Python实现,演示了如何静态Patch目标程序。
  • 通过angr符号执行,识别干扰性质的条件跳转指令并进行处理。
  • NOP化和JMP化的流程图展示了如何处理不可达块。
  • hello_bcf是使用OLLVM编译的示例程序,包含不可达基本块。
  • hello_bcf_patch.py是对hello_bcf的完整代码,演示了如何去除虚假控制流。
  • 核心技术在于获取永远只走同一条分支的条件跳转指令。
  • 重载successors()方法以记录条件跳转指令的来源和去向。
  • 建议动态调试以加强对angr流程的理解。

延伸问答

什么是OLLVM中的虚假控制流?

OLLVM中的虚假控制流是指在编译时生成的不可达基本块,这些基本块在静态分析时会干扰对原始代码逻辑的理解。

如何使用angr工具去除虚假控制流?

使用angr工具可以识别不可达块并将其NOP化或JMP化,从而简化反汇编结果,帮助理解原始代码逻辑。

在去除虚假控制流的过程中,NOP化和JMP化有什么区别?

NOP化是将不可达块替换为无操作指令,而JMP化是将条件跳转指令替换为无条件跳转指令,直接跳向可达块。

hello_bcf_patch.py的主要功能是什么?

hello_bcf_patch.py是一个示例代码,演示如何使用angr去除hello_bcf程序中的虚假控制流。

在使用angr进行静态分析时,如何处理条件跳转指令?

可以通过重载successors()方法来记录条件跳转指令的来源和去向,从而识别干扰性质的条件跳转指令。

动态调试在angr流程中的作用是什么?

动态调试可以帮助用户更好地理解angr的工作流程和如何处理虚假控制流。

➡️

继续阅读