BinAbsInspector部署、使用与原理分析

文章目录

  • 前言
  • 1、概述
  • 2、安装与使用
    • 2.1、源码安装
      • 2.1.1、部署系统依赖组件
        • 2.1.1.1、部署基础依赖组件
        • 2.1.1.2、部署Ghidra 11.0.3
          • 2.1.1.2.1、部署JDK 17
          • 2.1.1.2.2、部署Gradle 7.4.2
          • 2.1.1.2.3、部署Ghidra 11.0.3
        • 2.1.1.3、部署Z3 4.8.15
      • 2.1.2、使用源码安装系统
    • 2.2、使用方法
      • 2.2.1、准备测试程序
      • 2.2.2、创建Ghidra项目
      • 2.2.3、使用BinAbsInspector检测CWE漏洞
  • 3、测试用例
    • 3.1、检测CWE-190漏洞
    • 3.2、检测CWE-416漏洞
    • 3.3、检测CWE-787漏洞
  • 4、总结
    • 4.1、部署架构
    • 4.2、具体功能
    • 4.3、实现方法
  • 5、参考文献
  • 总结


前言

  本博客的主要内容为BinAbsInspector的部署、使用与原理分析。本博文内容较长,因为涵盖了BinAbsInspector的几乎全部内容,从部署的详细过程到如何使用BinAbsInspector进行漏洞检测,以及对BinAbsInspector进行漏洞检测的原理分析,相信认真读完本博文,各位读者一定会对BinAbsInspector有更深的了解。以下就是本篇博客的全部内容了。


1、概述

  BinAbsInspector是一个用于二进制静态分析的工具,旨在自动化地进行反向工程并扫描二进制文件中的漏洞。它是一个长期的研究项目,由Keenlab孵化而来。BinAbsInspector基于经典的程序分析理论“抽象解释”,并利用Ghidra提供的中间表示Pcode进行分析。与传统的基于汇编代码的静态分析工具不同,BinAbsInspector工作于Pcode层面,支持x86、x64、armv7和aarch64等多种架构的二进制文件。BinAbsInspector的设计思想主要包括以下几个方面:

  • 抽象解释理论:BinAbsInspector的设计思想源自于上世纪70年代诞生的经典程序分析理论“抽象解释”,通过对程序行为进行抽象估算,从而实现对程序的静态分析。
  • Pcode分析:BinAbsInspector利用Ghidra提供的Pcode作为分析的基础,通过对Pcode的操作语义进行抽象和分析,实现了对程序行为的模拟和推断。
  • 抽象域和运算:BinAbsInspector设计了合适的抽象域和运算,完成了Pcode的操作语义,实现了流敏感和上下文敏感的过程间分析,同时加入了静态污点分析的能力。
  • 抽象环境和KSet:BinAbsInspector将程序的运行时环境划分为不同的抽象区域,并记录了程序点可能存活的抽象变量和对应的抽象值,使用了KSet来处理抽象变量可能的多个取值情况。
  • 上下文感知和不动点计算:BinAbsInspector在分析过程中考虑了上下文的影响,并采用了不动点计算的算法来完成程序的静态分析。

  通过以上设计,BinAbsInspector能够对二进制程序进行全面的静态分析,包括内存破坏漏洞、命令注入漏洞等多种漏洞的检测,为软件安全提供了有效的辅助手段。此外BinAbsInspector工具基于Java语言开发。

2、安装与使用

软件环境硬件环境约束条件
Ubuntu 22.04.1 LTS(内核版本5.15.0-43-generic)使用2个处理器,每个处理器2个内核,共分配4个内核BinAbsInspector v0.1
具体的软件环境可见“2.1、源码安装”章节所示的软件环境内存8GB具体的约束条件可见2.1、源码安装章节所示的软件版本约束
暂无硬盘200GB暂无
暂无BinAbsInspector部署在VMware Pro 17上的Ubuntu 22.04.1系统上(主机系统为Windows 11),硬件环境和软件环境也是对应的VMware Pro 17的硬件环境和软件环境暂无

2.1、源码安装

2.1.1、部署系统依赖组件

2.1.1.1、部署基础依赖组件

  执行如下命令来下载安装一些基础依赖组件。

