MacOS IDA7.4 + BinDiff6避坑指南

Posted 联想全球安全实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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安装路径,我们一路选择默认配置安装成功。

MacOS IDA7.4 + BinDiff6避坑指南

MacOS IDA7.4 + BinDiff6避坑指南

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

MacOS IDA7.4 + BinDiff6避坑指南

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

MacOS IDA7.4 + BinDiff6避坑指南

新建一个Diff,选择两个idb,点击Diff,如果一切顺利就可以看到Diff结果了。

MacOS IDA7.4 + BinDiff6避坑指南

避坑指南

0x01 Can’t start disassembler

终于还是遇到坑了,BinDifff弹出了第一个错误,看上去IDA的路径配置问题。

MacOS IDA7.4 + BinDiff6避坑指南

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

MacOS IDA7.4 + BinDiff6避坑指南

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

MacOS IDA7.4 + BinDiff6避坑指南

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

MacOS IDA7.4 + BinDiff6避坑指南

重新创建一个Diff,启动。

MacOS IDA7.4 + BinDiff6避坑指南

没有disassembler的错误了。

0x02 Can't find BinDiff engine

很快又遇到了第二个坑。

MacOS IDA7.4 + BinDiff6避坑指南

这个错误提示的很明白,在/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问题就解决了。

0x03 BinDiff engine runtime error.

如果一直按照上面的步骤做下来,有可能已经可以正常使用了。但是有些情况在更新了main settings之后还是可能遇到BinDiff engine的相关错误。

MacOS IDA7.4 + BinDiff6避坑指南

比如这种情况一般是BinDiff engine运行时异常退出了。

我们可以从bindiff.jar中,找到调用BinDiff engine的地方。

MacOS IDA7.4 + BinDiff6避坑指南

从这里的逻辑可以看出bindiff.jar以bindiff --primary xxx.idb --secondary yyy.idb --output_dir aaa --output_format=bin的方式调用BinDiff engine,然后从标准输出读取运行情况。

我手动执行了一下这个命令,BinDiff engine抛出了一个运行时错误退出了。

MacOS IDA7.4 + BinDiff6避坑指南

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

MacOS IDA7.4 + BinDiff6避坑指南

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

MacOS IDA7.4 + BinDiff6避坑指南

看上去,这个函数是负责加载默认的函数匹配算法的,加载配置文件的时候出了一些问题。

顺着代码往回找,看到前面的逻辑在尝试加载function-matching节点,如果找不到的话会直接跳到后面抛出异常。

MacOS IDA7.4 + BinDiff6避坑指南

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

MacOS IDA7.4 + BinDiff6避坑指南

剩下就是补齐function-matching就可以了,方法有很多,比如可以从windows版里找到配置文件把缺少的部分复制过来,同样缺失的还有basic-block-matching的配置。

这个问题可能跟配置文件的更新操作bug有关,笔者并不想太过深入的研究什么情况下会触发这种更新错误,本着认真负责的态度,这个bug已经上报给Google了。总之大家如果遇到类似的问题可以看一下是不是配置文件少了什么。

总结

如果你在使用BinDiff6 的时候也遇到一些问题,希望这篇文章可以帮到你。根据笔者的经验,在踩完这些坑之后基本上可以正常使用了。总的来说BinDiff6 所谓的“improves macOS integration”还是做得不够,各种小毛病还是很多,需要自己去处理一下。但是功能用起来还是很舒服的。

Happy diffing.

以上是关于MacOS IDA7.4 + BinDiff6避坑指南的主要内容,如果未能解决你的问题,请参考以下文章

WSL避坑指南

避坑求职避坑指南:全程干货

避坑指南!网上买卡“坑”太深,七个避坑指南或许能用得上!

.NET AsyncLocal 避坑指南

Python~Pandas 小白避坑之常用笔记

python 操作MySQL避坑1064