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的工作流程和如何处理虚假控制流。
➡️