webshell检测方式深度剖析 --- Pixy系列二(数据流分析)

news2025/1/13 8:01:33

开篇

书接上文,这次我们来聊聊数据流分析,数据流分析的内容非常广泛,我们力求深入浅出通俗易懂,在简短的篇幅内将这一概念描述清楚。

简单来说,数据流分析是一种用来获取相关数据沿着程序执行路径流动的信息分析技术,分析对象是程序执行路径上的数据流动或数据可能的取值,最早用于编译优化过程中。由于程序数据流的某些特点和性质与程序漏洞紧密相关,比如在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 * x
  y:=t + x
  Goto 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 的取值):在做活跃性分析的时候,初始值是后面代码中还会访问的变量,也就是活变量集合。
  • Λ运算:在遇到分支的情况下,两个或多个分支相遇的时候,要做一个运算,计算他们相交的值。比如活跃性分析的场景下是求并集,其它分析可能是其它的运算。这里需要使用之前讲过的“格”理论进行计算。

总结

将数据流分析作为主要分析技术的漏洞分析系统常常具有分析速度快、精度良好等特点,因此非常适用于对大规模程序代码进行分析。

在使用数据流分析方法对程序继续分析时,我们总是一方面追求精确的分析,另一方面希望分析过程不会耗费大量的空间和时间。怎样在效率和精度上进行折中处理,是自始至终都要考虑的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1351203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何移除视频中的背景音乐或人物声音

移除视频声音是将视频指定的声音移除&#xff0c;可以选择移除人物声音还是视频的背景音乐&#xff0c;方便实现二次创作。 小编给大家推荐一些方法帮助大家更轻松地移除视频中的背景音乐或人物声音&#xff0c;有兴趣的朋友请自行百度查找&#xff0c;或小程序查找 1、方法&a…

autograd与逻辑回归

一、autograd—自动求导系统 torch.autograd.backward() torch.autograd.backward()是PyTorch中用于计算梯度的函数。以下是对该函数的参数的解释&#xff1a; 功能&#xff1a;自动求取梯度 • tensors: 用于求导的张量&#xff0c;如 loss • retain_graph : 保存计算图 •…

密码学:带密钥的消息摘要算法一数字签名算法

文章目录 前言手写签名和数字签名前置知识点&#xff1a;消息摘要算法数字签名算法数字签名算法的由来数字签名算法在实际运用的过程附加&#xff1a;签名和摘要值的解释 数字签名算法的家谱数字签名算法的消息传递模型经典数字签名算法-RSA实现 数字签名标准算法-DSA实现 圆曲…

汽车架构解析:python cantools库快速解析arxml

文章目录 前言一、安装cantools二、官方说明文档三、cantools方法1、解析message的属性2、解析pdu中的signals3、根据message查找signals4、报文组成bytes 总结 前言 曾经有拿cantools来解析过dbc&#xff0c;用得比较浅&#xff0c;不知道可以用来解析arxml。最近有个需求需要…

Linux安装nginx(带http ssl)

nginx安装 nginx文件 以及gcc pcre zlib openssl 网盘下载 1.安装gcc yum -y install gcc gcc-c 2.安装pcre rpm -ivh pcre-8.32-17.el7.x86_64.rpm --force --nodeps rpm -ivh pcre-devel-8.32-17.el7.x86_64.rpm --force --nodeps 3.安装zlib tar -zxvf zlib-1.2.11.ta…

mfc100u.dll文件丢失,有五种不同解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到mfc100u.dll文件”。那么&#xff0c;mfc100u.dll文件到底是什么&#xff1f;为什么会出现丢失的情况&#xff1f;本文将详细介绍mfc100u.dll文件的作用以及丢失的原因&#xff0c;并…

冒泡排序-排序算法

前言 如果有6个人站成一排&#xff0c;要将他们按从矮到高的顺序排列。你可能有多种方式来完成。但是如果其中有一个人特别高&#xff0c;比他身边的人高&#xff0c;在队伍中特别明显&#xff0c;你可以轻易看出那个最高的需要和身边的人交换位置&#xff0c;这是冒泡排序的核…

服务器硬件及RAID磁盘阵列详解

