2017 · 会议论文

rev.ng:用于恢复控制流图与函数边界的统一二进制分析框架

rev.ng: A Unified Binary Analysis Framework to Recover CFGs and Function Boundaries

rev.ng 借助 QEMU 的微型代码生成器(TCG)将二进制提升为 LLVM 中间表示,因此同一前端可覆盖 QEMU 支持的全部架构,输出的是可编译的中间表示。作者在此基础上构建与架构无关的分析,在没有符号或调试信息的情况下恢复程序的控制流图与函数边界。一种值域分析(OSRA)用于限定 switch 跳转表等间接跳转的目标,其他分析则处理谓词执行指令、noreturn 函数、尾调用以及依赖上下文的控制流。在为 MIPS、ARM 与 x86-64 构建、分别使用 GCC 与 clang 以 -O2、-O3 和 -Os 编译的 coreutils 上,其函数边界恢复的准确度接近 IDA Pro,并优于 BAP/ByteWeight 与 angr。

研究范围与局限

评测衡量的是函数边界,而非直接衡量控制流图:作者无法从 GCC 或 LLVM 获取控制流图的真实标签,因此以函数边界准确度(相对 ELF 函数符号的 Jaccard 指数)作为控制流图质量的下界。评测覆盖为 Linux 构建、静态链接并去除调试信息的 105 个 coreutils 程序,只涉及 QEMU 所支持架构中的三种;其他架构及动态链接二进制未经评测。原型会遗漏 x86-64 上部分嵌套 switch 的跳转表,以及 MIPS 上被溢出到栈中的跳转表地址;在 ARM 与 MIPS 上比其他工具占用更多内存;也不会报告 IDA Pro 凭借函数序言启发式找到的死代码,作者将此视为设计取舍。基线为 IDA Pro 6.6、BAP 0.9.9 以及 2016 年 11 月时的 angr。论文本身不涉及反编译为 C。

与本合集的关联

补充将机器码提升为编译器中间表示,并以与架构无关的方式恢复控制流图与函数边界的研究,这一分析层是合集所收录 rev.ng 反编译器的基础。

发表与复核详情

发表载体
CC 2017
发表状态
会议论文
出版/提交日期
2017 年 2 月 5 日
日期依据
ACM 提交的 Crossref 元数据将纸质与在线出版日期均记为 2017-02-05。本条目采用该日期,而非会议日程。
DOI
10.1145/3033019.3033028

Crossref 给出三位作者的顺序及页码 131–141;Crossref 的标题为小写,本条目采用作者托管的 11 页 PDF 中的大小写,其页数与 ACM 版本相同。论文报告的原型为 8,011 行 C++ 代码,基于 LLVM 3.8 与 QEMU 2.5.0;致谢部分给出 https://rev.ng/ 作为其自由软件发布地址。revng/revng 仓库此后已发展为完整的 rev.ng 反编译器:在已收录的 revng 条目所固定的提交(57d81a3)中,README 将其描述为由 rev.ng Labs 开发的反编译器,整体采用 GPLv2 许可,单个文件采用 MIT 许可。这些功能与许可说明针对当前项目,而非 2017 年接受评测的原型。本次未构建或运行任何内容。

来源复核于

本合集仅做来源复核,未重新运行论文实验。请通过原始论文或 BibTeX 引用原作者。

报告条目过时 建议修正翻译

相关条目

依据相同的代码仓库或论文标识关联。

一手来源

  1. https://dl.acm.org/doi/10.1145/3033019.3033028
  2. https://api.crossref.org/works/10.1145/3033019.3033028
  3. https://nebelwelt.net/publications/files/17CC.pdf
  4. https://rev.ng/
  5. README.md GitHub · revng/revng · 修订 57d81a3