题目: Buffer Overflow Vulnerability Prediction from x86 executables using Static Analysis and Machine Learning
作者: Bindu Madhavi Padmanabhuni, Hee Beng Kuan Tan
单位: School of Electrical and Electroinc Engineering, Nanyang Technological University
出版: Computer Software & Application Conference(COMPSAC), 2015


解决的问题

二进制代码的缓冲区溢出问题

所用工具

ida-pro

利用ida-pro商业反汇编器识别局部和全局变量

  • 全局变量在汇编指令中用地址进行访问
  • 局部变量在汇编指令中用栈帧偏移来进行访问
  • 将一个变量视为从已知地址(或偏移)到下一个已知地址(或偏移)

BinAnalysis(在Rose上搭建的二进制分析工具)

提供x86汇编指令的语义,使我们能够抓住帮助常量传播的机器状态,并且识别间接分支和调用,这些可以通过常量传播静态地确定。

VulMiner

作者自己实现的工具,用来从Rose的分析结果中提取下面将要提到的特征。

静态分析过程

反汇编和变量信息

包括函数边界识别和变量信息收集。

  • 利用IDA Pro来识别函数和变量信息
  • 输入BinAnalysis(在Rose上搭建的二进制分析工具),为每个函数构建AST和CFG

控制依赖

利用函数的CFG来计算过程内控制依赖。Rose提供了从CFG构建后向支配关系的API,这被用来找到直接后序支配一个结点z后序支配结点n,即所有从n开始的流向exit结点的路径都经过结点z

利用函数摘要进行数据依赖的计算

我们利用CFG和变量信息来分析容器级别的过程间数据依赖。容器级别的意思是对于容器数据的访问,我们的工具以整个容器为单位计算数据依赖。对于结构体,当struct信息能够从IDA Pro得知时,我们利用struct的偏移来识别struct中变量的边界。
Rose提供了能够仿真一个x86指令基本块执行的符号语义。每个基本块与一个符号状态相关联。符号状态表示寄存器,内存和标志位的状态。我们对CFG的仿真过程进行增强。我们也利用库函数原型对库函数的调用进行模拟。
通过分配一个新的符号值来处理符号状态的融合。对于有多个返回块的函数,所有返回块的状态融合成一个最终的返回状态。我们利用标准worklist算法来进行过程内数据依赖分析。
为提高效率,我们利用函数摘要来进行过程间分析。函数摘要是用来表示调用效果的,上下文无关的摘要。当函数被调用时,基于调用上下文和合成的函数摘要,控制和数据依赖信息被更新并传回调用函数。调用函数重新开始分析。
为生成函数摘要,函数被符号化执行来记录已知的依赖,以及收集未知的引用。在分析期间,寄存器,标志位,全局变量,参数值和动态分配的变量的定义都被收集,并且函数的最终状态通过聚集全局变量,函数参数值,动态分配变量和返回块的eax,esp等等来生成。
为应用函数摘要,首先被调用函数的摘要被重用,在被调用函数的未知引用与调用函数中对这些引用的定义之间的数据依赖被建立。我们遍历在被调用函数中生成的定义,并且更新它们在调用函数中的入口。状态信息也用类似方法更新。随后便进行调用者下一条指令的分析。

静态代码属性

文章中的一些表示方法

sink k:在二进制反汇编代码中的潜在的有漏洞的程序语句。我们将对C库函数的调用和向缓冲区/容器中写的语句视为sink。
input validation node: 在CFG中,一个谓词结点d被叫做槽k的输入验证结点,当满足以下条件:

  • k和d均是同一个普通输入变量的引用
  • k间接控制依赖于d

input dependent predicate node: CFG中一个谓词结点p被称作槽k的输入依赖谓词结点,当满足以下条件:

  • p是一个输入变量的引用,而k与这个输入变量没有直接或间接的数据依赖关系
  • k间接控制依赖于p

source: 被槽引用的变量
destination: 在槽中定义的变量

