0x01 样本对比
· 存在漏洞的WhatsApp应用程序
· 版本2.19.133
· 763ab8444e085bd26336408e72ca4de3a36034d53c3e033f8eb39d8d90997707
· 使用 9daaa009e08ac55168aeacdc34dd9c1d7a8f8a49048de949ddaf8a61997b324f libwhatsapp.so
· 打补丁的的WhatsApp应用程序
· 版本2.19.134
· 找不到有以下内容的APK: ee09262fa8b535b5592960ca5ab41e194f632419f8a80ef2e41d36efdbe13f88
· 使用 28dc66c34e92810ad3f0cb2f5b636773fb4d5fc5134f77b4ee986d9e1a6b4f80 com.whatsapp_2.19.134-452790_minAPI15(armeabi-v7a)(nodpi)_apkmirror.com.apk
· 使用 d054ff7bce7777a94dc8b72cb5bd8a2ab3b188bcb81fcf8aafcf5720b85036c4 libwhatsapp.so
加载库的项目布局
对于那些尚未阅读@maddiestone漏洞信息的人,我简单描述一下,她主要是在说两个漏洞点:
Size check #1
· 2.19.133:0x51D30= FUN_00061e34(在Ghidra中)
· 2.19.134:0x51E34=FUN_00061d30
Size check #2
· 2.19.133:0x52F00=FUN_00062f00
· 2.19.134:0x52D0C=FUN_00062d0c
0x02 漏洞分析
Ghidra检测到某些无法识别的函数,因此无法反汇编,我禁用了Non-Returning Functions – Discovered分析器:
Non-Returning Functions – Discovered 分析器已禁用
我以前在此分析器处于活动状态的情况下运行了分析,这导致源程序和目标程序具有不同数量的不返回函数。Ghidra的版本跟踪前提条件清单将检查这些内容并发出警告。因此,请始终运行前提条件检查表!!!
由于Ghidra在返回函数后会停止工作,因此该问题特别明显。但是它只能在以下程序中检测到无法识别的函数:
0x03 版本跟踪session
在向导wizard中,可以运行一些前提条件检查。这些可以确保已经分析了足够多的二进制文件,并且还执行了一些健全性检查,例如,比较无法识别函数的数量和报告差异。应该始终运行它们并修复所有错误并查看所有警告。
在这种情况下,出现了一个警告,因为分析期间库代码有不同数量的错误:
如果希望得到原始的结果,建议尽可能多地修正警告。
0x04 运行关联器
在新的版本跟踪会话中,需要添加运行关联器。这些关联器会比较源程序和目标程序并查找匹配项,例如,Exact Function Bytes Match关联器在具有完全相同的字节模式的函数之间查找匹配项。
Ghidra的自动版本跟踪命令按照假定的顺序运行包含的关联器,一直接受匹配,但将错误匹配保持在最低限度。
自动版本跟踪
运行自动版本跟踪命令后,在匹配“大小检查”#1的同时,它没有被自动接受:
匹配尺寸检查#1函数
大小检查#2甚至根本不匹配:
匹配大小检查#2函数
但是,我决定运行功能参考匹配关联器,即使至少根据手册,组合功能和数据参考匹配关联器应该已经包括该关联器:
添加函数参考匹配相关器
在通过函数引用匹配相关器匹配此大小检查#2之后:
匹配大小检查#2函数
然后,我手动接受了大小检查#1和#2函数。
0x5 差异比较
Ghidra不提供图形差异视图。
函数比较窗口中的反编译视图也不会突出显示所做的更改。这两个“编译视图”只需滚动其行即可同步(通过其行号!)。
因此,唯一包含比较更改的方法是通过列表视图:
列出查看大小检查#1函数的差异
列出查看大小检查#2函数的差异
很快就会发现,通过列表视图比较补丁不如图形差异视图清晰。
0x06 Ghetto-tech图形视图比较
作为一种解决方法,我在函数之间更改了基本块的颜色,以提供Ghetto-tech图形视图:
大小检查#1源函数的Ghetto-tech图形视图
大小检查#1目标函数的Ghetto-tech图形视图
大小检查#2源函数的Ghetto-tech图形视图
大小检查#2目标函数的Ghetto-tech图形视图
如果您想进一步了解CVE-2019-3568补丁以及如何利用此漏洞,请参阅Maddie的资料。
0x07 反编译问题
最后,可以用Ghidra比较存在漏洞的两个函数。但是,如果不知道存在漏洞的函数,将很难找到它们,因为Ghidra似乎存在ARM反汇编问题,导致实际上几乎相同的函数反编译完全不同。例如:
由于只有一个程序反汇编在该b.w分支之后,因此函数变化很大。对于基本没什么区别的函数,它会产生不同的反汇编代码。
0x08 CVE-2015-8126
我之前写过一篇有关CVE-2015-8126补丁差异的文章。
可以通过运行PatchDiffCorrelator项目的一个来实现漏洞利用(视频](https://www.youtube.com/watch?v=8BH7ttwz5tg))。