抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

国赛遇到了经过控制流平坦化的一道题。今天来记录一下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查看混淆函数的起始地址

image-20240416081251488

比如我这里的函数起始地址为0x400CB0

1
python3 deflat.py -f test1 --addr 0x400CB0

image-20240416083906344

最后会恢复一个filename_recovered的文件,再次放入ida中查看image-20240416084111340

image-20240416084153405

去除控制流伪造

1
2
python3 debogus.py -f test1 --addr 0x400D30
python3 debogus.py -f test1 -s 0x400D30

这个脚本运行我自己的编译的程序失败了,估计与环境问题有关