吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3723|回复: 14
上一主题 下一主题
收起左侧

[分享] OLLVM混淆环境搭建与去平坦化

  [复制链接]
跳转到指定楼层
楼主
Bag5 发表于 2024-1-15 18:05 回帖奖励

之前遇到了很多次ollvm平坦化的题目,所以想学习一下,参照了很多前人的方法,特此记录一下。

环境

vmware虚拟机,ubuntu20.04

ollvm定义

​        LLVM(Low Level Virtual Machine)是一个开源的编译器基础架构,它包含了一组模块化、可重用的编译器和工具,支持多种编程语言和目标架构,包括x86、ARM和MIPS等。LLVM的核心思想是将编译器分为前端和后端两个部分,前端负责将源代码转换为中间表示(IR),后端负责将中间表示转换为目标机器的汇编代码。这种设计使得LLVM可以支持多种编程语言,因为只需要为每种语言编写一个前端,就可以利用后端的通用性支持多种目标架构。

​        OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,这个项目的目标是提供一个LLVM编译套件的开源分支,能够通过代码混淆和防篡改,所使用的编译器是clang。

搭建ollvm环境

ollvm github仓库

https://github.com/obfuscator-llvm/obfuscator

git下载ollvm源码

git clone -b llvm-4.0 --depth=1 https://github.com/obfuscator-llvm/obfuscator.git 

配置编译工具

cmake , gcc , g++
cmake

去官网下载cmake或者直接sudo安装

sudo apt install cmake
安装 gcc-8 g++-8 降低版本

查看gcc和g++版本,若为9则要降低版本

安装gcc-8和g++-8
sudo apt-get install gcc-8 g++-8 -y

配置软件的优先级,可以根据需要去选择默认的版本

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 9
gcc切换版本 默认gcc 8
sudo update-alternatives --config gcc

输入选择版本的数字

g++切换版本 默认g++ 8
sudo update-alternatives --config g++

修改ollvm源码

进入 ollvm目录/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h

定位到第690行 把char 改成 uint_8t

config.guess文件中存在一些DOS行结尾(DOS line endings),需要将其转换为Unix行结尾。

sudo apt-get install dos2unix
dos2unix obfuscator/cmake/config.guess

编译 ollvm

mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/

make -j4

这个过程会很久

[ 97%] Built target llvm-objdump
[ 97%] Linking CXX executable ../../bin/llvm-mc
[ 97%] Built target llvm-mc
[ 97%] Linking CXX executable ../../bin/llvm-dwp
[ 97%] Linking CXX executable ../../bin/llvm-lto2
[ 97%] Built target llvm-dwp
[ 97%] Built target llvm-lto2
make: *** [Makefile:152: all] Error 2

可能是环境配置出了问题,编译到97%时就停止了,几个主要的clang文件都没编译成功

试了好几次都卡在这个


查阅资料,猜测是swap区空间不够,增加swap区空间为4g,扩大虚拟机容量为60g

如果卡住了,不要慌,不要删,继续make -j

混淆

两种方法,一种是配置ndk环境混淆,另一种是直接将clang作为程序进行混淆。推荐第二种,第一种无法控制混淆的方法。

注意,混淆时一定要采用gcc8和g++8,9以上的环境会混淆失败。

配置ndk环境

执行命令,打开配置文件

gedit ~/.bashrc

把下面这两行粘贴到文件末尾, 注意,替换路径成自己下载的ndk路径

export NDK_HOME=/home/bag/android/android-ndk-r16b/
export PATH=$NDK_HOME:$PATH

最后执行命令,使配置文件生效

source ~/.bashrc
复制编译好的4个 clang 文件到ndk目录

clang,clang++,clang-4.0,clang-format

粘贴到ndk目录

ndk目录/toolchains/llvm/prebuilt/linux-x86_64/bin
复制build目录的 3个头文件到ndk目录
fatal error 'Stddef.h' file not found
fatal error 'Stdarg.h' file not found
fatal error '__stddef_max_align_t.h' file not found

ndk目录

android-ndk-r16b/sources/cxx-stl/system/include

新建jni文件夹(名字改了的话在对应的配置文件得该指定路径方式)

