0%

二进制比对工具使用记录

看了一下居然已经三个月没写博客了,虽然除了本人无人在意,但是还是应该狠狠谴责自己,这篇博客其实六、七月份就应该写了,一直懒得写。这几天开学了,也不懂为什么都这个年纪了还会因为开学难过,烦死了,新学期准备开始写博客,一方面是这两天没有特别要紧的事忙,另一方面是觉得需要总结一下这几个月做了什么,不然基本上白干。

HPE服务器的BMC固件2021年发布了一系列的CVE漏洞,但是除了漏洞描述之外没有其他的信息,不过漏洞描述里面比较详细的说了漏洞位置,例如CVE-2021-26577漏洞描述如下。

The Baseboard Management Controller (BMC) firmware in HPE Apollo 70 System prior to version 3.0.14.0 has a local buffer overflow in libifc.so uploadsshkey function.

并且HPE官方提供固件下载,所以通过下载漏洞修复前后的固件,用ida逆向,再比对函数的差别,可以对漏洞进行简单的分析。如果手工完成比对的话,函数小还可以实现,但是如果是比较大的函数的话还是挺麻烦的,所以想通过自动化工具来快速定位函数修改的地方,找到漏洞点。

这里选择了BinDiff和Diaphora两种工具,两个工具都是免费的,如果要开源版的话可以看看BinNavi(不太清楚两者之间的区别,感觉好像差不多),接下来简单记录一下使用过程。

BinDiff

BinDiff这个工具之前在软件安全课上经常听到老师提,主要是名字取得挺好的,一看就知道干什么的,好记也好写。官网对BinDiff的介绍就是快速定位程序中打的补丁,后续分析是在反汇编代码中进行。

官网直接提供了安装包,下载地址:https://zynamics.com/software.html

第一个坑

BinDiff版本比较多,适配的IDA版本也不一样,这是第一个坑,我直接下载了BinDiff 7 发现无法支持,但是卸载重新安装BinDiff 5发现版本还是没有回退,一般这种都是因为日志之类的没有卸载干净,找了一下发现果然有这种问题,参考的这篇博客

BinDiff Manual里面有提到各个版本匹配的IDA,根据自己的IDA版本选择安装包下载。Mac上总是不成功,我最后在Windows上用IDA7.5 + BinDiff 7。

第二个坑

因为时间过的有点久,所以只能看备忘录里面零散的记载,似乎出现了BinDiff error: “Can’t start disassembler. Please set correct path in the main settings first”的问题,但是解决该问题的链接失效了,搜了一下,是因为BinDiff默认的ida目录不对导致的,这篇博客中包含解决方案,但是不知道能不能成功。

使用过程

新建Workspace->New Diff ,这里需要注意的是Diff的文件是ida数据库文件,选择i64或者idb文件进行Diff。

在Functions中找到对应的函数,双击之后可以看到两个函数具体的对比,BinDiff是基于控制流程图的比较,通过下图不同的底色可以快速定位存在区别的块。可以发现1.09.0版本(左边)里面多了一个strncpy的操作,strncpy()会将字符串src前n个字符拷贝到字符串dest。通过把strncpy函数把字符串长度限制在0x10以内,从而避免缓冲区溢出。

BinDiff可以以ida插件的形式使用,这里并不需要额外的安装插件。但是如果想要查看具体比对内容的话,还是需要在bindiff中查看,因为插件把结果传到BinDiff的GUI中显示。

Diaphora

diaphora是ida中二进制比对的插件,在GitHub中开源,关于python2和python3的选择可以根据自己的ida版本来看。

导出sqlite文件

File->script file-> diaphora.py即可使用diaphora。

不过在使用之前需要将idb文件导入成sqlite文件,所以最开始比对时需要将两个文件转换成sqlite文件,方法也很简单,直接File->script file-> diaphora.py->confirm,就可以将ida database文件导出为sqlite文件,这一步可能会等的比较久。

使用过程

之后Diff过程只要选择需要比对的两个sqllite文件即可。diaphora会根据匹配度把函数分成Partial matches,best matches和unmatched,diaphora支持比对的形式更多,包括为代码的比对。

这里左边的为1.08.0版本,漏洞修复前。

小结

diaphora的版本适配更简单一点,而且Mac上使用方便,还支持反编译结果的比对,BinDiff有的功能它基本上也有,感觉会更友好一点。