国赛遇到了经过控制流平坦化的一道题。今天来记录一下LLVM环境的使用
混淆
关于混淆的环境搭建不再赘述,网上已有不少详细的说明,本篇只来介绍如何使用搭建后的环境。
控制流平坦化
1 | clang -mllvm -fla test.cpp -o test1 |
可用选项
- -mllvm -fla : 激活控制流平坦化
- -mllvm -split : 激活基本块分割
- -mllvm -split_num=3 : 指定基本块分割的数目
例如
1 | clang -mllvm -fla -mllvm -split -mllvm -split_num=3 test.cpp -o test_fla |
指令替换
1 | clang -mllvm -sub test.cpp -o test2 |
- -mllvm -sub : 激活指令替代
- -mllvm -sub_loop=3 : 混淆次数,这里一个函数会被混淆3次,默认为 1次
例如
1 | clang -mllvm -sub -mllvm -sub_loop=3 test.cpp -o test_sub |
控制流伪造
1 | clang -mllvm -bcf test.cpp -o test3 |
- -mllvm -bcf : 激活虚假控制流
- -mllvm -bcf_loop=3 : 混淆次数,这里一个函数会被混淆3次,默认为 1
- -mllvm -bcf_prob=40 : 每个基本块被混淆的概率,这里每个基本块被混淆的概率为40%,默认为 30 %
例如
1 | clang -mllvm -bcf -mllvm -bcf_loop=3 -mllvm -bcf_prob=40 test.cpp -o test_bcf |
保护全开
1 | clang -mllvm -bcf -mllvm -fla -mllvm -sub test.cpp -o test_bcf |
去除
去除控制流平坦化
首先进入虚拟python环境中
1 | workon angr_work |
接着在ida查看混淆函数的起始地址
比如我这里的函数起始地址为0x400CB0
1 | python3 deflat.py -f test1 --addr 0x400CB0 |
最后会恢复一个filename_recovered
的文件,再次放入ida中查看
去除控制流伪造
1 | python3 debogus.py -f test1 --addr 0x400D30 |
这个脚本运行我自己的编译的程序失败了,估计与环境问题有关