热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

EKLAVYA利用神经网络推断二进制文件中函数的参数

EKLAVYA–利用神经网络推断二进制文件中函数的参数文章目录EKLAVYA--利用神经网络推断二进制文件中函数的参数问题介绍以及形式化定义方法设计数据准备实验结果这一次介绍一篇文
EKLAVYA – 利用神经网络推断二进制文件中函数的参数

文章目录

  • EKLAVYA -- 利用神经网络推断二进制文件中函数的参数
      • 问题介绍以及形式化定义
      • 方法设计
      • 数据准备
      • 实验结果



这一次介绍一篇文章,名为
Neural Nets Can Learn Function Type Signatures From Binaries

来自于新加坡国立大学Zhenkai Liang团队,发在了Usenix Security 2017上

问题介绍以及形式化定义

该工作主要关注的问题是函数的参数推断,包含两个部分:

  • 参数的个数
  • 参数的类型,比如int, float等

传统方法通常会使用一些先验知识,将指令的语义,ABI惯例 (Application Binary Interface),编译器的风格等进行编码。

一旦编译器发生了改变,指令集合发生了改变,那么我们就需要重新引入一些先验知识。

如果我们可以摆脱,或者说是减少这些先验知识的利用,那么就不会受限了!

那么,使用神经网络来进行自动化的学习和推断,就是一种思路了。

前提假设

  • 我们首先能知道一个函数的边界 (boundary)
  • 在一个函数内部,我们知道它的指令边界
  • 我们知道代表一个函数调用(function dispatch)的指令,比如call

通过反汇编工具,我们可以满足上述假设。

值得一提的是,函数边界也可以使用神经网络来做,有兴趣的读者可以参考 Dawn Song 发在Usenix Security 2015 的 Recognizing functions in binaries with neural networks.

这里,首先给出一些符号的定义:

  • 我们定义我们的模型为 M(⋅)M(\cdot)M()

  • 定义函数 aaa 反汇编出来的代码为 TaT_aTa ,Ta[i]T_a[i]Ta[i] 代表函数 aaa 的第 iii 个字节

  • 函数 aaa 的第 kkk 条指令可以被写成 Ia[k]:&#61;I_a[k]:&#61; Ia[k]:&#61;<Ta[m],Ta[m&#43;1],...,Ta[m&#43;l]>

    • 其中 mmm 是对应指令的起始字节的位置索引
    • lll 是该指令所包含的字节数
  • 一个包含 ppp 条指令的函数 aaa 可以被表示为 Ta:&#61;T_a:&#61;Ta:&#61;<Ia[1],Ia[2],Ia[p]>

  • 如果一个函数 bbb 有一个直接调用 call 对于函数 aaa, 我们将该条call指令之前的所有指令拿出来&#xff0c;称为 caller snippet&#xff0c;可译为调用者片段。定义为 Cb,a[j]:&#61;C_{b,a}[j]:&#61;Cb,a[j]:&#61;<Ib[0],...,Ib[j1]>

    • 其中 Ib[j]I_b[j]Ib[j] 对应 call 函数 aaa 的那一条指令
    • 如果 Ib[j]I_b[j]Ib[j] 是一个间接调用&#xff0c;我们令 Cb,a[j]:&#61;∅C_{b,a}[j]:&#61;\emptyCb,a[j]:&#61;
  • 我们会收集函数 aaa 的所有调用者的调用者片段&#xff0c;记为 Da:&#61;Ta∪(⋃b∈Sa(⋃0≤j≤∣Tb∣Ca,b[j]))\mathcal{D}_a:&#61;T_a\cup(\bigcup_{b\in S_a}(\bigcup_{0\leq j\leq |T_b|}C_{a,b}[j]))Da:&#61;Ta(bSa(0jTbCa,b[j]))

    • 其中 SaS_aSa 是调用 aaa 的所有函数的集合

由于调用者片段的长度可能非常长&#xff0c;这里文章设置为不超过500条指令

我们的函数 M(⋅)M(\cdot)M() 接受输入 Da\mathcal{D}_aDa , 输出两个变量&#xff1a;

  • 函数 aaa 的参数个数
  • 函数 aaa 的每一个参数的类型
    • C-风格的参数类型可以被定义为 int, char, float, void*, enum, union, struct

方法设计

我们这里先直接给出整体的方法流程图&#xff1a;

image-20211004214934260

简单来说&#xff0c;可以划分成两个模块&#xff1a;

  • 指令编码模块
    • 首先&#xff0c;将输入的二进制文件进行函数抽取、指令的分割、调用点的抽取。
    • 然后对指令进行Word Embedding编码&#xff0c;得到对应的向量表示&#xff0c;这一部分可以参照 NLP 中的 Word2Vec。
  • 参数还原模块
    • 将这些数据切分成训练集和测试集&#xff0c;分别使用4个递归神经网络(RNN)来从两个方面(调用者和被调用者)推断函数参数的个数以及类型&#xff0c;也就是对应上图中的4个任务&#xff08;Task2&#xff0c;Task4 对应被调用者&#xff0c;Task1&#xff0c;Task3对应调用者&#xff09;。

