使用增强cfg图的被删除符号表的二进制文件神经网络逆向引擎
开源项目地址 https://github.com/tech-srl/Nero
问题
- 汇编指令包含的语意信息太少了。
- 二进制函数的原始名字比较长。
作者做的东西

- 获取CFG
- 为每个call指令重构call-site-like结构
- 使用pointer-aware切片通过寻找具体值或近似抽象值
- 转化cfg图为增强调用位置图
二进制程序名称预测
从structured augmented call sites去预测过程名字
augmented call sites Graph 生成
确定参数数量
System-V-AMD64-ABI调用约定使用rdi, rsi, rdx, rcx, r8, r9寄存器传参。
- 导入函数:通过导入库的调试信息
- 间接调用能够被解析为内部或者外部调用
确定参数内容
需要先确定指针知识切片数Creating pointer-aware slice-trees。此切片包含为生成寄存器值(参数)而执行的计算步骤。
作者对汇编指令使用下面论文的定义
James R Lyle and David Binkley. 1993. Program slicing in the presence of pointers. In Proceedings of the 1993 Software
Engineering Research Forum. Citeseer, 255–260.
定义下面几个集合

每条指令的操作数放入不同的集合如下图

按照下面的顺序选值(1) concrete value, (2) ARG,(3) GLOBAL, (4) RET, (5) STK
- ARG为被分析函数接收的参数。
- rbp开头被设置为STK标签
- 数字,字符串这个指针被设置为GLOBAL标签
特殊情况的处理,关注2,3。5,6. 以及1里面的自定义函数(作者只处理了api函数 可以优化)

处理别名呵复杂常量表达式。
基于
Yaniv David, Nimrod Partush, and Eran Yahav. 2017. Similarity of Binaries Through Re-optimization. In Proceedings of the
38th ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI 2017). ACM, New York, NY,
USA, 79–94. https://doi.org/10.1145/3062341.3062387
减少参数值,重新优化整个过程和每个切片 举例:xor rax,rax; inc rax; 被简化为 mov rax,1。
对于别名的分析比较简单,作者没有介绍有用的东西。
训练
用下面单词表示词汇表,用api名字作为语料库 。
$$
E^{snames}
$$
为每个标签和常量定义词嵌入
$$
E^{values}
$$
在api向量后面拼接标签和常量的嵌入(序列为参数的序号)。公式表达如下

归一化的填充为特定(no-arg) 符号。
用LSTM嵌入Call Site Sequences
给神经网络的应该是被编码的调用位置序列。
callsite表示上面拼接的词向量。
$$
LSTM_{encoder}
$$
为编码器,对每个词生成嵌入向量。hl包含了前面几个向量的信息。
第二行公式表示正向词嵌入向量拼接反向词嵌入向量(最后一个词向量包含前面几个词的所有信息)

归一化为l为60(60个函数)
结果

模型
seq2seq models 通常基于编码-解码范式