$ sudo apt-get update
$ sudo apt-get install make -y
$ sudo apt-get install gcc -y
$ sudo apt-get install g++ -y
$ sudo apt-get install git -y
$ sudo apt install python3-pip -y
2.1.1.2、部署Ghidra 11.0.3

  Ghidra是由美国国家安全局研究局创建和维护的软件逆向工程(SRE)框架。该框架包括一套功能完整、高端的软件分析工具,使用户能够分析包括Windows、MacOS和Linux在内的各种平台上的编译代码。其功能包括反汇编、汇编、反编译、图形化和脚本编写,以及数百种其他功能。Ghidra支持各种处理器指令集和可执行格式,并可以在用户交互和自动化模式下运行。用户还可以使用Java或Python开发自己的Ghidra扩展组件和/或脚本。

  为支持美国国家安全局的网络安全任务,Ghidra被打造成解决复杂的SRE工作中的扩展性和团队合作问题,并提供可定制和可扩展的SRE研究平台。国家安全局已将Ghidra SRE功能应用于各种涉及分析恶意代码并为寻求更好了解网络和系统潜在漏洞的SRE分析人员提供深入见解的问题中。以下就是部署Ghidra的全部流程。

2.1.1.2.1、部署JDK 17

  JDK 17是Java开发工具包(Java Development Kit)的第17个版本,是由Oracle Corporation开发和发布的。它包括了Java编程语言的最新功能、改进和更新,以及相关的开发工具和库。JDK 17是Java的长期支持版本(LTS),为开发人员提供稳定性和可靠性,支持各种平台和应用场景。以下是部署JDK 17的全部流程。

  1. 首先来到当前用户的根目录,并下载JDK 17的压缩包:
$ cd ~
$ wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
  1. 然后将其解压,并将解压后的内容移动到“/usr/local/”目录中:
$ tar -zxvf jdk-17_linux-x64_bin.tar.gz
$ sudo mv jdk-17.0.11/ /usr/local/
  1. 然后配置环境变量:
$ sudo gedit /etc/profile
  1. 在打开的文件中,做如下图红框和红箭头处所示的修改,最后保存修改后退出:
    在这里插入图片描述

  2. 然后执行如下命令来使修改生效:

$ source /etc/profile
  1. 然后执行如下命令来查看JDK 17是否部署成功:
$ java --version
  1. 可以发现,JDK 17部署成功:
    在这里插入图片描述
2.1.1.2.2、部署Gradle 7.4.2

  Gradle是一种现代化的构建工具,用于自动化构建、测试和部署软件项目。它基于Groovy和Kotlin语言,采用了声明式的DSL(领域特定语言)语法,使得构建脚本更易于编写和维护。Gradle支持多项目构建、依赖管理、增量构建等功能,被广泛应用于Java、Android和其他各种类型的项目中。以下就是部署Gradle 7.4.2的全部流程了。

  1. 首先来到当前用户的根目录中,并下载Gradle的压缩包,最后将其解压:
$ cd ~
$ wget -c https://services.gradle.org/distributions/gradle-7.4.2-bin.zip -P /tmp
$ sudo unzip -d /opt/gradle /tmp/gradle-7.4.2-bin.zip
  1. 然后打开以下文件以设置环境变量:
$ sudo gedit /etc/profile.d/gradle.sh
  1. 在打开的文件中,输入如下内容,最后保存修改后退出:
export GRADLE_HOME=/opt/gradle/gradle-7.4.2
export PATH=${GRADLE_HOME}/bin:${PATH}
  1. 然后赋予上面配置的文件的权限,并将其中的环境变量加载:
$ sudo chmod +x /etc/profile.d/gradle.sh
$ source /etc/profile.d/gradle.sh
  1. 然后使用如下命令查看Gradle 7.4.2是否部署成功:
$ gradle --version
  1. 可以发现,Gradle 7.4.2已经部署成功了:
    在这里插入图片描述
2.1.1.2.3、部署Ghidra 11.0.3

  当我们做完以上的准备工作后,就可以来部署Ghidra 11.0.3了。以下就是部署Ghidra 11.0.3的全部流程。

  1. 首先来到当前用户的根目录中,并下载Ghidra 11.0.3的源代码,最后进入其目录中:
$ cd ~
$ git clone https://github.com/NationalSecurityAgency/ghidra.git
$ cd ghidra/
  1. 然后加载依赖项到存储库中:
$ gradle -I gradle/support/fetchDependencies.gradle init
  1. 然后使用Gradle 7.4.2构建Ghidra 11.0.3:
$ gradle buildGhidra
  1. 出现如下图所示的内容,即代表Ghidra 11.0.3部署成功:
    在这里插入图片描述

  2. 然后来到如下目录中,该目录就存储了构建Ghidra 11.0.3的结果,并将构建结果解压:

