一、llvm opt优化介绍:
在学习LLVM的过程中可以看出:
最重要的是优化这一块,包括平台无关的优化和平台相关的优化。
平台相关的优化是涉及到后端中具体指令的生成,在这一块只是简单的来说明平台无关的优化:如下图所示为关于O1、O2、O3的优化选项:
比如以下这个例子:
不优化的时候直接生成对应的字节码:
进行优化:
1.寄存器优化
./opt -mem2reg 1.bc >1.reg.bc
2.常量优化
./opt -constprop 1.reg.bc >1.cp.bc
二、延申拓展:
1.反混淆
链接:
https://github.com/JonathanSalwan/Tigress_protection
大致的逻辑是:
通过解析二进制文件,提取出来加载到模拟器内存中,然后根据Triton进行模拟执行提取相关的指令,模拟符号执行提取表达式,然后再转为LLVM-IR,进一步通过pass的优化,最后生成反混淆以后的二进制文件。
缺点:不支持arm
2.提供漏洞挖掘测试:
基于clang static analyzer的源码漏洞检测插件;
通过优化的pass 来实现 tuple 信息的记录,在此过程中会对每一基本块都插入探针进行测试,
参考链接:
https://github.com/GoSSIP-SJTU/TripleDoggy
三、总结:
通过本文可以大致了解在编译的时候通过Pass进行各个方面的优化,应用到安全代码混淆上就是反优化,才有了OLLVM这种代码混淆。在逆向的时候可以把这种Pass优化作为中间状态的一个状态的优化,就是反混淆了。同时在漏洞检测上由于LLVM 框架设计的良好性,通过对漏洞在中间状态所呈现的特征进行匹配检测,就可以进行漏洞检测。