Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

Recovering the Toolchain Provenance of Binary Code

论文下载

Abstract & Intro

  • 获得一个二进制文件的编译toolchain在取证,反汇编等等领域都是必要的
  • 之前有一些文章提出编译器的一些特征可以用来识别编译器的种类(gcc or VC)
  • 本文给出一个99.9%识别编译器种类,90%识别编译器版本的工具

Overview

  • 用不同的编译选项编译不同的程序
  • 提取二进制的Color-CFG
  • 提取一些特征
  • 机器学习

EXTRACTING BINARY FEATURES

  • 函数切分
  • 三种特征,idiom、summary-graphlet、branch-graphlet
  • idiom:基本块中的连续3条指令
  • summary-Graphlet: color-CFG中的3元组。节点的染色依据节点(基本快)的中包含指令种类,
  • branch-graphlet: 类似于summary-Graphlet,节点的染色依据节点中跳转指令的种类
    • 使用这种方式是因为编译器对一个for循环的翻译方式有差异

Model Definition

  • Independent Classification:
    • 用training set得到各种特征,用SVM独立训练所有的特征对编译器类型(GCC, VC, ICC),编译器版本(9种), 优化级别(低,高)的权重
    • 用三个SVM分别得到一个程序中函数的编译器类型、版本、优化级别。
  • Joint Classification:
    • 上一个分类方法对编译器版本的结果不好,有了如下的方法(Linear-chain CRF)
    • 把函数按照在程序中的顺序依次排列,f1, f2, f3, f4, f5
    • 定义一个函数 m(V1, V2, b) 表示如果 fi 包含特征b,并且被认定为使用版本v1编译的,那么它的下一个函数fi+1使用版本V2编译的可能性增加m(V1, V2, b)
    • 公式
    • 这个方法把一个程序中的函数顺序联系了起来,
  • Joint Model Structure:
    • 只将前后函数之间联系起来还是不够,编译器种类,版本,优化级别,源代码语言都要综合考虑。。。
    • 然后就出现了两种综合考虑的方式,
      • 一种是concatenated-label CRF,一共有18种合理的 类型-版本-优化级别的label,放在一起,用上一个方法做判断
      • 另一种是,直接使用(General CRF),把原来线性的形式变成一个网格形式。。。公式很痛苦。。

Evaluation

  • Independent Classification: 识别编译器版本准确率只有60% ,其他都还好
  • Joint Classification: 结果最好,总准确率0.918, 但是要对三个识别的指标训练
  • Concatenated-label CRF: 结果比前者稍稍稍稍差,0.905,只需要训练一次
  • General CRF: 0.831,而且最慢。。