$ cd ~/ghidra/build/dist/
$ unzip ghidra_11.1_DEV_20240428_linux_x86_64.zip
  1. 然后查看一下解压后的结果:
$ ll
  1. 可以发现,如下图红框和红箭头处所示的内容就是我们构建Ghidra 11.0.3的最终结果:
    在这里插入图片描述

  2. 然后来到构建好的目录中,赋予对应脚本的执行权限:

$ cd ghidra_11.1_DEV/
$ chmod +x ghidraRun
$ chmod +x support/launch.sh
  1. 然后执行如下命令来启动Ghidra。后续都来到该目录中使用该命令启动Ghidra,不再赘述:
$ ./ghidraRun
  1. 然后按如下图所示进行选择:
    在这里插入图片描述

  2. 然后会出现如下图所示的界面,稍等即可:
    在这里插入图片描述

  3. 然后按如下图所示进行选择:
    在这里插入图片描述

  4. 然后就会来到Ghidra的主界面,这就代表我们已经将Ghidra部署成功了。后续若要使用Ghidra,均按照这些步骤将其启动,不再赘述:
    在这里插入图片描述

2.1.1.3、部署Z3 4.8.15

  Z3是由微软研究院开发的一款强大的自动定理证明器,用于解决数学逻辑、计算机科学和软件工程领域的问题。它能够自动判断给定的一阶逻辑公式是否成立,并且可以求解一些复杂的约束问题,如整数线性规划、位向量运算等。Z3广泛应用于程序分析、形式验证、符号执行、模型检测等领域,被认为是当今最先进的自动定理证明器之一。以下是部署Z3 4.8.15的全部流程:

  1. 首先来到当前用户根目录中,并下载Z3 4.8.15的预构建包,最后将其解压:
$ cd ~
$ wget https://github.com/Z3Prover/z3/releases/download/z3-4.8.15/z3-4.8.15-x64-glibc-2.31.zip
$ unzip z3-4.8.15-x64-glibc-2.31.zip
  1. 然后执行如下命令,将目标目录中的所有以“.so”结尾的文件都拷贝到“/usr/local/lib/”目录和“/lib”中:
