Theseus

平坦化与去除平坦化
本文章部分内容首发于先知社区环境说明:**Ubuntu18.04.一、 python3环境**在Ubuntu...
扫描右侧二维码阅读全文
26
2020/02

平坦化与去除平坦化

本文章部分内容首发于先知社区
环境说明:
**Ubuntu18.04.
一、 python3环境**
在Ubuntu下搭建python环境很简单,系统一般都带有python3环境,我们仅仅需要安装一下pip
相关命令:
sudo apt-get install python3
sudo apt-get install python3-pip
在后面的环境搭建中我们经常会使用到pip3(python的pip就是pip3),但是当我们运行这个命令的时候可能我们会报错。
File "/usr/bin/pip3", line 9, in from pip import main
上面这个报错我们需要修改一下pip3的配置文件。
sudo vi /usr/bin/pip3(修改这个文件必须root下才有权限修改)
修改前:
图片1.png
修改后:
图片2.png
二、 angr(基于python3搭建)

首先安装依赖

sudo apt-get install python-dev libffi-dev build-essential virtualenvwrapper
安装angr

mkvirtualenv angr && pip install angr
到此angr安装结束
但是在我们安装途中会遇到一些问题,在这里我手机了一下安装过程中的问题,并提出解决的方案
一、 mkvirtualenv:未找到命令
解决方法:
1、 升级一些我们的pip
pip install --upgrade pip
2、 Python虚拟环境的安装
sudo apt-get install python-virtualenv
sudo easy_install virtualenvwrapper
3、 创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs
4、 在 ~/.bashrc 中添加行:
export WORKON_HOME=HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
5、 运行
source ~/.bashrc
6、 创建python虚拟环境
mkvirtualenv [虚拟环境名称]
workon [虚拟环境名称]

二、 运行途中我们发现出现
图片3.png
解决方法:
ubuntu18.04里,通过pip安装virtualenvwrapper得到的virtualenvwrapper.sh被安装在~/.local/bin/目录下,需要修改上面添加在~/.bashrc的内容中的路径即可:
当然这里我们也有一个简单的方法查看文件的位置:
sudo find / -name virtualenvwrapper.sh
图片4.png
修改前:
图片5.png
修改后:
图片6.png
export WORKON_HOME=$HOME/.virtualenvs
source ~/.local/bin/virtualenvwrapper.sh
然后我们继续运行(source ~/.bashrc)
图片8.png
注意:做完上面的步骤需要关闭控制台,然后再进行这步操作

继续我们的安装
但是我们在安装的时候,我们我们要先进入root模式
执行安装的第二步
图片9.png
等待安装
图片10.png
如果可以的话,可以安装一个ipython用来使用angr,也可以测试angr安装成功否。
没有安装成功:
图片11.png
成功后:
图片12.png
三、 BARF与Z3的搭建
BARF的搭建;
Github地址:https://github.com/programa-stic/barf-project
将其下载下来,放在Ubuntu里,位置可以是任意的。
图片13.png
然后打开控制台进入目录执行以下命令(具体的文档在github上都有说明,在安装前一定要仔细阅读文档)
sudo python install setup.py
图片41.png
这个的安装就算是安装好了。
Z3求解器安装:
我们在这里面寻找安装包:https://pypi.org
在里面我们会看到这个
图片14.png
但是上面这个安装包并不支持。我们要在pip3中安装另外一个包。
图片15.png
这个包是z3的抽象层,必须要有这个包,我们的z3才能够运行。但是这个包并不支持最新的z3求解器。而支持的是
图片16.png
明白这个我们就可以少走很多弯路。
因此我们先安装claripy(sudo pip3 install claripy)
在安装这个的同时,它自动的安装对应的z3版本
图片17.png
注意:
如果我们直接输入sudo pip3 install z3-solver安装的是最新的版本。在那时会有的提示你安装的版本不匹配。
这样我们的z3就算安装完成了。
如果我们不确定可以做一个简单的测试。

图片18.png
四、 开始去平坦化
去平坦化的开源工具在github下载:https://github.com/cq674350529/deflat(首先还是感谢师傅的无私奉献)
在项目文件中有一份使用说明,可以去看看。
接下来我们就分析一下文档中的例子,从而看看我们的去平坦化的效果
未经过平坦化处理的文件用IDA打开是这样的:
图片19.png
结构很清晰,反编译的伪代码也很清晰。
但是经过平坦化处理后的文件是这样的结构:
图片20.png
相关的介绍可以看这篇文章:https://security.tencent.com/index.php/blog/msg/112
现在我们用工具来去除平坦化
图片21.png
图片22.png
Graph overview图形改变,同时我们制定的函数0X400530也发生改变。
图片23.png
变得和我们的源码很像。
图片24.png
其中具体的实验大家可以在下载的文件中进行练习。
链接:https://pan.baidu.com/s/1YPw59GwAi9TQVXlbvKD1Nw
提取码:ll7p
复制这段内容后打开百度网盘手机App,操作更方便哦