输入和源的特征描述

  • Input Count: 统计槽输入的数量
  • Inputs with Limiting: 统计有长度约束的槽输入的数量
  • Environment Dependent Input: 统计独立于环境变量的槽输入的数量
  • Is Source Null Terminated: 源是否以空的终结字符结束

槽的特征描述

不同的槽进行不同的操作,根据操作的类型,可能需要不同形式的边界检查和防御措施。

  • 操作类型:我们将操作类型分为5类

    • 复制:对于进行复制操作的C库函数的调用
    • 连接:对于进行连接操作的C库函数的调用
    • 格式化写
    • 非格式化写
    • 数组写入:其他一切形式的向容器内写入的操作
  • 防御是否有限制:标记是否使用了C库函数的安全版本

目标缓冲区的特征描述

  • 目的是否为空的非终结字符
  • 对目标是否进行多次写
  • 位置:缓冲区的位置,分为全局,局部,混合和堆
  • 源和目标大小是否相同
  • 声明:缓冲区声明,分为静态,动态并依赖于源,动态并与源独立,动态固定大小,混合

控制依赖的特征描述

描述槽结点的控制依赖特征

  • 源字符串长度:统计槽谓词的数量,即是否利用strlen检查源字符串长度
  • 源大小:统计检查源大小的次数
  • 目标字符串长度
  • 目标大小
  • 循环的终止条件是否与源相关:判断槽是否在循环之内,并且循环的终止条件与源大小相关
  • 验证:统计槽验证结点的数量
  • 输入依赖谓词:统计输入依赖的谓词数量
  • 源缓冲区谓词:统计在槽处引用的的谓词数量
  • 目标缓冲区谓词:统计在槽处定义的谓词数量

数据依赖精度特征描述

容器级别的精确度和函数摘要在数据依赖算法中带来了一些不精确性,于是我们将一些抓住了这些不确定性的属性包含到了特征集中。

  • 过程间目标缓冲区访问:目标在过程间是否被访问并写入
  • 目标写入次数:统计除了槽结点外目标被写入的次数
  • 目标缓冲区是否模糊:目标是否是模糊容器
  • 源是否模糊
  • 槽依赖的模糊容器
  • 槽依赖的非模糊容器
  • 与模糊容器相关的谓词
  • 与非模糊容器相关的谓词

实验

数据收集

数据集为MIT Lincoln Laboratories buffer overflow benchmark中的6个程序。

特征提取

利用BinAnalysis识别出槽,并进行数据依赖分析。
利用VulMiner提取特征。

模型与算法

分别利用了5种模型:朴素贝叶斯,多重感知机,逻辑回归,SMO
采用10折交叉验证

评估

评估标准

precision, recall, accuracy, false alarm…

实验结果

SMO展现出了最好的性能,达到75.9%的召回率和84.6%的精确度。

与静态的源码分析工具对比

我们将自己的实验结果与利用Splint,PolySpace,Boon,UNO等源码静态分析工具进行对比。结果显示,我们的方法的效果比这几种静态分析工具的实验效果都好。

局限性

尽管二进制程序的静态代码属性不难被收集,但数据需要一个二进制分析工具进行收集,并且需要足够多的有漏洞的数据来训练模型。我们的数据依赖IDA Pro来进行函数边界的识别,虽然有效,但并非一个简单的工作。我们的数据依赖分析引入了容器级别的精确度,与函数摘要一样,都对精确度有一定的损失。

