OLLVM
OLLVM 的控制流平坦化是一种常见的代码混淆方式,其基本原理是添加分发器来控制流程的执行。针对这种混淆方式的还原也有了许多研究和工具,大致思路分为动态和静态两种:
动态:通过Unicorn模拟执行的方式获取各真实块的关系
静态:通过符号执行、中间语言分析等方式获取真实块之间的关系。
简单来说,OLLVM会添加一个用于控制跳转的状态变量和分发器:当一个真实块执行完成后,会把状态变量的值进行更新,回到分发器进行检查,再根据状态变量的值跳转到下一个真实块执行;
如果原本的执行流程中存在条件跳转,则会在各条件下对状态变量设置不同的值,再回到分发器进行检查和跳转。
环境搭建
需要用到开源项目
https://github.com/cq674350529/deflat
项目文件比较多,取出这三个文件放到一个文件夹下比较清晰
千万要带着util.py,我就是没拉出来这个文件,装环境装了半天。。。
还要安装angr,我在win下直接pip install angr就可以,linux下可能会报错,参考这个
https://blog.csdn.net/weixin_45055269/article/details/105176185
实例分析
样本md5:
2d7a7088ff0c36f2dd6a75ac19065d9e
平坦化处理之后的程序逻辑是这样的:
有很多这种程序跳转,基本上是不可分析的状态。
使用脚本,命令:
python deflat.py -f test --addr 0x400620
这里的0x400620是main函数就是被处理函数的开始
处理结束
处理之后的程序效果:
虽然无法完美还原,但是已经清楚的可以看清程序逻辑了。
参考文献:
https://www.cnblogs.com/zhwer/p/14081454.html
https://blog.csdn.net/weixin_45055269/article/details/105176185