目前源码分析领域存在很多优秀的静态分析工具,比如 Fortify、Joern、codeql 等,在二进制分析领域这类工具则很少见,本议题将介绍演讲者在二进制程序分析工具上的探索。
一起来回顾下罗思礼在SDC2024 上发表的议题演讲:《探秘语法树:反编译引擎驱动自动化漏洞挖掘》
罗思礼:安全研究员
*以下为速记全文
大家好,我是罗思礼,今天给大家带来我最近在二进制分析领域的一些探索,这是前段时间在解决一些逆向困难时想到的思路。
当时我遇到的第一个困难是目标软件有很多的二进制模块,它分散在不同的进程和共享库中,逆向时需要逐个打开 IDA 实例分析比较麻烦,而且IDA插件、脚本无法实现跨模块分析。
面临的第二个难点是同类问题排查,目前针对二进制目标缺乏自动化分析工具,可以去批量的去排查类似问题。但这种情况的话在源码领域却是不一样的,它有很多类似的工具可以用,比如 codeql、Joern、Fortify 等。
我当时的第一个思路是利用图数据库和 IDA 的 CFG 生成跨模块的调用路径分析、字符串引用分析等。
思路是利用 IDA脚本将 CFG 和字符串引用导到一个图数据库,然后我们给它建好对应的边,之后就可以去利用图数据库引擎,快速查询各种路径、引用关系,之后再用对这些路径做一些过滤、清洗,可以辅助我们去分析。
进一步探索后发现可以考虑将 IDA 等反编译工具的分析结果与源码分析工具结合,就能复用源码分析领域的能力了。
对目前业界反编译工具进行分析后,考虑到反编译效果、开发难度决定基于 IDA 开发。
IDA 反编译流程如下:
它首先将汇编指令转换为它的中间语言(microcode),然后然后再在microcode上面做一些反编译的算法,然后最终会生成ctree,即IDA的语法树。
ctree 由 cexpr_t 和 cinsn_t 组成,可以通过 op判断 citem_t 的具体类型,然后根据类型的定义获取每个语法树节点的操作数。
以二元运算符为例,通过 op 的值确定二元运算符的类型, x是左成员,y是右成员,右图是一个实例,它的x是 result,然后y的话是一个number,它是一个立即数。
完成对 IDA 语法树的分析后,就可以开始开发插件将语法树的信息导出,便于后续分析,考虑到开发便捷、IDA版本兼容等特点,决定使用 IDA Python 开发。
导出后的语法树结构如下(具体的代码细节可自行下载查看):
拿到语法树信息后,就需要考虑如何将其与源码分析工具结合,下面介绍一下源码分析工具相关细节。
两个工具的区别在于主要的核心区别就在于 codeql 基于编译的,它提取的信息也更精准,但是问题是在于 codeql 本身是不允许商用的,所以只能个人在工作之外使用。
Joern 的特点是不需要编译,这个条件对于一下审计项目来说是非常友好的。
下面先来介绍 Joern 的技术原理:
它使用不同的工具分析源码,提权源码的语法树,然后基于语法树构建 CFG、DDG 等,生成 CPG,之后用户可以编写规则对 CPG 进行分析。
目前 Joern 也支持使用 Ghidra 分析二进制,但是他没有利用反编译的信息,而是在 pcode 指令上展开分析,这样的话对于规则的编写是比较麻烦的,同一种漏洞模式在指令层面可能会有多种表示。
其次很多情况下我们使用扫描工具时首先会人工分析目标,然后对 IDB 处理,这样反编译后代码会变得更加结构化,利于分析但是在指令层面这些信息是没有的。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)