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) root@ubuntu:~/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)
deflat 后的二进制文件
两者几乎相同
deBogus
Description
利用angr框架去除虚假的控制流,详细内容请参考Deobfuscation: recovering an OLLVM-protected program 。
原文的主要思路是在进行符号执行时,对约束条件进行"精简",通过将x * (x + 1) % 2
替换为0
,使得(y < 10 || x * (x + 1) % 2 == 0)
恒成立,从而获取正确的基本块,避免死循环。
在使用angr框架解决该问题时,也可以按照上述思路进行。另外一种思路是直接将x
或y
的值设为0
,同样可以使得上面的约束恒成立。在默认条件下,x
和y
的值会被初始化为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