obfuscation && deobfuscation(1)
之前只会用deflat.py,最近正好学了angr,而且看了下代码也只有三百行不到,所以打算对应着康康原理和代码
第一部分简单讲一下工具使用和obfuscation原理
obfuscator#
是论文《Obfuscator-LLVM — Software Protection for the Masses》的研究成果
安装#
1 | git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git |
指令替换#
指令替换是将简单的运算替换为较为复杂的运算
使用时通过加入参数-mllvm -sub
使用,并可以通过-mllvm -sub_loop=num
指定替换的次数为num
次,例如-mllvm -sub_loop=3
虚假控制流#
虚假控制流是在原来的控制流图上,通过加入条件跳转语句跳转到一个原来的基本块或者是一个虚假的基本块,并最终跳转回条件跳转语句,引入循环结构,改变控制流图。
使用时通过加入参数-mllvm -bcf
使用,也可以同上一样设置混淆次数-mllvm -bcf_loop=num
文中使用的是论文团队之前的工作Bogus Control Flow Insertion
,
举例:
1 | void f(int x){ |
对于上面的函数f,展开前和展开后的结果分别如图2,图3所示
控制流平坦化#
我们知道一个函数内存在自己的控制流和基本块,控制流平坦化,就是使用一个主分发块,通过条件控制分别进入不同的基本块,然后再回到主分发块,虽然逻辑和原来的程序相同,但分析起来更加复杂,类似于虚拟机,这里用腾讯博客中的图看起来条理比较清晰
这里也给出论文里对函数f的控制流平坦化示例:
示例 check_password#
1 |
|
正常编译#
1 | gcc check_passwd.c -o check_passwd |
控制流平坦化编译#
1 | /build/bin/clang check_passwd.c -o check_passwd_flat -mllvm-fla |
emmmm,太大了,还是用腾讯的图好了
参考资料#
https://github.com/obfuscator-llvm/obfuscator/wiki/Installation
https://github.com/cq674350529/deflat/blob/master/flat_control_flow/deflat.py
论文:Obfuscator-LLVM — Software Protection for the Masses