究竟是怎么推断多个参数类型的呢&#xff1f;

一个RNN&#xff0c;输入一个序列&#xff0c;只能推断出来一个类型。

所以这篇文章的实现是&#xff0c;训练多个RNN&#xff0c;每一个RNN独立推断固定位置的参数类型。

先用一个RNN推断出来参数个数&#xff0c;然后分别使用多个RNN来推断不同的位置的参数。

数据准备

该文章使用一些linux的包&#xff0c;然后使用clang和gcc来进行编译&#xff0c;通过设定debug模式&#xff0c;就可以直接在binary中的DWARF字段找到对应函数边界、参数个数以及类型&#xff0c;作为ground truth。

构建了两个数据集&#xff1a;

  • 数据集1: 包含了3个流行的linux包&#xff08;binutils&#xff0c;coreutils 以及 findutils&#xff09;, 使用了O0到O3的优化等级进行编译
  • 数据集2: 将数据集1包含的linux包进行扩展&#xff0c;多增加5个 (sg3utils, utillinux, inetutils, diffutils 和 usbutils), 也在4个优化等级上进行编译

训练集和测试集的划分比例为8:2

不平衡的数据

在数据集的构造中&#xff0c;会出现不同类的数据比例相距甚远的情况。比如参数为pointer类型的数据就是union类型的数百倍&#xff0c;大部分函数都是少于3个参数。该文章中并没有解决这个问题。

实验结果

image-20211004232753476

这里贴出来Task1和Task2&#xff0c;也就是通过调用者和被调用者&#xff0c;推断参数个数的结果

可以看到&#xff1a;

  • 优化级别越高&#xff0c;越难推断&#xff0c;但并没有严格的递增关系
  • 参数个数越多&#xff0c;越难推断&#xff0c;和训练数据量也有关系
  • 从调用者方面&#xff0c;更容易推断出来参数个数

image-20211004233105566

上面是&#xff0c;关于参数类型推断的结果

可以看到&#xff1a;

  • 优化级别似乎干扰性不强&#xff0c;甚至优化级别越高&#xff0c;推断类型越精确
  • 参数的位置越靠后&#xff0c;越难推断出来了类型
  • 从调用者和被调用者两方面来推断&#xff0c;差别不是很大

推荐阅读
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 利用REM实现移动端布局的高效适配技巧
    在移动设备上实现高效布局适配时,使用rem单位已成为一种流行且有效的技术。本文将分享过去一年中使用rem进行布局适配的经验和心得。rem作为一种相对单位,能够根据根元素的字体大小动态调整,从而确保不同屏幕尺寸下的布局一致性。通过合理设置根元素的字体大小,开发者可以轻松实现响应式设计,提高用户体验。此外,文章还将探讨一些常见的问题和解决方案,帮助开发者更好地掌握这一技术。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 在PHP中,高效地分割字符串是一项常见的需求。本文探讨了多种技术,用于在特定字符(如“或”)后进行字符串分割。通过使用正则表达式和内置函数,可以实现更加灵活和高效的字符串处理。例如,可以使用 `preg_split` 函数来实现这一目标,该函数允许指定复杂的分隔符模式,从而提高代码的可读性和性能。此外,文章还介绍了如何优化分割操作以减少内存消耗和提高执行速度。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 本文对常见的字符串哈希函数进行了全面分析,涵盖了BKDRHash、APHash、DJBHash、JSHash、RSHash、SDBMHash、PJWHash和ELFHash等多种算法。这些哈希函数在不同的应用场景中表现出各异的性能特点,通过对比其算法原理、计算效率和碰撞概率,为实际应用提供了有价值的参考。 ... [详细]
  • 开源实习机会 | Compiler SIG 正式发布实习任务,诚邀您加入申请!
    对编译技术充满兴趣却苦于无从入手?当前疫情形势下,外出实习变得困难重重?现在,Compiler SIG 正式发布了一系列实习任务,为有志之士提供了宝贵的机会。无论你是初学者还是有一定基础的学生,都能在这里找到适合自己的实践项目。我们诚挚邀请您的加入,共同探索编译技术的无限可能! ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • 求助高手调试程序,非常感谢您的支持!在编写C语言程序时遇到了一些问题,具体代码如下:```c#include #include #include #define MAX 50int t;```希望有经验的开发者能提供指导,帮助解决调试中的难题。感谢您的时间和帮助! ... [详细]
  • 在 Windows 10 环境中,通过配置 Visual Studio Code (VSCode) 实现基于 Windows Subsystem for Linux (WSL) 的 C++ 开发,并启用智能代码提示功能。具体步骤包括安装 VSCode 及其相关插件,如 CCIntelliSense、TabNine 和 BracketPairColorizer,确保在 WSL 中顺利进行开发工作。此外,还详细介绍了如何在 Windows 10 中启用和配置 WSL,以实现无缝的跨平台开发体验。 ... [详细]
  • 本文总结了Java初学者需要掌握的六大核心知识点,帮助你更好地理解和应用Java编程。无论你是刚刚入门还是希望巩固基础,这些知识点都是必不可少的。 ... [详细]
author-avatar
mobiledu2502882453
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有