MacOS IDA7.4 + BinDiff6避坑指南
在日常工作中经常要对比两个二进制程序,找出程序结构上的差异,所以趁手的二进制对比工具对与一个安全研究者必不可少。面向IDA平台这类插件主要有Diaphora和zynamics出品的BinDiff可供选择。BinDiff是很老派的对比插件,在zynamics被google收购后BinDiff可以免费下载使用了,出于使用习惯的考虑笔者更倾向于使用更熟悉的工具。
前几天碰巧看到今年3月份BinDiff6发布了,号称改进了macOS的集成,而且是基于ida7.4的sdk编译的。其实最打动我的还是release notes里提到改进了macOS的集成,如果你有用过macOS之前版本的bindiff的使用体验应该会理解,这东西在macOS上总有各种各样的问题需要hack一下才可以。正好公司去年刚刚购买了ida7.4,笔者决定尝试一下最新的BinDiff6看看是不是真的"improves macOS integration”。
下载
这一步没什么太多可说的,去到官方网站下载就可以了。mac版的下载dmg回来,注意检查SHA256是否一致。
安装
mount dmg后双击install pkg运行安装程序,唯一可配置的地方就是IDA安装路径,我们一路选择默认配置安装成功。

然后运行BinDiff,启动成功了,至少之前出现过的java环境错误的问题没有了。

我们找两个idb试一下diff功能。首先新建一个workspace。

新建一个Diff,选择两个idb,点击Diff。

坑
0x1 找不到disassembler
终于还是遇到坑了,bindiff弹出了第一个错误,看上去ida的路径配置问题。

但是在安装过程中配置默认路径配置是没有错误的,为了解决这个问题我把bindiff.jar拖到JEB里,IDA的启动过程封装在idahelers类里。

按照这个逻辑非windows系统上,bindiff去找ida和ida64这两个文件来启动ida,
所以看起来我们去ida里找到这两个文件的位置就可以了。

点击settings->main settings,看到IDA directory目录居然是空的,我们把它设置为/Applications/IDA Pro 7.4/idabin。

重新创建一个diff,启动。

没有找不到disassembler的错误了。
0x2 找不到BinDiff engine
很快我们又遇到了第二个坑。

这个错误提示的很明白,在/Applications/BinDiff/BinDiff.app/Contents/app找不到bindiff文件。
我在/Applications/BinDiff/目录里找了一圈,最后在/Applications/BinDiff/BinDiff.app/Contents/MacOS/bin里找到了bindiff文件,然后在/Applications/BinDiff/BinDiff.app/Contents/app里创建一个link指向它。
重新diff问题解决。
0x3 bindiff engine runtime error
如果一直按照上面的步骤做下来,有可能已经可以正常使用了。但是有些情况在更新了main settings之后还可能遇到这样的错误。

这种情况一般是bindiff engine运行时异常退出了。
我们可以从bindiff.jar中,找到调用bindiff engine的地方。

从这里的逻辑可以看出bindiff.jar以bindiff --primary xxx.idb --secondary yyy.idb --output_dir aaa --output_format=bin
的方式调用bindiff engine。
我手动执行了一下这个命令,bindiff engine抛出了一个运行时错误退出了。

挂上调试器观察一下出错的位置

为了方便起见,直接把bindiff engine拖进ida里看一下,抛出异常的位置位于security::bindiff::GetDefaultMatchingSteps。

看上这个函数是负责加载默认的函数匹配算法的,加载配置文件的时候出了一些问题。
顺着代码往回找,看到前面的逻辑在尝试加载function-matching节点,如果找不到的话会直接跳到后面跑出异常。

然后我们看一下配置文件的情况,果然是没有这个配置的。

剩下的就是补齐function-matching就可以了,方法有很多,比如可以从windows版里找到配置文件把缺少的部分复制过来,同样缺失的还有basic-block-matching的配置。
这个问题可能跟配置文件的更新操作bug有关,笔者并不想太过深入的研究什么情况下会触发这种更新错误,本着认真负责的态度这个bug已经上报给Google了。总之大家如果遇到类似的问题可以看一下是不是配置文件少了什么。
总结
基本上在踩完这些坑之后就可以正常使用了。总的来说BinDiff6 “improves macOS integration”还是做得不够,各种小毛病还是很多,需要自己去处理一下。
但是用起来还是很舒服的。

Happy diffing.