什么是LLVM?
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
LLVM计划启动于2000年,最初由美国UIUC大学的Chris Lattner博士主持开展。2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者。
目前LLVM已经被苹果IOS开发工具、Xilinx Vivado、Facebook、Google等各大公司采用。(源自百度百科的解释)
而我们的主题并不是llvm这个架构编译器,而是基于这个架构编译器的obfuscator-llvm。
为了不重复造轮子,我就不会解释OLLVM。
在下面我推荐两篇文章:大家在看之前,请先浏览这两篇文章。
https://security.tencent.com/index.php/blog/msg/112
https://xz.aliyun.com/t/4960
配置OLLVM
Github地址:https://github.com/obfuscator-llvm/obfuscator/wiki/Installation
上面地址安装的是oLLVm-4.0
Github:https://github.com/AllocAndInit/ollvm5.0.1
上面这个是最新的。
我先安装4.0的看看感觉
图片25.png
但是我们在执行第四步的时候可能会出现这样的错误
图片26.png
这个时候我们需要更换一下我们的第四步命令
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/
但是我们在完成最后编译环节的时候,有些电脑可能会出现这样的错误提示,
c++:internal compiler error:killked(program cclplus) 
编译就终止了。
解决方案就是扩大swap分区的容量,这个问题是swap分区太小而导致的。
笔者的环境是Ubuntu18.04,怎样增加swap分区呢?
查看我们的盘符情况:free -h
图片27.png
我的分区只有2G
创建一个swap文件
sudo mkdir /swap
cd /swap
进行扩充(下面的命令是扩6G,可以根据实际情况更改)
sudo dd if=/dev/zero of=swapfile bs=1G count=6
图片28.png
因为dd是不会查看进度的
同时这个命令可以查看进度

sudo watch -n 5 killall -USR1 dd

然后将生成的文件转换成swap文件

sudo mkswap -f swapfile
图片29.png
这里我报错了,需要我们手动将文件夹的权限转换成600

sudo chmod 0600 /swap/swapfile
然后直接激活

sudo swapon /swap/swapfile
图片30.png
(以下步骤可以不用执行,不影响安装环境)
但是这样重启后会直接失效
你如果需要的话可以进行重新激活

sudo swapon /swap/swapfile
如果需要一直保持这个swap,则需要将其写在/etc/fstab文件中

sudo nano /etc/fstab

解决好上面这个报错,就可以继续执行编译环节。安装环境就没有什么问题了。我们就开始来试一试这个混淆方式吧。

OLLVM的初体验
为了让大家熟悉附加平坦化,我写了一个简单的C代码,然后用两种编译实现一下,看看返回编后的效果。在附件中我会上传我的源代码。
在正常编译下后反汇编的效果:
图片31.png

核心代码:
图片32.png
对源代码未进行保护。
接下来我们看看经过OLLVM编译的反汇编效果:
图片33.png
而关键代码:
图片34.png
图片35.png
关键代码就受到保护。
简单的演示就到这里。各位师傅们有兴趣可以多探究一下。
如何去平坦化
在我的上一篇文章中,有详细的讲解如何配置去平坦化,如果读者没有配置,请先参考上篇文章配置环境后进行阅读下面的内容。
在这里我将采用2019全国信息安全专项赛上的一个题目flat,进行测试(附件会有相关资料)。
打开IDA直接分析
图片36.png
开局就发现有点熟悉,很可能就是采用了OLLVM混淆
图片37.png
在我们用strings命令查看,便看到一段很有意思的字符。在这里我们已经知道个大概了,不慌,进入程序再看看。
图片38.png
图片39.png
现在基本上很确定是OLLVM混淆。那我们就直接还原check函数。
图片40.png
这是我还原的check1函数。还原的很彻底。
接下来我们就不用怎么分析。直接还原所有的check函数。Flag就非常容易分析出来。虽然这题可以手动分析出来,不去平坦化,肯定会花去不少时间。

最后修改:2020 年 02 月 26 日 08 : 12 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论