$ sudo cp z3-4.8.15-x64-glibc-2.31/bin/*.so /usr/local/lib/
$ sudo cp z3-4.8.15-x64-glibc-2.31/bin/*.so /lib
  1. 然后编辑如下文件来设置对应的环境变量:
$ gedit ~/.bashrc
  1. 在打开的文件的末尾添加如下内容,最后保存修改后退出:
    在这里插入图片描述

  2. 然后执行如下命令重新加载设置好的环境变量:

$ source ~/.bashrc
  1. 然后执行如下命令来验证Z3 4.8.15是否部署成功:
$ z3 --version
  1. 可以发现,Z3 4.8.15已经部署成功:
    在这里插入图片描述

2.1.2、使用源码安装系统

  当我们部署完系统的依赖组件后,就可以来正式使用源代码部署BinAbsInspector了,下面就是使用源代码部署BinAbsInspector的全部流程。

  1. 首先来到当前用户的根目录中,并下载BinAbsInspector的源代码,最后进入其目录中:
$ cd ~
$ git clone https://github.com/KeenSecurityLab/BinAbsInspector.git
$ cd BinAbsInspector/
  1. 然后执行如下命令来构建BinAbsInspector:
$ gradle buildExtension
  1. 最后出现如下图所示的内容,即代表BinAbsInspector构建成功:
    在这里插入图片描述

  2. 然后来到如下目录中,该目录就存储了构建BinAbsInspector的结果,并将构建结果解压:

$ cd ~/BinAbsInspector/dist/
$ unzip ghidra_11.1_DEV_20240428_BinAbsInspector.zip 
  1. 然后查看一下解压后的结果:
$ ll
  1. 可以发现,如下图红框和红箭头处所示的内容就是我们构建BinAbsInspector的最终结果:
    在这里插入图片描述

  2. 然后我们将构建好的BinAbsInspector作为拓展安装到Ghidra中,首先按照“2.1.1.2.3、部署Ghidra 11.0.3”章节所示的内容启动Ghidra:

$ cd ~/ghidra/build/dist/ghidra_11.1_DEV/
$ ./ghidraRun
  1. 然后按如下图所示进行选择:
    在这里插入图片描述

  2. 然后按如下图所示进行选择:
    在这里插入图片描述

  3. 然后选择之前构建好的BinAbsInspector目录,并将其导入:
    在这里插入图片描述

  4. 然后按如下图所示进行选择:
    在这里插入图片描述

  5. 然后按如下图所示进行选择:
    在这里插入图片描述

  6. 然后关闭Ghidra,再将其重新打开:

$ cd ~/ghidra/build/dist/ghidra_11.1_DEV/
$ ./ghidraRun
  1. 然后按如下图所示进行选择:
    在这里插入图片描述

  2. 然后按如下图所示进行选择,可以发现,我们之前构建好的BinAbsInspector已经被加载到Ghidra中了。此时我们就将BinAbsInspector部署完毕了:
    在这里插入图片描述

  注:实际执行中遇到的问题及解决方法

  A 问题1:

  1. 在步骤2构建BinAbsInspector的时候,可以会出现如下图所示的问题:
    在这里插入图片描述

  2. 出现该问题是因为我们没有配置Ghidra的环境变量,为了解决该问题,我们首先打开Shell配置文件:

$ gedit ~/.bashrc
  1. 在打开的文件的最后一行添加如下图所示的内容(此处设置的目录就是在“2.1.1.2.3、部署Ghidra 11.0.3”章节中最终构建出的Ghidra 11.0.3目录),然后保存修改后退出:
    在这里插入图片描述

  2. 然后执行如下命令使刚才的配置生效:

source ~/.bashrc
  1. 此时我们就解决了该问题,我们只需要回到步骤2重新继续向下操作即可

2.2、使用方法

2.2.1、准备测试程序

  1. 首先写一个测试程序:
$ cd ~
$ touch test.c
$ gedit test.c
  1. 在打开的文件中输入如下内容,这段程序的CWE编号为134,我们看使用BinAbsInspector是否能检测出该CWE编号为134,然后保存修改后退出:
#include <stdio.h>int main(int argc, char **argv){char buf[128];snprintf(buf,128,argv[1]);return 0;
}
  1. 然后对以上内容进行编译,并执行编译后的二进制程序:
$ gcc ./test.c -o test
$ ./test
  1. 发现测试程序可以成功执行(没报错就代表成功执行了):
    在这里插入图片描述

2.2.2、创建Ghidra项目

  1. 首先来到构建好的Ghidra的目录中,执行对应脚本启动Ghidra:
$ cd ~/ghidra/build/dist/ghidra_11.1_DEV/
$ ./ghidraRun
  1. 然后按照如下图所示进行选择,以创建一个新的项目:
    在这里插入图片描述

  2. 然后按如下图所示进行选择:
    在这里插入图片描述

  3. 然后设置项目存储路径以及项目名称:
    在这里插入图片描述

  4. 此时项目就被创建成功了:
    在这里插入图片描述

  5. 然后按照如下图所示进行选择,以导入测试文件:
    在这里插入图片描述

  6. 然后选择刚刚编译好的测试文件导入:
    在这里插入图片描述

  7. 然后开始使用Ghidra对其进行反汇编:
    在这里插入图片描述

  8. 然后按如下图所示进行选择:
    在这里插入图片描述

  9. 可以发现,测试文件已经成功导入到Ghidra中了,并对其进行了反汇编:
    在这里插入图片描述

2.2.3、使用BinAbsInspector检测CWE漏洞

  1. 首先双击打开之前得到的反汇编结果:
    在这里插入图片描述

  2. 然后会出现如下图所示的界面,我们按照如下图所示进行选择,对测试文件进行分析:
    在这里插入图片描述

  3. 然后使用默认分析配置对其进行分析:
    在这里插入图片描述

  4. 最终的分析结果如下图所示:
    在这里插入图片描述

  5. 然后按照如下图所示进行选择,开始准备使用BinAbsInspector对测试文件进行漏洞检测:
    在这里插入图片描述

  6. 然后找到我们导入的BinAbsInspector,对其双击,以使用BinAbsInspector对测试文件进行分析:
    在这里插入图片描述

  7. 然后会出现如下图所示的内容,在这里我们使用默认配置对测试文件进行漏洞检测即可:
    在这里插入图片描述

  8. 稍等一下,对CWE漏洞的扫描就完成了。可以发现,本次扫描发现了一个CWE漏洞:
    在这里插入图片描述

  9. 可以发现,BinAbsInspector可以检测出测试代码中的CWE-134漏洞,并且打印了详细信息,即警告显示有一个潜在的外部控制的格式字符串问题,可能导致安全漏洞。警告信息指出,该问题出现在将argv作为源传递给了snprintf()函数。此外,还将有问题的代码片段使用红色标注了:
    在这里插入图片描述

3、测试用例

  BinAbsInspector官方给我们提供了很多的测试用例,并且包含多种架构,如X86_64、ARM32LE和AARCH64LE等。我们可以将官方提供的这些测试用例下载到本地进行测试。

$ cd ~
$ git clone https://github.com/KeenSecurityLab/BinAbsInspector-binaries.git
$ cd BinAbsInspector-binaries/
$ ll

  可以发现,这里存在诸多架构的测试用例。由于我们的系统版本为X86_64,所以我们使用X86_64版本的测试用例进行下面的测试。

在这里插入图片描述

  我们首先进入这个名为“X86_64”的目录查看一下该架构的测试用例都有哪些,查看是否满足我们的测试要求。

$ cd X86_64/
$ ll

  可以发现,每个测试用例对应一类漏洞或者CWE,并且标注了CWE编号,下面我们就将使用BinAbsInspector对这些存在漏洞的测试用例进行测试。

在这里插入图片描述

3.1、检测CWE-190漏洞

  CWE190指整数溢出漏洞或环绕漏洞。这种漏洞发生在程序尝试将超出整数类型范围的值分配给变量时。攻击者可以利用这个漏洞来改变程序的行为,导致未预期的结果,例如越界访问数组或拒绝服务。以下是使用BinAbsInspector对该漏洞进行检测的具体步骤。

  1. 首先按照“2.2.2、创建Ghidra项目”章节所述的步骤创建一个名为“CWE-190”的Ghidra项目:
    在这里插入图片描述

  2. 然后再按照“2.2.2、创建Ghidra项目”章节所述的步骤将刚刚准备好的名为“cwe_190_x64_gcc.out”的测试用例导入到该Ghidra项目中:
    在这里插入图片描述

  3. 然后再按照“2.2.3、使用BinAbsInspector检测CWE漏洞”章节所述的步骤对该测试文件进行漏洞检测:
    在这里插入图片描述

  4. 稍等一下,对CWE漏洞的扫描就完成了。可以发现,本次扫描发现了六个CWE漏洞:
    在这里插入图片描述

  5. 可以发现,BinAbsInspector可以检测出测试代码中的CWE-190(六个CWE漏洞的编号都为190)漏洞,并且打印了详细信息,此外还将有问题的代码片段使用红色标注了:
    在这里插入图片描述

3.2、检测CWE-416漏洞

  CWE416指释放后继续使用漏洞。这种漏洞发生在程序尝试在释放内存后继续引用该内存区域时。攻击者可以利用这个漏洞来执行任意代码,可能导致程序崩溃或被入侵。以下是使用BinAbsInspector对该漏洞进行检测的具体步骤。

  1. 首先按照“2.2.2、创建Ghidra项目”章节所述的步骤创建一个名为“CWE-416”的Ghidra项目:
    在这里插入图片描述

  2. 然后再按照“2.2.2、创建Ghidra项目”章节所述的步骤将刚刚准备好的名为“cwe_416_x64_gcc.out”的测试用例导入到该Ghidra项目中:
    在这里插入图片描述

  3. 然后再按照“2.2.3、使用BinAbsInspector检测CWE漏洞”章节所述的步骤对该测试文件进行漏洞检测:
    在这里插入图片描述

  4. 稍等一下,对CWE漏洞的扫描就完成了。可以发现,本次扫描发现了三个CWE漏洞:
    在这里插入图片描述

  5. 可以发现,BinAbsInspector可以检测出测试代码中的CWE-416(三个CWE漏洞的编号都为416)漏洞,并且打印了详细信息,此外还将有问题的代码片段使用红色标注了:
    在这里插入图片描述

3.3、检测CWE-787漏洞

  CWE787指缓冲区溢出(越界写入)漏洞。这种漏洞发生在程序尝试向数组或缓冲区写入超出其边界的数据时。攻击者可以利用这个漏洞来修改关键数据,执行任意代码,或导致程序崩溃。以下是使用BinAbsInspector对该漏洞进行检测的具体步骤。

  1. 首先按照“2.2.2、创建Ghidra项目”章节所述的步骤创建一个名为“CWE-787”的Ghidra项目:
    在这里插入图片描述

  2. 然后再按照“2.2.2、创建Ghidra项目”章节所述的步骤将刚刚准备好的名为“cwe_787_x64_gcc.out”的测试用例导入到该Ghidra项目中:
    在这里插入图片描述

  3. 然后再按照“2.2.3、使用BinAbsInspector检测CWE漏洞”章节所述的步骤对该测试文件进行漏洞检测:
    在这里插入图片描述

  4. 稍等一下,对CWE漏洞的扫描就完成了。可以发现,本次扫描发现了两个CWE漏洞:
    在这里插入图片描述

  5. 可以发现,BinAbsInspector可以检测出测试代码中的CWE-787(两个CWE漏洞的编号都为787)漏洞,并且打印了详细信息,此外还将有问题的代码片段使用红色标注了:
    在这里插入图片描述

4、总结

4.1、部署架构

  // TODO

4.2、具体功能

  经过以上的学习,我们清楚了BinAbsInspector做一个用于二进制静态分析的工具,可以自动化的对目标二进制进行反向功能并对其进行漏洞扫描,但是BinAbsInspector究竟可以对哪些类型的漏洞进行扫描呢?为了解决该问题,故对BinAbsInspector进行分析,并将其可以检测的CWE类型做如下总结。

  • CWE78 (OS Command Injection):操作系统命令注入
    当应用程序未正确验证或过滤用户输入时,攻击者可以利用这个漏洞在应用程序的上下文中执行恶意操作系统命令。这可能导致数据泄露、系统被入侵或其他安全问题。
  • CWE119 (Buffer Overflow - generic case):缓冲区溢出(通用情况)
    这种漏洞通常发生在程序尝试写入超出分配给缓冲区的内存空间的数据时。攻击者可以利用这个漏洞覆盖栈上的关键数据,修改程序的执行流程,或执行任意代码。
  • CWE125 (Buffer Overflow (Out-of-bounds Read)):缓冲区溢出(越界读取)
    这种漏洞发生在程序尝试读取超出数组或缓冲区边界的数据时。攻击者可以利用这个漏洞来读取或泄露敏感信息,或者导致程序崩溃。
  • CWE134 (Use of Externally-Controlled Format string):使用外部控制的格式字符串
    当程序将用户提供的字符串作为格式化字符串传递给格式化输出函数时,如果没有适当地验证和过滤,攻击者可以利用这个漏洞执行格式字符串攻击,可能导致信息泄露或程序崩溃。
  • CWE190 (Integer overflow or wraparound):整数溢出或环绕
    这种漏洞发生在程序尝试将超出整数类型范围的值分配给变量时。攻击者可以利用这个漏洞来改变程序的行为,导致未预期的结果,例如越界访问数组或拒绝服务。
  • CWE367 (Time-of-check Time-of-use (TOCTOU)):检查-使用时间窗口问题
    这种漏洞发生在程序在检查某些条件后,但在使用这些条件时,条件已经发生了改变。攻击者可以利用这个漏洞执行一系列的攻击,例如文件竞争条件,可能导致安全漏洞。
  • CWE415 (Double free):双重释放
    这种漏洞发生在程序尝试释放已经被释放的内存区域时。攻击者可以利用这个漏洞来导致程序崩溃,或者执行任意代码。
  • CWE416 (Use After Free): 释放后继续使用
    这种漏洞发生在程序尝试在释放内存后继续引用该内存区域时。攻击者可以利用这个漏洞来执行任意代码,可能导致程序崩溃或被入侵。
  • CWE426 (Untrusted Search Path):不受信任的搜索路径
    这种漏洞发生在程序在加载或执行外部资源时,未正确验证或限制搜索路径。攻击者可以利用这个漏洞来执行恶意代码或读取敏感文件,可能导致安全问题。
  • CWE467 (Use of sizeof() on a pointer type):对指针类型使用sizeof()
    这种漏洞发生在程序尝试对指针类型使用sizeof()运算符来获取其大小时。这可能导致获取不正确的大小,从而导致程序错误行为或安全问题。
  • CWE476 (NULL Pointer Dereference):空指针解引用
    这种漏洞发生在程序尝试在空指针上执行操作时。攻击者可以利用这个漏洞来导致程序崩溃或执行任意代码。
  • CWE676 (Use of Potentially Dangerous Function):使用潜在危险函数
    这种漏洞发生在程序使用可能具有安全风险的函数时,例如strcpy()gets()。攻击者可以利用这个漏洞来执行缓冲区溢出等攻击,可能导致安全问题。
  • CWE787 (Buffer Overflow (Out-of-bounds Write)):缓冲区溢出(越界写入)
    这种漏洞发生在程序尝试向数组或缓冲区写入超出其边界的数据时。攻击者可以利用这个漏洞来修改关键数据,执行任意代码,或导致程序崩溃。

4.3、实现方法

  // TODO

5、参考文献

  1. BinAbsInspector:一款针对二进制代码的漏洞扫描和逆向分析工具
  2. KeenSecurityLab/BinAbsInspector: BinAbsInspector: Vulnerability Scanner for Binaries
  3. NationalSecurityAgency/ghidra: Ghidra is a software reverse engineering (SRE) framework
  4. Ubuntu 安装jdk17详细配置教程(傻瓜式教程)
  5. 如何在 Ubuntu 22.04 上安装 Gradle
  6. Z3Prover/z3: The Z3 Theorem Prover
  7. Linux环境编译安装Ghidra教程
  8. NSA开源逆向工具Ghidra入门使用教程
  9. “精”准把握静态分析|科恩二进制文件自动化静态漏洞检测工具正式开源
  10. BinAbsInspector安装
  11. KeenSecurityLab/BinAbsInspector-binaries
  12. Java error · Issue #56 · KeenSecurityLab/BinAbsInspector

总结

  以上就是本篇博文的全部内容,可以发现,BinAbsInspector的部署与使用过程并不复杂,我们本篇博客对其进行了详细的分析。相信读完本篇博客,各位读者一定对BinAbsInspector有了更深的了解。

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

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

相关文章

CMake 教程(二)添加库

目录 一、实例一——创建库1、add_library2、target_include_directories()、target_link_libraries()2.1 target_include_directories()2.2 target_link_libraries() 3、实例操作 二、实例二——添加选项1、option()2、实例操作 在第一节 CMake 教程&#xff08;一&#xff09…

学习笔记(202410)

课程&#xff1a;Generative AI for Software Development 链接&#xff1a;吴恩达同步最新AI专业课&#xff0c;第54讲&#xff1a;用人工智能做软件开发--Generative AI for Software Development_哔哩哔哩_bilibili 时间&#xff1a;2024-10-12 至 概述&#xff1a;使用C…

ES-入门-javaApi-文档-新增-删除

新增指定索引的文档数据的代码如下&#xff1a; package com.atgulgu.es.test;import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpHost; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRe…

学习笔记——交换——STP(生成树)简介

一、技术背景 1、生成树技术背景 交换机单线路组网&#xff0c;存在单点故障(上左图)&#xff0c;上行线路及设备都不具备冗余性&#xff0c;一旦链路或上行设备发生故障&#xff0c;业务将会中断。 为了使得网络更加健壮、更具有冗余性&#xff0c;将拓扑修改为(上右图)接入…

网络学习笔记

一、网络的结构与功能 网络的鲁棒性与抗毁性 如果在移走少量节点后网络中的绝大部分节点仍然是连通的&#xff0c;那么就该网络的连通性对节点故障具有鲁棒性 网络上的动力学 动力系统&#xff1a;自旋、振子或混沌的同步、可激发系统 传播过程&#xff1a;信息传播与拥堵…

ChatGPT01-preivew体验报告:内置思维链和多个llm组合出的COT有啥区别呢?丹田与练气+中学生物理奥赛题测试,名不虚传还是名副其实?

一个月前&#xff0c;o1发布的时候&#xff0c;我写了篇文章介绍 逻辑推理能力堪比博士生&#xff0c;OpenAI发布全新AI模型系列&#xff1a; o1 - 大模型或许进入新阶段&#xff0c;还翻译了官方的介绍 解密OpenAI o1是如何让LLMs获得逻辑推理能力的 - CoT * RL&#xff0c;也…

代码复现(五):GCPANet

文章目录 net.py1.class Bottleneck&#xff1a;残差块2.class ResNet&#xff1a;特征提取3.class SRM&#xff1a;SR模块4.class FAM&#xff1a;FIA模块5.class CA&#xff1a;GCF模块6.class SA&#xff1a;HA模块7.class GCPANet&#xff1a;网络架构 train.pytest.py 论文…

快速上手C语言【下】(非常详细!!!)

目录 1. 指针 1.1 指针是什么 1.2 指针类型 1.2.1 指针-整数 1.2.2 指针解引用 1.3 const修饰 1.4 字符指针 1.5 指针-指针 1.6 二级指针 2. 数组 2.1 定义和初始化 2.2 下标引用操作符[ ] 2.3 二维数组 2.4 终极测试 3. 函数 3.1 声明和定义 3.2 传值调用…

【Python爬虫实战】深入解析BeautifulSoup4的强大功能与用法

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、BeautifulSoup4的介绍和安装 &#xff08;一&#xff09;基本功能和特点…

Servlet[springmvc]的Servlet.init()引发异常

报错&#xff1a; 原因之一&#xff1a; web.xml配置文件中监听器导入依赖项错误

新颖的 setTimeout() 替代方案

在前端开发中&#xff0c;长时间运行的JavaScript任务一直是一个棘手的问题。它们会导致页面无响应&#xff0c;影响用户体验。传统上&#xff0c;开发者使用setTimeout()来分割长任务&#xff0c;但这种方法存在明显的缺陷。最近&#xff0c;Chrome 129引入了一种新的、更高效…

如何搭建激光稳频的闭环控制系统

半导体激光器稳频简介 简介 窄线宽连续激光器广泛应用于原子、分子以及物理光学领域&#xff0c;在精密测量设备中有着举足轻重的作用。那些并不带有波长稳频技术的激光器&#xff0c;其短时间稳定性不适合很多应用。本文档将会给您介绍一种简单而强大的主动稳频技术&#xff0…

不收费的数据恢复工具有哪些好用?快来看这五款:

大家好&#xff0c;今天我来跟大家分享一下使用不收费数据恢复软件的一些心得和体验&#xff1b;数据丢失是一件非常让人头疼的事情&#xff0c;尤其是对于那些重要文件来说&#xff1b;幸好&#xff0c;现在市面上有不少不收费的数据恢复软件可以帮助我们找回丢失的数据。接下…

【C++笔试强训】如何成为算法糕手Day11

学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 游游的水果大礼包 思路 代码实现&#xff1a; 买卖股票的最好时机(二) 思路&#xff1a; 代码实现&#xff1a; 倒置字符串 思路&#xff1a; 代码实现&#xf…

101、QT摄像头录制视频问题

视频和音频录制类QMediaRecorder QMediaRecorder 通过摄像头和音频输入设备进行录像。 注意: 使用Qt多媒体模块的摄像头相关类无法在Windows平台上进行视频录制&#xff0c;只能进行静态图片抓取但是在Linux平台上可以实现静态图片抓取和视频录制。 Qt多媒体模块的功能实现是依…

React远程组件

什么是远程组件&#xff1f; 远程组件指的是从远程服务器动态加载的组件&#xff0c;这些组件可以是React、Vue等框架的组件。 为什么需要远程组件 本质上就是为了解决复用问题&#xff0c;那引出新的问题有几种公共项目代码复用方式&#xff1f; Git仓库 将公共代码单独抽…

CTFHUB技能树之XSS——DOM反射

开启靶场&#xff0c;打开链接&#xff1a; 直接指明是DOM反射型的XSS漏洞 右键查看页面源代码&#xff0c;Ctrl F关键词”CTFHub is very“&#xff1a; 可以看到存在xss漏洞 不过得先闭合一下&#xff1a; 闭合例子如下&#xff1a; ;</sCrIpT><sCRiPt sRC//xs.pe/…

YOLOv11改进-卷积-空间和通道重构卷积SCConv

本篇文章将介绍一个新的改进模块——SCConv&#xff08;小波空间和通道重构卷积&#xff09;&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。为了减少YOLOv11模型的空间和通道维度上的冗余&#xff0c;我们引入空间和通道重构卷积。首先&#xff0c;…

Java 入门基础篇15 - java构造方法以及认识新的关键字

一 今日目标 构造方法static关键字代码块math类package关键字import关键字 二 构造方法概述 2.1 构造方法描述 构造方法是一个特殊方法&#xff0c;作用是创建对象&#xff0c;对对象进行初始化。 ​ 如&#xff1a; 对对象中的成员进行初始化值 2.1 构造方法的特征 1、方…

【C语言】循环结构-for循环

循环结构&#xff1a;计算机最擅长的事情就是做简单重复的工作 通过控制循环变量&#xff0c;是否满足循环条件来调整循环次数。 for(初始化;循环条件;循环控制) {循环体; }#include <stdio.h> #include <math.h> /* 功能&#xff1a;循环结构&#xff08;for&…