初音ミクの消失

deflat

字数统计: 724阅读时长: 3 min
2019/09/08 Share

deflat

introduction

前面谈到了利用ollvm可以对控制流进行混淆、平坦化,有正向必有逆向,有人利用angr模块写出了一个将混乱的控制流进行恢复,转化为可读的正常程序的脚本

setup

angr

angr是一个python模块,需要通过pip安装,然而安装时有可能会破坏原有其他模块的环境,所以angr官方文档提出应当使用虚拟python环境来安装angr。

亲测直接pip install anagr是不起作用的

官方文档可参考:https://docs.angr.io/introductory-errata/install

安装步骤

安装virtualenvwrapper

sudo apt-get install python3-dev libffi-dev build-essential virtualenvwrapper

构建虚拟环境

mkvirtualenv --python=$(which python3) angr && pip install angr

如果系统提示mkvirtualenv : command not found, 参考如下这篇文章进行修复

https://blog.csdn.net/qq_44090577/article/details/90756207

安装好之后,就可以开始正常运行脚本了

deflat.py

clone deflat的相关脚本

git clone https://github.com/mrh929/deflat

usage

deflat

python3 deflat.py [file_name] [start_addr]

0x400660 是函数main()`的地址。

(angr) [email protected]:~/Desktop/deflat/test# python3 deflat.py esay_obfuscation 0x400660
*******************relevant blocks************************
prologue: 0x400660
main_dispatcher: 0x40072a
pre_dispatcher: 0x400926
retn: 0x40091a
relevant_blocks: ['0x4008a3', '0x4008b8', '0x400855', '0x40083d', '0x400868', '0x400909', '0x400820', '0x4008f8', '0x400881', '0x400816']
*******************symbolic execution*********************
-------------------dse 0x4008a3---------------------
-------------------dse 0x4008b8---------------------
CRITICAL | 2019-09-08 08:46:50,813 | angr.sim_state | The name state.se is deprecated; please use state.solver.
-------------------dse 0x400855---------------------
-------------------dse 0x40083d---------------------
-------------------dse 0x400868---------------------
-------------------dse 0x400909---------------------
-------------------dse 0x400820---------------------
-------------------dse 0x4008f8---------------------
-------------------dse 0x400881---------------------
-------------------dse 0x400816---------------------
-------------------dse 0x400660---------------------
************************flow******************************
0x4008a3: ['0x400868']
0x4008b8: ['0x4008f8', '0x400909']
0x400855: ['0x400868']
0x40083d: ['0x40091a']
0x400868: ['0x400881', '0x4008b8']
0x400909: ['0x40091a']
0x400820: ['0x40083d', '0x400855']
0x4008f8: ['0x40091a']
0x400881: ['0x4008a3']
0x400816: ['0x4008a3']
0x400660: ['0x400820']
0x40091a: []
************************patch*****************************
Successful! The recovered file: esay_obfuscation_recovered

原二进制文件(no flat)

image.png

deflat 后的二进制文件

image.png

两者几乎相同

deBogus

Description

利用angr框架去除虚假的控制流,详细内容请参考Deobfuscation: recovering an OLLVM-protected program

原文的主要思路是在进行符号执行时,对约束条件进行”精简”,通过将x * (x + 1) % 2替换为0,使得(y < 10 || x * (x + 1) % 2 == 0)恒成立,从而获取正确的基本块,避免死循环。

在使用angr框架解决该问题时,也可以按照上述思路进行。另外一种思路是直接将xy的值设为0,同样可以使得上面的约束恒成立。在默认条件下,xy的值会被初始化为0,无需手动进行设置。也就是说,可以直接利用符号执行来解决,而不会遇到死循环的问题。

通过符号执行,获取所有执行过的基本块之后,再进行patch去除冗余的基本块即可。

对控制流进行精简后,通过F5查看伪代码,与源码基本一致。另外,可以在此基础上对控制流进行进一步精简,比如去除冗余的指令等。

Usage

0x080483e0是函数target_function()的地址。

(angr-dev) <path>/deflat/bogus_control_flow$ python3 debogus.py ./target_bogus 0x80483e0
*******************symbolic execution*********************
executed blocks: ['0x8048686', '0x804868b', '0x8048991', '0x8048592', '0x8048914', '0x8048715', '0x8048897', '0x8048720', '0x8048725', '0x80484ab', '0x804862c', '0x804842e', '0x80484b6', '0x80484bb', '0x80487bb', '0x80487c0', '0x80486c7', '0x8048950', '0x8048551', '0x80488d3', '0x8048955', '0x8048556', '0x8048856', '0x80489d8', '0x80488d8', '0x804885b', '0x80483e0', '0x80485e0', '0x8048761', '0x80485eb', '0x80485f0', '0x80484f7', '0x80487fc']
************************patch******************************
Successful! The recovered file: ./target_bogus_recovered
CATALOG
  1. 1. deflat
    1. 1.1. introduction
    2. 1.2. setup
      1. 1.2.1. angr
      2. 1.2.2. deflat.py
    3. 1.3. usage
      1. 1.3.1. deflat
      2. 1.3.2. deBogus
        1. 1.3.2.1. Description
      3. 1.3.3. Usage