反混淆学习-fla控制流平坦化篇感觉反混淆比混淆难多了。。。
现在也暂时不会怎么自己写ida-python脚本来反混淆
还是先学学看吧
deflat工具介绍网上常用的反控制流平坦化的工具,可以直接在终端运行将经过fla编译的可执行文件转化为反混淆过的可执行文件,也支持arm架构。
下载地址:deflat: use angr to deobfuscation
1$ python deflat.py --file 文件名 --addr 初始地址
需要一个python的angr库
因为要用到初始地址,所以就要求你的可执行文件没开PIE(随机地址)保护
(要求还挺苛刻的,估计只有比赛值得一用...
OLLVM-常量替代感觉跟指令替代类似,仅支持32位整数替代
(建议结合代码食用)
替换方案
代码ConstantSubstitution.cpp
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101...
OLLVM-随机控制流感觉跟虚假控制流差不多,就是badyBB和cloneBB的定向跳转转到了随机跳转
(建议结合代码食用)
第一步:基本块分割与虚假控制流相同
第二步:基本块克隆
第三步:构造随机跳转,插入生成随机数指令,插入随即跳转,对随机数进行恒等变换
第四步:构造虚假随机数跳转
代码RandomControlFlow.cpp
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686...
OLLVM-指令替代(建议结合代码后的注释食用!)
例如a+b=a-(-b),a^b= ( ~ a&b) | (a& ~ b) 且仅支持整数
加法替代
减法替代
与替换
或替换
异或替换
代码Substitution.cpp
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878...
OLLVM-虚假控制流建议结合代码后的注释食用!
原理
步骤第一步:基本块拆分
第二步:基本块克隆
第三步:构造虚假跳转
代码BogusControlFlow.cpp
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091#include "llvm/IR/Function.h"...
OLLVM-控制流平坦化建议结合代码后的注释食用!
第一步:保存基本块
第二步:创建分发块和返回块
第三步:实现分发块调度
第四步:实现调度变量的自动调整
第五步:修复PHI指令和逃逸变量
代码:FLattening.cpp
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596...
llvm IR常用指令二内存访问和寻址操作alloca指令< result>=alloca < type> [,< ty> < NumElements>] [, align < alignment>];
分配sizeof(type)*NumElements字节的内存,分配的地址与alignment对齐
1234%ptr = alloca i32 ;分配4字节的内存并返回i32类型的指针%ptr = alloca i32,i32 4 ;分配4*4字节的内存并返回i3...
llvm IR常用指令一终结指令ret指令ret < type> < value>;返回特定类型返回值的return指令
ret void;无返回值的return指令
1234Test:ret i32 5;返回整数5ret void;返回无符号ret { i32 , i8 } { i32 4 , i8 2 };返回结构体
br指令br i1 < cond>,label < iftrue>,label < iffalse>;有条件跳转
br label < dest>;无条件...
java学习(2)外置类123456789101112131415161718192021222324252627282930313233343536public class StudentTest { public static void main(String[] args) { Student s=new Student("straw",20); System.out.println(s.getAge()); System.out.println(s.getName()); }}cla...
java学习(1)随机数1234567891011121314151617181920import java.util.Random;public class Root1{ public static void main(String[] args) { int[] arr={1,2,3,4,5}; Random r=new Random(); for(int i=0; i< arr.length ;i++) { int index=r.nextIn...