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安装路径,我们一路选择默认配置安装成功。
然后运行BinDiff,启动成功了,至少之前版本出现过的java环境错误的问题没有了。
我们找两个idb试一下Diff功能。首先新建一个workspace。
新建一个Diff,选择两个idb,点击Diff,如果一切顺利就可以看到Diff结果了。
避坑指南
0x01 Can’t start disassembler
终于还是遇到坑了,BinDifff弹出了第一个错误,看上去IDA的路径配置问题。
在安装过程中配置默认路径配置是没有错误的,为了搞清楚这个问题,我把bindiff.jar拖到JEB里,IDA的启动过程封装在idahelers类里。
按照这个逻辑,在非windows系统上,BinDifff去找ida和ida64这两个文件来启动IDA,所以看起来我们去IDA里找到这两个文件的位置就可以了。
点击settings->main settings,看到IDA directory目录居然是空的,我们把它设置为/Applications/IDA Pro 7.4/idabin。
重新创建一个Diff,启动。
没有disassembler的错误了。
0x02 Can't find 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问题就解决了。
0x03 BinDiff engine runtime error.
如果一直按照上面的步骤做下来,有可能已经可以正常使用了。但是有些情况在更新了main settings之后还是可能遇到BinDiff engine的相关错误。
比如这种情况一般是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 的时候也遇到一些问题,希望这篇文章可以帮到你。根据笔者的经验,在踩完这些坑之后基本上可以正常使用了。总的来说BinDiff6 所谓的“improves macOS integration”还是做得不够,各种小毛病还是很多,需要自己去处理一下。但是功能用起来还是很舒服的。
Happy diffing.
以上是关于MacOS IDA7.4 + BinDiff6避坑指南的主要内容,如果未能解决你的问题,请参考以下文章