破密行动: 以不寻常的角度破解 IDA Pro 伪随机数

《破密行动: 以不寻常的角度破解 IDA Pro 伪随机数》

前言

Hex-Rays IDA Pro 是目前世界上最知名的反组译工具,今天我们想来聊聊它的安装密码。什么是安装密码?一般来说,在完成 IDA Pro 购买流程后,会收到一个客制化安装档及安装密码,在程式安装过程中,会需要那组安装密码才得以继续安装。那么,如果今天在网路上发现一包泄漏的 IDA Pro 安装文件,我们有可能在不知道密码的状况下顺利安装吗?这是一个有趣的开放性问题。

在我们团队成员脑力激荡下,给出了一个验证性的答案:是的,在有Linux 或MacOS 版安装文件的状况下,我们可以直接找到正确的安装密码;而在有Windows 版安文件的状况下,我们只需要十分钟就可算出安装密码。

下面就是我们的验证流程:

* Linux 以及 MacOS 版
最先验证成功的是 Linux 及 MacOS 版,这两个版本都是通过 InstallBuilder 封装成安装文件。我们尝试执行安装程序,并在安装包中直接发现了未加密的安装密码。任务达成!

在通过 Hex-Rays 协助回报后,BitRock 也在 2019/02/11 发布了 InstallBuilder 19.2.0,加强了安装密码的保护。

Windows 版

在 Windows 版上解决这个问题是项挑战,因为这个安装文件是通过Inno Setup 封装的,其安装密码是采用160-bit SHA-1 hash 的方式储存,因此我们无法通过静态、动态程序分析直接取得密码,透过暴力列举也不是一个有效率的方式。不过,如果我们掌握了产生密码的方式,那结果可能就不一样了,我们也许可以更有效率的穷举。

虽然我们已经有了方向是要找出 Hex-Rays 如何产生密码,但要去验证却是”非常困难”的。因为我们不知道乱数产生器是用什么语言实作的,而目前已知至少有 88 种乱数产生器,种类太多了。同时,我们也无法知道乱数产生器所使用的字元组和字元顺序是什么。

要找出乱数产生器所使用的字元组是众多困难事中比较简单的一件,首先,我们竭尽所能的收集所有 IDA Pro 的安装密码,例如 WikiLeaks 所揭露的 hackingteam 使用之密码:

FgVQyXZY2XFk (link)
7ChFzSbF4aik (link)
ZFdLqEM2QMVe (link)
6VYGSyLguBfi (link)

从所有收集到的安装密码中我们整理出所用到的字元组:

23456789ABCDEFGHJKLMPQRSTUVWXYZabcdefghijkmpqrstuvwxyz

少了 1Il0OoNn 字元,推測這些都是容易混淆的字元,因此不放入密碼字元組中是合理的。接著,我們用這些字元組,猜測可能的排列順序:

23456789ABCDEFGHJKLMPQRSTUVWXYZabcdefghijkmpqrstuvwxyz
ABCDEFGHJKLMPQRSTUVWXYZ23456789abcdefghijkmpqrstuvwxyz
23456789abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ
abcdefghijkmpqrstuvwxyz23456789ABCDEFGHJKLMPQRSTUVWXYZ
abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ23456789
ABCDEFGHJKLMPQRSTUVWXYZabcdefghijkmpqrstuvwxyz23456789

最后,我们挑选几个比较常见的语言(c/php/python/perl)并使用上述的字元组实作乱数产生器,列举所有乱数组合,看看我们收集到的安装密码有没有出现在这些组合中。例如我们用下面程式​​码列举 C 语言的乱数组合:

#include<stdio.h>
#include<stdlib.h>

char _a[] = "23456789ABCDEFGHJKLMPQRSTUVWXYZabcdefghijkmpqrstuvwxyz";
char _b[] = "ABCDEFGHJKLMPQRSTUVWXYZ23456789abcdefghijkmpqrstuvwxyz";
char _c[] = "23456789abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ";
char _d[] = "abcdefghijkmpqrstuvwxyz23456789ABCDEFGHJKLMPQRSTUVWXYZ";
char _e[] = "abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ23456789";
char _f[] = "ABCDEFGHJKLMPQRSTUVWXYZabcdefghijkmpqrstuvwxyz23456789";

int main()
{
        char bufa[21]={0};
        char bufb[21]={0};
        char bufc[21]={0};
        char bufd[21]={0};
        char bufe[21]={0};
        char buff[21]={0};

        unsigned int i=0;
        while(i<0x100000000)
        {
                srand(i);

                for(size_t n=0;n<20;n++)
                {
                        int key= rand() % 54;
                        bufa[n]=_a[key];
                        bufb[n]=_b[key];
                        bufc[n]=_c[key];
                        bufd[n]=_d[key];
                        bufe[n]=_e[key];
                        buff[n]=_f[key];

                }
                printf("%s\n",bufa);
                printf("%s\n",bufb);
                printf("%s\n",bufc);
                printf("%s\n",bufd);
                printf("%s\n",bufe);
                printf("%s\n",buff);
                i=i+1;
        }
}

大约一个月的运算,我们终于成功利用 Perl 乱数产生出 IDA Pro 的安装密码,而正确的字元组顺序为

abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ23456789

例如 hacking team 泄漏的 IDA Pro 6.8 安装密码是 FgVQyXZY2XFk,就可用下面程序码产生:

#!/usr/bin/env perl
#
@_e = split //,"abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ23456789";

$i=3326487116;
srand($i);
$pw="";

for($i=0;$i<12;++$i)
{
        $key = rand 54;
        $pw = $pw . $_e[$key];
}
print "$i $pw\n";

通过这些信息,我们可以建立一个用来暴力列举安装密码的字典文件,缩短暴力列举的时间,实作方式可参考 inno2john 方案。在一般情况下,约十分钟即可算出 windows 安装文件的安装密码。

在反馈 Hex-Rays 后,他们立刻表示之后将会使用更安全的安装密码。

总结
本篇文章提出了一个开放性问题:在未知安装密码的情况下可不可以安装 IDA Pro?结果我们在 Linux 以及 MacOS 版发现可以从存储器中取得明文密码。而在Windows 版本中,我们黑箱找到了安装密码产生的方式,因此我们可以建立一份字典档,用以缩短暴力列举安装密码的时间,最终,我们约十分钟可解出一组密码,是一个可以接受的时间。

下载地址:

IDA Pro 7.0 全平台 Windows Linux Mac 交互式反汇编器专业破解版【亲测】

云盘下载

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注