Buffer Overflow Vulnerability Prediction from x86 executables using Static Analysis and ML相关推荐

  1. (SEED-Lab)Buffer Overflow Vulnerability Lab缓冲区溢出实验

    (SEED-Lab)Buffer Overflow Vulnerability Lab 欢迎大家访问我的GitHub博客 https://lunan0320.cn 文章目录 一.实验目的 二.实验步骤 ...

  2. 缓冲区溢出(buffer overflow)机理分析

    http://blog.sina.com.cn/s/blog_4c72721c010008vt.html ##########################################     ...

  3. signature=dd4c0ce5ed341fbfafa07eb3d3275ec3,SIGNATURE-FREE BUFFER OVERFLOW ATTACK BLOCKER

    摘要: A real-time, signature-free, blocker prevents buffer overflow attacks. The system and method, ca ...

  4. 史上最详细的Buffer Overflow学习笔记

    如果您被标题吸引进来了,却发现我写的很烂,请不要生气: 如果您发现我写的有误,欢迎您于评论区中指教 文章中出现的对于BOF来说相关的专业名词,都可以在最后找到解释 如果这篇文章能在您学习的路上帮助到您 ...

  5. SEEDLabs Buffer Overflow

    SEEDLabs Buffer Overflow 实验原理 攻击目标代码中含有以下代码片段: int bof(char *str) {char buffer[BUF_SIZE];strcpy(buff ...

  6. 搬砖:C/C++ and Buffer Overflow Topics

    C/C++ and Buffer Overflow Topics 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处.作者信息和本声明.否则将追究法律责任.http://blog.csdn. ...

  7. ORU-10027: buffer overflow, limit of 10000 bytes

    错误提示: ERROR at line 1: ORA-20000: ORU-10027: buffer overflow, limit of 1000000 bytes ORA-06512: at & ...

  8. 黄聪:buffer overflow detected问题解决及gcc-4.1安装

    报错:*** buffer overflow detected ***:  将ubuntu 9.04自带的gcc-4.3.2替换成gcc-4.1.0. 出现这个报错的背景很多,但根本是gcc版本过高或 ...

  9. PLSQL Developer 出现ORU-10027: buffer overflow, limit of 10000 bytes

    错误提示: ERROR at line 1: ORA-20000: ORU-10027: buffer overflow, limit of 1000000 bytes ORA-06512: at & ...

最新文章

  1. C语言中do...while(0)用法小结
  2. POI LastRowNum and PhysicalNumberOfRows
  3. JS判断当前使用的是哪个浏览器及其版本
  4. 阿里云史上最大技术升级:面向万物智能的飞天2.0
  5. 小程序助手多功能微信小程序反编译工具
  6. 2017.4.16 车站 思考记录
  7. 【英语学习】【WOTD】impetus 释义/词源/示例
  8. void符合c语言用户标识吗,1以下可用作C语言用户标识符的是()。void,define,.doc...
  9. 曾在阿里见证首个双11诞生,但今年作为枚青餐厅店主,我才真正成为了双11的主角...
  10. MATLAB模拟声压分布,基于Matlab仿真软件构建圆形压电晶体三维模型
  11. 艾伟:WinForm控件开发总结(三)------认识WinForm控件常用的Attribute
  12. comsol和java_COMSOL java API——编译comsol模型java文件
  13. 安装Office2010提示缺少MSXML版本6.10.1129.0的解决方法
  14. ftp扫描工具下载,ftp扫描下载工具到底该怎么选择?
  15. 小米笔记本Ruby默认开启fn键如何解决方法步骤
  16. c语言 英文课本词汇表的生成,【C/C++】词汇表生成
  17. 水仙花数python代码多种方式_水仙花数的三种解决方法(Python实现)
  18. 看到自己的朋友圈,我和我的小伙伴都惊呆了
  19. notes-Java学习指南①(快速入门)(网易云课堂)
  20. 用友增资致远1200万 国内最大OA厂商发布新品

热门文章

  1. ROS path [0]=/opt/ros/melodic/share/ros、path [1] 、path [2]
  2. result returns more than one elements 解决办法
  3. python试卷三联学院_安徽三联学院期末考试英国文学完整版
  4. 如何快速实现MindMapper分类的整理
  5. MTK介绍MTK平台介绍
  6. iOS 浏览相册功能实现 —— HERO博客
  7. 程序报错:AttributeError: module ‘cv2.cv2‘ has no attribute ‘cv2.MultiTracker_create()‘
  8. 创新之路 纪录片观后感
  9. 普通人的网页配色方案
  10. 真正的手机密码大全!(完整版)(转)