文章目录 一、服务器硬件服务器常见故障 二、RAID磁盘阵列详解1、RAID磁盘阵列概述2、RAID 0(条带化存储)3、RAID 1&#xff08;镜像存储&#xff09;4、RAID 55、RAID 66、RAID 10&#xff08;先做镜像&#xff0c;再做条带&#xff09;7、RAID 01&#xff08;先做条带&#x…

计算机视觉 - 了解Mosaic数据增强

一、简述 数据增强包含各种扩展和增强机器学习和深度学习模型数据集的技术。这些方法跨越不同的类别,每种方法都会改变数据以引入多样性并提高模型的稳健性。几何变换(例如旋转、平移、缩放和翻转)会修改图像方向和结构。颜色和对比度调整会改变图像外观,包括亮度、对比度和…

贪心算法part04 860柠檬水找零 406根据身高重建队列

860 柠檬水找零 406 根据身高重建队列 452 用最少数量的箭引爆气球

使用ffmpeg实现视频裁剪并保持清高晰度

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg -i source.mp4 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-…

Redis集群架构解密:打造高性能分布式缓存引擎

目录 1、前言 2、Redis集群概述 3、Redis集群架构的内部原理 4、Redis集群的实现方式 5、Redis集群的实现方式如何选择 6、Redis集群的搭建 7、结语 1、前言 在当今的互联网时代&#xff0c;随着用户数量的不断增长和业务流量的不断增加&#xff0c;对于高性能的缓存系…

线性代数笔记3 1.1

学习视频&#xff1a; 2.2 矩阵运算&#xff08;二&#xff09;_哔哩哔哩_bilibili 包括内容&#xff1a; p10矩阵运算&#xff08;二&#xff09; p11特殊矩阵 p12逆矩阵&#xff08;一&#xff09; p13逆矩阵&#xff08;二&#xff09;

Oracle 日志路径查询介绍

数据库日志分析详解&#xff1a;  ORACEL RAC 体系架构分析  Oracle RAC 包含GI(Grid Infrastructure) 集群软件与Oracle数据库组成。  GI包含两个最主要的组件&#xff1a;Clusterware集群软件和ASM存储软件&#xff0c;这两个软件提供数据库高可用能力。  …

通过CANopen转Modbus TCP网关的伺服系统

通过开疆CANopen转Modbus TCP网关的伺服系统&#xff0c;我们能够实现CANopen协议与Modbus TCP协议之间的无缝转换&#xff0c;从而为伺服电机的通讯和控制带来更大的便利和灵活性。 首先我们可以通过CANopen协议与伺服电机进行通讯。CANopen协议是一种先进的、高效的通讯协议&…

​iOS实时查看App运行日志

目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 &#x1f4dd; 摘要&#xff1a; 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具&#xff0c;我们可以连接手机并方便地筛选我们自己App的日志。 &#x1f4…

霹雳吧啦Wz《pytorch图像分类》-p4GoogLeNet网络

《pytorch图像分类》p4GoogLeNet网络详解 一、GoogLeNet网络中的亮点1.inception结构2.使用11的卷积核进行降维及映射处理3.GoogLeNet辅助分类器4.模型参数 二、模块代码1.BasicConv2d2.Inception 三、课程代码1.module.py2.train.py3.predict.py 一、GoogLeNet网络中的亮点 论…

Springcloud 微服务实战笔记 Ribbon

使用 Configurationpublic class CustomConfiguration {BeanLoadBalanced // 开启负载均衡能力public RestTemplate restTemplate() {return new RestTemplate();}}可看到使用Ribbon&#xff0c;非常简单&#xff0c;只需将LoadBalanced注解加在RestTemplate的Bean上&#xff0…

Django 分页(表单)

目录 一、手动分页二、分页器分页 一、手动分页 1、概念 页码&#xff1a;很容易理解&#xff0c;就是一本书的页码每页数量&#xff1a;就是一本书中某一页中的内容&#xff08;数据量&#xff0c;比如第二页有15行内容&#xff09;&#xff0c;这 15 就是该页的数据量 每一…

将 Python 和 Rust 融合在一起,为 pyQuil® 4.0 带来和谐

文章目录 前言设定方向从 Rust 库构建 Python 软件包改装 pyQuil异步困境回报&#xff1a;功能和性能结论 前言 pyQuil 一直是在 Rigetti 量子处理单元&#xff08;QPUs&#xff09;上构建和运行量子程序的基石&#xff0c;通过我们的 Quantum Cloud Services&#xff08;QCS™…