热门标签 | 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;差别不是很大

推荐阅读
  • 部分转载自:http:blog.csdn.netliujiuxiaoshitouarticledetails69920917头文件#include<assert.h& ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 本文介绍了如何使用n3-charts绘制以日期为x轴的数据,并提供了相应的代码示例。通过设置x轴的类型为日期,可以实现对日期数据的正确显示和处理。同时,还介绍了如何设置y轴的类型和其他相关参数。通过本文的学习,读者可以掌握使用n3-charts绘制日期数据的方法。 ... [详细]
  • Word2vec from scratch (Skip-gram & CBOW)
    在自然語言處理領域中,如何透過向量表達一個詞彙,是近幾年非常火熱的議題,在distributedrepresentation(densevector)尚未風行前,大多數的任務都以1-hotencoding作為詞彙的表示,其方法得到了高維度的稀疏向量,雖容易理解、簡單計算,但也帶來許多副作用;直至2013年,ThomasMikolov等人提出了word2vec,word2vec引用了一個概念,作者導 ... [详细]
  • css div中文字位置_超赞的 CSS 阴影技巧与细节
    本文的题目是CSS阴影技巧与细节。CSS阴影,却不一定是box-shadow与filter:drop-shadow,为啥?因为使用其他属性 ... [详细]
  • oracle安装时找不到启动,Oracle没有开机自启是怎么回事?这一步骤很重要
    重启Oracle数据库重启Oracle数据库包括启动Oracle数据库服务进程和启动Oracle数据库两步,大家继续往下看。按照《【Oracle】什么?作为DBA&# ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文介绍了如何在Mac上使用Pillow库加载不同于默认字体和大小的字体,并提供了一个简单的示例代码。通过该示例,读者可以了解如何在Python中使用Pillow库来写入不同字体的文本。同时,本文也解决了在Mac上使用Pillow库加载字体时可能遇到的问题。读者可以根据本文提供的示例代码,轻松实现在Mac上使用Pillow库加载不同字体的功能。 ... [详细]
  • 无详细内容MySQLmysqlmysqlDELIMITERmysqlCREATEFUNCTIONmyProc(costDECIMAL(10,2))-RETURNSDECIMAL(1 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
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社区 版权所有