首页
社区
课程
招聘
[原创]使用Qiling IDA插件解密Mirai病毒数据
发表于: 2020-9-14 20:54 12515

[原创]使用Qiling IDA插件解密Mirai病毒数据

2020-9-14 20:54
12515

Qiling Framework 基于Unicorn,能够在一个平台上模拟多个OS和架构的二进制文件,包括Linux、MacOS、Windows、FreeBSD、DOS、UEFI和MBR。它支持x86(16、32和64位)、ARM、ARM64和MIPS。因此,我们几乎不需要担心因为环境搭建困难及手头设备不足导致无法进行分析工作,尤其像基于ARM或MIPS的IoT固件,想要进行逆向分析和漏洞挖掘尤其不易。

澪同学的帖子用麒麟框架深入分析实模式二进制文件中提到了Qiling能够进行gdb远程调试,这实际上是我为Qiling所贡献的第一个功能。将调试能力赋予Qiling,我们就能够在完全可控的环境中对二进制文件进行动态分析,不必担心病毒样本对主机造成影响,能够绕过检测,甚至能够只执行其中的一部分。

但这样的调试还不够优雅,在这里我想要为大家介绍的是Qiling调试功能的全新模块:Qiling IDA插件。与当今最强大的反编译器结合,我们可以做很多很棒的事。不需要IDA remote server和虚拟机就能够轻松地在IDA上进行动态调试和反编译,实时查看寄存器,堆栈和内存,绘制代码的执行路径等。此外,结合自定义脚本,我们能够使用Qiling提供的全部功能。我们还有更高级的功能:自动分析并反ollvm控制流平坦化,这将在今后进行单独介绍。

文章同步发表于我的Blog

Qiling的安装方式在这里,由于Qiling更新速度较快,想要获取最新版本请git clone https://github.com/qilingframework/qiling/tree/dev

注意 请将Qiling安装在IDA所使用的Python3环境内。

插件的安装方式有两种

作为一个IDA插件

只需要建立一个Qiling插件与IDA plugin目录的符号链接。

IDA在启动时会自动加载Qiling插件。

作为一个脚本文件

运行IDA,点击File/Script file...,定位插件所在位置(也可以在此处下载最新版本),选择qilingida.py即可。

加载脚本后可以在Edit->Plugins->Qiling Emulator和右键菜单找到按钮。

插件的具体用法请访问 https://docs.qiling.io/en/latest/ida/

插件支持IDA7.x && Python3.6+, 当前建议使用环境macOS及Linux

插件支持环境如下:

配置好插件后我们就可以开始分析本次的示例Mirai了。

为此我录制了视频来展示整体流程:

bilibili版本

https://www.bilibili.com/video/BV1FK4y1a7SH

Youtube版本

本次使用的样本是ARM架构的IoT僵尸网络病毒Mirai。

通过分析我们可以在0xFC50处发现一些被加密的字符串,程序会把它们添加到一个table,而这个table事实上是病毒用来爆破ssh的字典。

HjKdvfAbBEqcNJX

定位到0x12A20,我们会发现该函数正是用来加解密table的。

2V4PvaYnJI6hwZe

使用F5进行反编译,可以看到加解密算法为异或key,因此我们只需要将加密数据输入该函数即可得到解密后的明文。

CWZUQcMqz6I5XxO

分析解密循环的反汇编,我们可以得知,LR寄存器存放了待解密buffer的内存地址,因此我们只需要将加密数据写入该内存区域然后运行到循环结束就可以得到结果。

sOLk6chqexmPobM

由于读写寄存器及内存的操作需要循环多次,我们手工操作会非常繁琐,因此Qiling IDA插件的自定义脚本就派上了用场。

自定义脚本的基本结构如下:

对于本样例,脚本如下,脚本分析在注释中说明

右键-Qiling Emulator-Setup