在文件夹中新建Android.mkApplication.mktry.cpp

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := bag
LOCAL_SRC_FILES := try.cpp

include $(BUILD_EXECUTABLE)

Application.mk

APP_ABI := armeabi-v7a arm64-v8a
APP_PIE := true
APP_CPPFLAGS := -frtti -std=c++11 -mllvm -fla -mllvm -bcf -mllvm -sub

try.cpp

#include<cstdio>
int main()
{
  int d;
  scanf("%d",&d);
  if(d==1)printf("d = 1");
  else if(d==2)printf("d = 2");
  else printf("not 1 or 2");
  return 0;
}

在jni的上级路径,输入ndk-build


成功了!

混淆后的文件在libs内


在ida中查看混淆效果

clang混淆

这里对源文件进行平坦化混淆处理。

来到build/bin目录下,将待混淆的源文件放在该目录下。

命令格式为

./clang -mllvm -fla 源文件 -o 目标文件
./clang -mllvm -fla try.cpp -o try

成功生成混淆后的文件,用ida查看效果

去平坦化

虚拟环境

安装虚拟环境

pip install virtualenv

配置环境变量

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/bin/virtualenvwrapper.sh

打开虚拟环境

source ~/.local/bin/virtualenvwrapper.sh

创建新的虚拟环境

mkvirtualenv demo

展示当前虚拟环境

workon

进入虚拟环境

workon demo

使用脚本

由于脚本需要angr,在当前虚拟环境中安装

pip install angr

脚本github地址:deflat: use angr to deobfuscation

将脚本中的am_graph.pyutil.py文件复制到下级

在ida中找到平坦化的入口地址,一般而言入口前都会存在大量var_(局部变量),下图入口地址为0x401140


去平坦化命令格式为

python3 deflat.py -f filename --addr address(入口地址,一般为main入口)
python3 deflat.py -f try --addr 0x401140


去平坦化成功后,会在当前目录下生成源文件_recovered


在ida中查看去平坦化后效果

总结

  1. 定位入口地址

  2. ./deflat-master/flat_control_flow/路径下启动虚拟环境

    source ~/.local/bin/virtualenvwrapper.sh
    workon
    workon demo
  3. 使用去平坦化命令

    python3 deflat.py -f filename --addr address(入口地址,一般为main入口)

参考文章

  1. OLLVM环境搭建-Ubuntu20.04_ubuntu配置llvm-CSDN博客
  2. 跟着铁头干混淆2 ubuntu20.04编译ollvm - 简书 (jianshu.com)
  3. OLLVM 与去平坦化 &RoarCTF2019 polyre 详细WP

免费评分

参与人数 9吾爱币 +15 热心值 +9 收起 理由
笙若 + 1 + 1 谢谢@Thanks!
warobot + 1 + 1 鼓励转贴优秀软件安全工具和文档!
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
ck6102 + 1 + 1 热心回复!
max2012 + 1 + 1 用心讨论,共获提升!
SysEntry + 1 + 1 用心讨论,共获提升!
allspark + 1 + 1 用心讨论,共获提升!
QAQ~QL + 1 + 1 我很赞同!
Crush + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
meet52 发表于 2024-8-30 16:12
按教程一直编译不过去,搜了下博客教程,第690行,应该是uint8_t ,不是uint_8t
Expected<std::vector<uint8_t>> readMem(char *Dst, JITTargetAddress Src,
uint64_t Size) {
一下就编译过去了
沙发
Light紫星 发表于 2024-1-16 11:36
3#
快乐的小跳蛙 发表于 2024-1-16 11:38
4#
lanyer 发表于 2024-1-16 11:46
一个比较典型的例子就是mame的编译吧
5#
nitian0963 发表于 2024-1-16 11:48

收藏吃灰
6#
Y0uD1 发表于 2024-1-16 12:00
LLVM有没有通俗易懂的解释?
7#
AtoposU 发表于 2024-1-16 12:13
收藏吃灰
8#
kang.mk 发表于 2024-1-16 16:01

收藏吃灰
9#
max2012 发表于 2024-1-17 22:03
收藏吃灰
10#
侃遍天下无二人 发表于 2024-1-17 22:46
哦豁,你的帖子很好,现在是我的了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-13 12:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表