webshell检测方式深度剖析 --- Pixy系列二(数据流分析)
开篇
书接上文,这次我们来聊聊数据流分析,数据流分析的内容非常广泛,我们力求深入浅出通俗易懂,在简短的篇幅内将这一概念描述清楚。
简单来说,数据流分析是一种用来获取相关数据沿着程序执行路径流动的信息分析技术,分析对象是程序执行路径上的数据流动或数据可能的取值,最早用于编译优化过程中。由于程序数据流的某些特点和性质与程序漏洞紧密相关,比如在SQL注入漏洞中,检测系统需要知道某个变量的取值是否源自某个可信的数据源,比如在缓冲区溢出漏洞中,需要获得内存操作长度的可能取值范围来判断是否存在缓冲区溢出漏洞,所以数据流分析也成为了一种重要的漏洞分析技术。数据流分析技术除了可以直接应用于漏洞分析,对多种程序漏洞或者缺陷进行分析和检测,还可以作为漏洞分析的支撑技术,为其它漏洞分析方法提供重要的数据支持。
如前所述,数据流分析是从程序执行路径上获取相关数据信息,所以它依赖于程序的执行路径,而描述程序执行路径的最有效工具就是控制流图(control flow graph,CFG)。下面我们就先从CFG开始讲起。
控制流图
控制流图是一种有向图G = (N,E,entry,exit)。其中:
- N是节点集,每个节点对应程序中的一条语句、一个条件判断或一个控制流汇合点;
- 边集E = {<s1,s2> | s1,s2 ∈ N且s1执行后可能立即执行s2};
- entry和exit分别是控制流图的唯一入口节点和唯一出口节点;
控制流图是具有单一入口节点和出口节点的有向图。对于非单入口和单出口的程序,可以通过添加统一入口和出口的方法解决。控制流图的节点可以分为如下5类:
- entry节点:唯一的入口节点,具有0个前驱和1个后继;
- exit节点:唯一的出口节点,具有1个前驱和0个后继;
- 顺序节点:对应程序中的顺序执行语句,具有1个前驱和1个后继;
- 分支节点:对应程序中的条件判断,具有多个后继;
- 汇合节点:对应程序中的控制流汇合点,具有多个前驱;
基本块
控制流分析都是基于控制流图的基本块(BB,basic block)来进行的。基本块是程序顺序执行的语句序列,只有一个入口和一个出口,入口是其中的第一个语句,出口是其中的最后一个语句。具体而言,只有一个入口表示程序中不会有其它任何地方能通过jump跳转类指令进入此基本块,只有一个出口表示只有该基本块的最后一条语句能导致进入其它基本块去执行。只要基本块中的第一条语句被执行了,那么该基本块内的所有语句都会被执行一次。
BB1:t:=2 * xy:=t + xGoto BB2
如果从 BB1 的最后一条指令是跳转到 BB2,那么从 BB1 到 BB2 就有一条边。
一个函数(或过程)里如果包含多个基本块,可以以基本块为单位表达为一个 CFG。
数据流分析
很多代码优化的场景都使用了数据流分析技术,比如代数优化、常数折叠、删除不可达的基本块等等。接下来,我们以代码优化中的“活跃性分析”为例,来简要说明数据流分析的一般过程,最后总结出数据流分析的一个统一框架。
活跃性分析
在代码优化中,活跃性分析(Liveness Analysis)是一种静态分析技术,用于确定程序中哪些变量在某个特定点上是“活跃”的,即这些变量在该点之后的代码中仍然会被使用。我们说一个变量是活的,意思是它的值在改变前,会被其他代码读取。
活跃性分析可以帮助编译器进行一些优化,比如死代码删除。如果一个变量在其后的程序中再也不会被使用,那么这个变量就可以被认为是“死的”(dead),编译器可以直接移除这些没有实际用处的变量。
考虑上面的CFG,我们从最底下的基本块开始,倒着向前计算活跃变量的集合(也就是从基本块 5 倒着向基本块 1 计算)。这里需要注意,对基本块 1 进行计算的时候,它的输入是基本块 2 的输出,也就是{a, b, c},和基本块 3 的输出,也就是{a, c},计算结果是这两个集合的并集{a, b, c}。也就是说,基本块 1 的后序基本块,有可能用到这三个变量。这里在分支相遇时求输出的运算,即应用了之前讲过的格理论。
本质为计算上述格中两个节点的最小上界。你可能会奇怪,不就是集合运算吗?两个分支相遇,就计算它们的并集,不就可以了吗?事情没那么简单。因为并不是所有的数据流分析,每个语句计算后的结果都是一个集合,就算是集合,相交时的运算也不一定是求并集,而有可能是求交集。
基于这个分析图,我们马上发现 y 变量可以被删掉(因为它前面的活变量集合{x}不包括 y,也就是不被后面的代码所使用),并且影响到了活跃变量的集合。
删掉 y 变量以后,从下向上再继续优化一轮,会发现 d 也可以删掉。
d 删掉以后,2 号基本块里面已经没有代码了,也可以被删掉,最后的 CFG 是下面这样:
数据流分析框架
首先我们来总结一下上面的活跃性分析过程:
- 我们首先做一个从下向上的反向扫描,建立活变量的集合;
- 接着,我们从下向上分析每个活变量集合,识别出死变量,并依据它删除给死变量赋值的代码。
- 上述优化可能需要做不止一遍,才能得到最后的结果。
我们可以把上面的过程用更加形式化的方式表达出来。无论是活跃性分析,还是其它数据流分析方法,都可以看做是由下面 5个元素构成的:
- D(方向):是朝前还是朝后遍历。
- V(值):代码的每一个地方都要计算出一个值。活跃性分析的值是一个集合,也有些分析的值并不是集合,而是具体的取值。
- F(转换函数,对 V 进行转换):比如,在做活跃性分析的时候,基本块输入的活跃变量集合为{x},基本块内遇到x:=a+b,那么基本块的输出活跃变量集合变为{a,b}。这里遵守的转换规则是:因为变量x被重新赋值了,那么就从集合里,把变量x去掉,并把给x赋值的右侧表达式中用到的变量添加进集合。
- I(初始值,是算法开始时 V 的取值):在做活跃性分析的时候,初始值是后面代码中还会访问的变量,也就是活变量集合。
- Λ运算:在遇到分支的情况下,两个或多个分支相遇的时候,要做一个运算,计算他们相交的值。比如活跃性分析的场景下是求并集,其它分析可能是其它的运算。这里需要使用之前讲过的“格”理论进行计算。
总结
将数据流分析作为主要分析技术的漏洞分析系统常常具有分析速度快、精度良好等特点,因此非常适用于对大规模程序代码进行分析。
在使用数据流分析方法对程序继续分析时,我们总是一方面追求精确的分析,另一方面希望分析过程不会耗费大量的空间和时间。怎样在效率和精度上进行折中处理,是自始至终都要考虑的问题。
相关文章:
webshell检测方式深度剖析 --- Pixy系列二(数据流分析)
开篇 书接上文,这次我们来聊聊数据流分析,数据流分析的内容非常广泛,我们力求深入浅出通俗易懂,在简短的篇幅内将这一概念描述清楚。 简单来说,数据流分析是一种用来获取相关数据沿着程序执行路径流动的信息分析技术…...
[DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
文章目录 概要I Introduction小结 概要 提出的架构,双注意力U-Net与特征融合(DAU-FI Net),解决了语义分割中的挑战,特别是在多类不平衡数据集上,这些数据集具有有限的样本。DAU-FI Net 整合了多尺度空间-通…...
使用Triton部署ONNX模型
介绍 适用于各种 AI 工作负载的推理:借助 NVIDIA Triton™,在任何处理器(GPU、CPU 或其他)上,对使用基于任何框架的,经过训练的机器学习模型或深度学习模型,进行推理部署。Triton 是 NVIDIA AI…...
Python访问ElasticSearch
ElasticSearch是广受欢迎的NoSQL数据库,其分布式架构提供了极佳的数据空间的水平扩展能力,同时保障了数据的可靠性;反向索引技术使得数据检索和查询速度非常快。更多功能参见官网介绍 https://www.elastic.co/cn/elasticsearch/ 下面简单罗列…...
Flutter 混合开发 - 动态下发 libflutter.so libapp.so
背景 最近在做包体积优化,在完成代码混淆、压缩,裁剪ndk支持架构,以及资源压缩(如图片转webp、mp3压缩等)后发现安装包的中占比较大的仍是 so 动态库依赖。 具体查看发现 libflutter.so 和 libapp.so 的体积是最大的&…...
Peter算法小课堂—动态规划
Peter推荐算法书:《算法导论》 图示: 目录 钢条切割 打字怪人 钢条切割 算法导论(第四版)第十四章第一节:钢条切割 题目描述: 给定一根长度为 n 英寸的钢条和一个价格表 ,其中 i1,2,…,n …...
2022–2023学年2021级计算机科学与技术专业数据库原理 (A)卷
一、单项选择题(每小题1.5分,共30分) 1、构成E—R模型的三个基本要素是( B )。 A.实体、属性值、关系 B.实体、属性、联系 C.实体、实体集、联系 D.实体、实体…...
Clojure 实战(4):编写 Hadoop MapReduce 脚本
Hadoop简介 众所周知,我们已经进入了大数据时代,每天都有PB级的数据需要处理、分析,从中提取出有用的信息。Hadoop就是这一时代背景下的产物。它是Apache基金会下的开源项目,受Google两篇论文的启发,采用分布式的文件…...
Django 分页(表单)
目录 一、手动分页二、分页器分页 一、手动分页 1、概念 页码:很容易理解,就是一本书的页码每页数量:就是一本书中某一页中的内容(数据量,比如第二页有15行内容),这 15 就是该页的数据量 每一…...
socket实现视频通话-WebRTC
最近喜欢研究视频流,所以思考了双向通信socket,接下来我们就一起来看看本地如何实现双向视频通讯的功能吧~ 客户端获取视频流 首先思考如何获取视频流呢? 其实跟录音的功能差不多,都是查询电脑上是否有媒体设备,如果…...
simulink代码生成(九)—— 串口显示数据(纸飞机联合调试)
纸飞机里面的协议是固定的,必须按照协议配置; (1)使用EasyHEX协议,测试int16数据类型 测试串口发出的数据是否符合? 串口接收数据为: 打开纸飞机绘图侧: (1)…...
Mysql数据库(中)——增删改查的学习(全面,详细)
上一篇主要对查询操作进行了详细的总结,本篇主要对增删改操作以及一些常用的函数进行总结,包括流程控制等;以下的代码可以直接复制到数据库可视化软件中,便于理解和练习; 常用的操作: #函数: S…...
test dbtest-03-对比 Liquibase、flyway、dbDeploy、dbsetup
详细对比 Liquibase、flyway、dbDeploy、dbsetup,给出对比表格 下面是一个简要的对比表格,涵盖了 Liquibase、Flyway、dbDeploy 和 DbSetup 这四个数据库变更管理工具的一些主要特点。 特点/工具LiquibaseFlywaydbDeployDbSetup开发语言Java࿰…...
力导向图与矩阵排序
Graph-layout force directed(力导向图布局)是一种用于可视化网络图的布局算法。它基于物理模型,模拟了图中节点之间的相互排斥和连接弹性,以生成具有良好可读性和美观性的图形布局。 在力导向图布局中,每个节点被视为…...
word 常用功能记录
word手册 多行文字对齐标题调整文字间距打钩方框插入三线表插入参考文献自动生成目录 多行文字对齐 标题调整文字间距 打钩方框 插入三线表 插入一个最基本的表格把整个表格设置为无框线设置上框线【实线1.5磅】设置下框线【实线1.5磅】选中第一行,设置下框线【实线…...
C#线程基础(线程启动和停止)
目录 一、关于线程 二、示例 三、生成效果 一、关于线程 在使用多线程前要先引用命名空间System.Threading,引用命名空间后就可以在需要的地方方便地创建并使用线程。 创建线程对象的构造方法中使用了ThreadStart()委托,当线程开始执行时,…...
如何利用ChatGPT来提高编程效率
如何利用ChatGPT来提高编程效率 在当今这个信息爆炸和技术快速发展的时代,程序员们面临着巨大的压力,既要保证代码的质量,又要提高工作效率。幸运的是,人工智能(AI)正在改变我们编写和维护代码的方式,而OpenAI的ChatGPT是其中的佼佼者。本文将讨论如何利用ChatGPT以及结合…...
java智慧工地源码,互联网+建筑工地,实现对工程项目内人员、车辆、安全、设备、材料等的智能化管理
智慧工地全套源码,微服务JavaSpring Cloud UniApp MySql;支持多端展示(大屏端、PC端、手机端、平板端)演示自主版权。 智慧工地概念: 智慧工地就是互联网建筑工地,是将互联网的理念和技术引入建筑工地&…...
创建并使用自己的C++模块(Windows10+MSVC)
module是C20种新引入的特性,关于module的介绍和好处,网上已有大量的文章,此处也不再赘述,本文仅记录在个人的环境上创建一个简单的module并使用这个module。 环境同上一篇文章( windows10,MSVC C工具链&am…...
Spring Boot 2.7.11 集成 GraphQL
GraphQL介绍 GraphQL(Graph Query Language)是一种用于API的查询语言和运行时环境,由Facebook于2012年创建并在2015年公开发布。与传统的RESTful API相比,GraphQL提供了更灵活、高效和强大的数据查询和操作方式。 以下是GraphQL…...
软件工程期末总结
软件工程期末总结 软件危机出现的原因软件生命周期软件生命周期的概念生命周期的各个阶段 软件开发模型极限编程 可行性研究与项目开发计划需求分析结构化分析的方法结构化分析的图形工具软件设计的原则用户界面设计结构化软件设计面向对象面向对象建模 软件危机出现的原因 忽视…...
MidTool图文创作-GPT-4与DALL·E 3的结合
GPT-4与DALLE 3的结合 GPT-4是由OpenAI开发的最新一代语言预测模型,它在前代模型的基础上进行了大幅度的改进,不仅在文本生成的连贯性、准确性上有了显著提升,还在理解复杂语境和执行多步骤指令方面表现出了更高的能力。而DALLE 3则是一个创…...
Python将两个或多个列表合并为一个列表,并根据每个输入列表中的元素的位置将其组合在一起
将两个或多个列表合并为一个列表,并根据每个输入列表中的元素的位置将其组合在一起。 这个需求在实际开发过程中应该说非常常见,当然python也给我们内置了相关方法! zip(*iterables, strictFalse) 在多个迭代器上并行迭代,从每…...
数模混合SoC芯片中LEF2Milkyway的golden flow
在数模混合芯片中的项目中,特别是数字模块很少甚至只有一个简单的数字控制逻辑时,我们要做数字模块的后端实现时,通常模拟那边会问我们实现需要他们提供哪些数据。 通常来说,我们可以让模拟设计提供数字模块的GDS或LEF文件即可。…...
Five tips to make your essay flow
This post was written by Sydney Nicholson, a second-year master’s student in the English Department. Dear writer, Have you ever wondered what it takes to make an essay “flow”? In my time as a writing center tutor, I’ve noticed that this is one of th…...
linux驱动(二):led补
本文主要探讨s5pv210的led驱动相关知识,包括驱动主次设备注册和取消,udev(mdev)机制,静态和动态映射操作寄存器。 字符设备驱动注册 老接口(register_chrdev) static inline int register_chrdev(unsigned int major, const char *n…...
性能测试-jmeter:安装 / 基础使用
一、理解jmeter 官网-Apache JMeter-Apache JMeter™ JMeter是一款开源的性能测试工具,主要用于模拟大量用户并发访问目标服务器,以评估服务器的性能和稳定性。 JMeter可以执行以下任务序号用途描述1性能测试通过模拟多个用户在同一时间对服务器进行请…...
数据仓库-数仓优化小厂实践
一、背景 由于公司规模较小,大数据相关没有实现平台化,相关的架构都是原生的Apache组件,所以集群的维护和优化都需要人工的参与。根据自己的实践整理一些数仓相关的优化。 二、优化 1、简易架构图 2、ODS层优化 2.1 分段式解析 随着业务增长…...
uniapp中uview组件丰富的Code 验证码输入框的使用方法
目录 基本使用 #自定义提示语 #保持倒计时 API #Props #Methods #Event 基本使用 通过ref获取组件对象,再执行后面的操作,见下方示例。 通过seconds设置需要倒计的秒数(默认60)通过ref调用组件内部的start方法,开始倒计时通过监听cha…...
md文件图片上传方案:Github+PicGo 搭建图床
文章目录 1. PicGo 下载2. 配置Github3. 配置PicGo4. PicGo集成Typora4.1 picGo监听端口设置 5. 测试 1. PicGo 下载 下载地址:https://molunerfinn.com/PicGo/ 尽量下载稳定版本 2. 配置Github 1. 创建一个新仓库,用于存放图片 2. 生成一个token&a…...
网络科技有限公司官网/2021百度seo
主板BIOS导致安装系统失败安全教程来源:华强电子网作者:华仔浏览:465时间:2017-08-05 10:14标签:摘要:内容: 一天,朋友打电话来说他的爱机装不上Windows 2000了,不是死机…...
网站改版 合同/沈阳百度seo排名优化软件
#正则表达式select * from employee where name like jin%;select * from employee where name regexp ^jin;select * from employee where name regexp ^jin.*(g|n)$; 转载于:https://www.cnblogs.com/FlFtFw/p/9544251.html...
深圳好的网站建设公司/网络外包
ospf全称:OSPF ( Open Shortest Path First )开放式最短路径优先OSPF 知识点:OSPF 基本配置,OSPF 5 种报文 ,7种邻居状态,4 种网络类型,4 种特殊区域,7类LSA,4 种 link type…...
有哪些可以免费做视频的网站/整站排名服务
本文的内容是我的开源代码(https://github.com/e10101/AdminLogin)的中文说明。项目主要是实现了通过合理配置Nginx的auth_request模块来实现对敏感路径下的内容进行访问限制。 代码 可通过Github访问:https://github.com/e10101/AdminLogin&…...
平面设计类的网站/友情链接买卖
SQLite分页显示:Select * From news order by id desc Limit 10 Offset 10这篇文章是根据 SQLite 官方 WIKI 里的内容翻译,如果有什么翻译不当的地方希望大家指出,毕竟我的英文水平实在很差。 SQLite 包括以下五个时间函数: date(…...
网站的风格有哪些/简述优化搜索引擎的方法
PHP有干扰线噪点的验证码类PHP#验证码 #类2012-06-06 08:35验证码类代码:/* 一个网在线教程 http://yige.org */class Captcha{private $width;private $height;private $codeNum;private $code;private $im;function __construct($width80, $height20, $codeNum4){…...