0%

deflat

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