设置rootfs(即环境根目录,Qiling会加载其中的lib,一般建议使用qiling/example/rootfs下对应环境的文件夹路径作为rootfs),本次分析样本还需要将ld-uClibc.so.0放置在rootfs/lib目录下。

TWn7x9i8UQopdXD

如果Qiling初始化和加载自定义脚本成功,则IDA输出窗口显示如下内容

zerJ3cawnti1XqO

提示 在IDA 反汇编界面的基址位置会显示该文件所依赖的lib。

AZYagoMuCR7V3Qx

回到加解密函数,我们在解密循环前设置断点,用于访问内存地址,并在循环结束后设置断点,因为不必继续模拟。

ZqDMjOE1U5d9Vum

点击右键-Qiling Emulator-Continue,Qiling将模拟到第一个断点

jWl3ILKydSF54be

我们得到了待解密buffer起始地址为0x1E258

右键-Qiling Emulator-View Memory,输入地址及要查看的内存大小,即可查看实时内存

1JysKVLMeAZmRid

同样的,在右键-Qiling Emulator中点击 View Register和View Stack可以查看寄存器及堆栈。整理窗口位置后如下

ru8KUFs1iYePxph

可以看出当前内存中已经写入了我们要解密的数据,在寄存器R2中则存储着将要异或的key。

再次点击Continue,进行解密

xpnhOwdZBHgARt3

内存窗口中黄色字符串即为发生变化的内存,右侧输出窗口也实时显示了解密结果(动态效果参见视频)。

本次我使用了一个较为简单的例子向大家演示了Qiling IDA插件的功能,但它的潜力远不仅此。未来我们也会继续添加更多可用功能,使其更加完整。

当然,在开发过程中也不可避免会出现bug,请到https://github.com/qilingframework/qiling/issues提issue。

同时我们也欢迎各位参与到开发中,提出pr。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-9-15 00:12 被kabeor编辑 ,原因:
收藏
免费 9
支持
分享
最新回复 (7)
雪    币: 138
活跃值: (460)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
厉害了, 直接ida 可视化调试, 懒人福音
以前都是一边看ida静态代码 一边Unicorn代码来控制执行;  心里模拟到 这到哪了 到哪了; 相当繁琐
2020-9-16 09:59
1
雪    币: 3542
活跃值: (239)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
请问这个问题怎么解决,网上没搜到
File "/Applications/IDA Pro 7.0/ida64.app/Contents/MacOS/plugins/qilingida.py", line 435
    logging.error(f"Fail to get mba because: {fl}")
2020-11-3 11:10
0
雪    币: 6086
活跃值: (1117)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
xunbu 请问这个问题怎么解决,网上没搜到 File "/Applications/IDA Pro 7.0/ida64.app/Contents/MacOS/plugins/qilingida.py ...
使用的是idapython3吗?
2020-11-3 20:36
0
雪    币: 6707
活跃值: (2048)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
请教下是不是qiling的这个插件需要安装ida7.5正版才能使用啊,我在windows下安装ida7.5 demo版本使用总是有问题啊,linux系统的ida7.5根本用不了分析arm的程序
2021-2-23 16:30
0
雪    币: 669
活跃值: (2173)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
6
Nermor 厉害了, 直接ida 可视化调试, 懒人福音 以前都是一边看ida静态代码 一边Unicorn代码来控制执行; 心里模拟到 这到哪了 到哪了; 相当繁琐
大佬,怎么用Unicorn代码控制执行呀?有帖子介绍吗
2021-8-14 22:06
0
雪    币: 669
活跃值: (2173)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
Nermor 厉害了, 直接ida 可视化调试, 懒人福音 以前都是一边看ida静态代码 一边Unicorn代码来控制执行; 心里模拟到 这到哪了 到哪了; 相当繁琐
后期会考虑出视频教程嘛,大佬,没太看明白
2021-8-14 22:36
0
雪    币: 1795
活跃值: (3995)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2022-4-17 15:55
0
游客
登录 | 注册 方可回帖
返回
//