介绍
“ Karta”是IDA的python插件,其功能是在已经编译过的二进制文件中搜索是否使用了开源的代码。该插件是为了匹配大体积二进制文件中的开放源代码库的开源代码(通常是查找固件)。对于每天处理固件的人来说,反复的执行net-snmp显然是在浪费时间。所以需要一个工具来识别二进制文件所使用的开源,并在IDA中自动匹配。
这个插件的初衷是加快匹配的过程。用几个小时去匹配一个包含300个函数的库是很低效的一件事,更何况实际工作过程中逆向的工程会远大于此,比如超过100,000个函数的体积。当然,结合逆向工程行业的一些经验教训,我们解决了这个问题,并取得了比预期更好的结果。
事实证明,出于性能原因而部署的启发式方法对匹配结果也有很大的影响。该插件产生的误报率非常低,而准确性很高。这对于匹配中小型二进制文件也很有用。
因此,我们认为Karta可以成为研究人员的重要工具。
Karta的功能如下:
- 侦查阶段–鉴别二进制文件中使用的开源代码,包括其版本。
- 清除混淆状况-为使用的开源代码匹配符号,从而节省逆向工程看起来是已知功能的时间。
- 查找1 day–使用已使用的开源代码列表,其符号已在二进制文件中匹配,可以轻松地在可执行文件\固件文件中查找1 day。
Karta
如前所述,Karta是IDA的源代码辅助二进制匹配插件。该插件实现了2个功能:
- 1.标识–标识静态编译的开源代码的确切版本。
- 2.匹配–匹配已识别开源的符号。
该插件的源代码现在可以在Github中找到。
有时在不同体系架构上编译开源库是一件非常困难的事,因此我们通过使插件体系架构独立来消除了此步骤。例如,如果我们要匹配libpng开源版本1.2.29 (在HP OfficeJet固件中使用的版本),我们要做的就是从Github克隆它并在我们的(x86)机器上编译它。编译之后,Karta可以生成一个描述该库的规范的.json配置文件。使用此配置,即使固件已编译为Big-Endian ARM Thumb模式,我们的插件现在也可以成功地在固件中找到该库。
Karta由模块组成,IDA反汇编器模块可以用任何其他反汇编模块代替。
寻找 1 day
虽然我们描述了插件的几个使用案例,但在流行软件中寻找1day可能是最有趣的。这是我们研究的两个现实的例子。
HP OfficeJet固件
在我们的FAX研究过程中,我们需要1天的时间才能用作调试漏洞。最终,我们使用了Devil’s Ivy。在完成Karta的开发之后,就该回到固件并检查Karta如何帮助我们进行研究了。
Karta的返回结果显示固件中使用的开源库是:
- libpng: 1.2.29
- zlib: 1.2.3
- OpenSSL: 1.0.1.j
- mDNSResponder: unknown
- gSOAP: 2.7
在这里我们可以看到确实使用了gSOAP,并且快速的CVE搜索表明它包含一个关键漏洞:CVE-2017-9765(Devil’s Ivy)。
在为该版本的gSOAP快速编译配置后,我们运行了匹配器并导入了匹配的符号。在这里我们可以看到Karta匹配了易受攻击的代码函数soap_get_pi:
图1:反编译的soap_get_pi函数,与插件匹配。
对于我们的插件来说,这是个好消息:它可以在实际情况下按预期工作。
普通的闭源软件– TeamViewer
在固件中轻松找到1day很方便,但是我们在Windows PC上使用的日常程序又如何呢?在阅读Project Zero在WebRTC上的博客文章时,我们看到他们在一个名为libvpx的库中发现了一个漏洞:
CVE-2018-6155 在称为VP8的视频编解码器中可以免费使用。有趣的是,由于它会影响VP8库libvpx而不是WebRTC中的代码,因此它有可能影响使用WebRTC之外的使用该库的软件。由于此错误,发布了针对libvpx的通用修复程序。
这看起来很有趣,因为Project Zero特别指出此漏洞“具有影响使用WebRTC以外的其他功能使用该库的软件的潜力。” 我们已经在计算机上安装了TeamViewer,听起来应该使用相同的开源库,让我们检查一下。
我们在IDA中打开了TeamViewer.exe,并在进行分析的同时开始工作。我们下载了最新版本的libvpx(1.7.0),为其编写了一个简单的标识符,并将其添加到Karta。由于我们等不及IDA完成分析,因此我们停止了分析并运行Karta的标识符插件。确定的开源是:
- zlib: 1.2.5
- mDNSResponder: unknown
- libjpeg: 8b
- libvpx: 1.6.1
TeamViewer不仅使用libvpx,而且使用的是2017年1月以来的旧版本。
查看Google发行的补丁,我们知道我们感兴趣的函数是vp8_deblock,如下所示:
图2: vp8_deblock函数的代码片段,容易受到CVE-2018-6155的攻击
我们让IDA恢复分析,并着手为libvpx版本1.6.1编译Karta配置。准备好配置后