二进制安全
OLLVM环境搭建和基本用法
00 分钟
2022-12-14
2024-11-11
type
status
date
slug
summary
tags
category
icon
password
以前走过很多坑,花掉了很多时间,希望读到此篇文章的读者能尽早走出这个无底洞,学习一路顺风
notion image

OLLVM 简单概述

OLLVM 介绍 Obfuscator-LLVM(简称 OLLVM)是 2010 年 6 月由瑞士西部应用科学大学 (HEIG-VD) 的信息安全小组发起的一个项目。这个项目的目的是提供一个 LLVM 编译套件的开源分支,能够通过代码混淆和防篡改提供更高的软件安全性。
OLLVM 提供了三种经典的代码混淆:
  • 控制流平坦化 Control Flow Flattening
  • 虚假控制流 Bogus Control Flow
  • 指令替代 Instruction Subsititution

环境准备

  • ubuntu
  • docker
  • ollvm

安装 Docker

或者下面这个命令

Pull Docker 容器

容器官方地址:
然后写这个容器的大佬也写了一个编译脚本
这个shell脚本有一个地方需要加一个东西,下面会写到,为了我以后方便搭建我fork了一份仓库,加了一句,附上地址
docker-ollvm
thestar0Updated Aug 25, 2023

下载 OLLVM 源码

官方项目地址:
obfuscator
obfuscator-llvmUpdated Sep 19, 2024
下载工作完成,检查一下是不是有这两个文件夹,左边为编译脚本,右边为 OLLVM 源码
notion image

打补丁

去左边那个编译脚本文件夹,vim 打开里面的 ollvm-build.sh 文件在 150 行加上下面这一句
notion image
 
最后再编译 OLLVM 编译命令
我这里是
notion image
 
编译时间看电脑性能,这里有个小 tips,编译的时候把虚拟机内存开大一点,多加几个 cpu 我一般编译几个小时,耐心等待 编译完成后在 obfuscator/build_release 文件夹内找到编译好的二进制文件。

创建软链接

在 obfuscator/build_release 目录执行指令创建软链接:

验证

输入 clang –version 指令确定安装是否完成
notion image

OLLVM 基本用法

控制流平坦化 (Control Flow Flattening)

可用选项:
  • -mllvm -fla : 激活控制流平坦化
  • -mllvm -split : 激活基本块分割
  • -mllvm -split_num=3 : 指定基本块分割的数目,这里一个基本款会被分割成 3 个基本块后再进行控制流平坦化混淆
示例:
注意事项:
注意在编译时可能出现 stddef. h 和 stdarg. h 头文件不存在的错误,可以使用 locate stddef. hlocate stdarg. h 指令找到这两个头文件的位置,然后复制到 /usr/include/ 或 /usr/local/include 目录下。(我复制到/usr/include/ 就没报错了)

虚假控制流 (Bogus Control Flow)

可用选项:
  • -mllvm -bcf : 激活虚假控制流
  • -mllvm -bcf_loop=3 : 混淆次数,这里一个函数会被混淆 3 次,默认为 1
  • -mllvm -bcf_prob=40 : 每个基本块被混淆的概率,这里每个基本块被混淆的概率为 40%,默认为 30%
示例:

指令替换 (Instruction Substitution)

可用选项:
  • -mllvm -sub : 激活指令替代
  • -mllvm -sub_loop=3 : 混淆次数,这里一个函数会被混淆 3 次,默认为 1
示例:

效果演示

未混淆前程序流程图:

notion image
 

经过控制流平坦化混淆后程序流程图:

notion image
 

经过虚假控制流混淆后程序流程图:

notion image
notion image

经过指令替换混淆后程序流程图:

notion image
 

本文参考于

跟着铁头干混淆3 ubuntu下用docker编译ollvm(保证成功)
OLLVM(Obfuscator-LLVM) 是一套开源的,基于llvm的混淆工具。 国内的很多加固厂商,很多都使用了ollvm对代码进行混淆。 想要学习 ollvm去混淆,最好搭建一个环境自己写一些demo, 就像做渗透的自己搞个靶场去练习,也能学的更快。 大家好,我是王铁头 一个乙方安全公司搬砖的菜鸡持续更新移动安全,iot安全,编译原理相关原创视频文章演示视频:[ https://space.bilibili.com/430241559] 在编译 ollvm的时候,有时候会因为一些,系统版本,编译器版本,cmake版本,或者另外的一些玄学的原因编译失败。 编译成功的人都是类似的,一次性成功。 编译失败,各自有自己的报错信息。 如果大佬们已经对自己编译ollvm失去了信心,累觉不爱。 这时候还是可以挣扎下的。 可能生活辜负了你,但是既然你看到了这篇文章,我,口碑好,靠得住,说你成功你就能成功 用这种方式去编译,基本上是可以保证编译通过的。 不管你机器上的,gcc ,g++, cmake是啥版本,都不重要。 因为,这一次的编译,根本就,不依赖任何你自己电脑上的编译环境。 是用docker镜像编译。 惊不惊喜,意不意外? ollvm git地址: https://github.com/obfuscator-llvm/obfuscator 下载 ollvm 4.0代码 这里 -b llvm-4.0是选择 llvm-4.0的分支 --depth=1 表示只下载最后一次提交的版本 这样的话,项目文件就不会太大。毕竟github连接速度感人。 这里安装docker编译环境 首先要下载docker(已经安装过就不用了) sudo docker pull nickdiego/ollvm-build 安装docker 安装编译ollvm的docker环境 编译这里 本来是这样用的 为了节省大佬们的时间, docker编译环境的作者简化了上面的命令 还专门写了个脚本 惊不惊喜,意不意外
跟着铁头干混淆3 ubuntu下用docker编译ollvm(保证成功)
上一篇
LLVM环境搭建与基本用法
下一篇
搭建DVWA靶场