【KLEE】使用Docker安装KLEE KLEE的简单使用 KLEE的约束文件

news2024/10/7 6:51:03

本文架构

  • 零、前言
  • 一、KLEE简介
  • 二、Docker安装KLEE
    • 1. 使用apt安装docker
    • 2.拉取klee镜像
    • 3.使用git 拉取klee源码
    • 4.安装klee镜像
    • 5. 运行镜像
  • 三、试用KLEE的examples
    • 1.查看并了解待测文件`examples/get_sign/get_sign.c`
    • 2.KLEE进行符号测试的基本步骤
      • 编译成LLVM位码文件
      • 使用KLEE进行符号执行
      • 查看生成的测试用例
      • ktest中结果解释
  • 四、使用KLEE生成的测试用例运行程序
    • 1.链接到klee库
    • 2.查看执行结果
  • 五、约束文件生成
    • 1.生成约束文件
      • 查看`all:kquery`格式文件
      • 查看`solver:Kquery`格式文件
    • 2.约束文件的结构
      • 基本结构
      • 详细结构

零、前言

反复试了几个源码安装KLEE的教程都不行,装了一天毫无进展,几乎怀疑人生。后来想反正我不需要在KLEE基础上再开发,就直接使用Docker安装KlEE就好了。
在这个基础上进一步写(原文链接),原文写的挺好的,但就是写作格式需要改进 -v-。

一、KLEE简介

klee-log
符号执行 (Symbolic Execution) 是一种程序分析技术,其可以通过分析程序来得到让特定代码区域执行的输入。使用符号执行分析一个程序时,该程序会使用符号值作为输入,而非一般执行程序时使用的具体值。在达到目标代码时,分析器可以得到相应的路径约束,然后通过约束求解器来得到可以触发目标代码的具体值。

相关可阅读文献(仅供参考)
1.【OSDI 2008-Cristian Cadar et al. 】《KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Systems Programs》

2.【Github】KLEE
3.【官网】KLEE Symbolic Execution Engine
4.【Github Blog】符号执行, KLEE 与 LLVM
5.【个人网站】符号执行引擎 KLEE 学习笔记
6.【官方文档】KLEE Doc

二、Docker安装KLEE

1. 使用apt安装docker

# ubuntu安装docker 
sudo apt install docker

sudo apt install docker.io

2.拉取klee镜像

docker pull klee/klee

pull_klee

3.使用git 拉取klee源码

git clone https://github.com/klee/klee.git

4.安装klee镜像

cd klee

# 注意,klee/klee后面那个“.” 记得加上,表示在当前路径下创建一个镜像
# docker build <OPTIONS> PATH | URL | -
docker build -t klee/klee .

此处会进行大约几分钟的安装,基本都是环境的下载。
klee_install

5. 运行镜像

docker run 命令详解这个文章写的比较好【CSDN Blog】docker run 命令详解(新手入门必备)

docker run --rm -ti --ulimit=‘stack=-1:-1’ klee/klee

运行容器成功后可以看到已经有了klee的srcbuild目录
intodocker
此时可以正常使用klee,例如运行klee里面的example,简单体验klee

三、试用KLEE的examples

1.查看并了解待测文件examples/get_sign/get_sign.c

cd klee_src/examples/get_sign
vim get_sign.c

get_sign_c
此函数目的十分简单,判断一个数是正、负还是0。

  • 可以看到main函数中klee_make_symbolic()函数,该函数包含在头文件klee.h中,主要是将一个值替换成符号形式,以对其进行符号执行。
  • 该函数接收3个参数:<变量地址变量大小变量名>(可以为任何值)。
  • main函数目的:将变量a符号化并用它调用get_sign()

2.KLEE进行符号测试的基本步骤

编译成LLVM位码文件

由于klee是对LLVM IR进行实现的,所以需要将待测文件编成LLVM位码文件先。运行指令:

clang -I ../../include -emit-llvm -c -g -O0 -Xclang -disable-O0-optnone get_sign.c

参数解释

参数解释
-I<dir>添加目录到include搜索路径,这样我们的编译器才能找到klee/klee.h,里面定义了很多我们需要与klee虚拟机进行交互的内部函数,比如klee_make_symbolic
-emit-llvm对汇编程序和对象文件使用LLVM表示。
-c 只运行预处理、编译和汇编步骤。
-g将调试信息添加到位代码文件中,以便之后使用该文件生成源代码行级别的统计信息。如果没有这个参数,将无法得到映射在源码层面的一些信息,不方便我们查看结果。
-O0 -Xclang -disable-O0-optnone这个是一些优化相关的问题,O0表示不进行任何优化.因为我们需要对源码进行符号执行,所以源码的结构信息是十分重要的,部分编译器进行优化可能会丧失这种结构信息。

输入完成后得到get_sign.bc
klee-bc

使用KLEE进行符号执行

使用klee对bc文件进行符号执行。原文链接。但不是很详细,重新做个笔记。

klee get.sign.bc

klee-exexution
可以看到:

  • KLEE一共执行了33条指令,探索了3条执行路径,生成了3条测试用例
  • 新生成了klee-lastklee-out-0文件夹。输出结果报告放在了 klee-out-0(或者klee-last)目录下(PS:klee每执行一次都会生成一个klee-out-N,其中N是表示第几次的执行,这里我们只执行了一次,因此是0。除此之外,会生成一个klee-last的符号链接,指向最新生成的这个k查看Klee-out-N)。
    使用ll也可以看到klee-last是一个指向最新生成测试文件文件夹的软链接。
    testsout

我们查看下目录 klee-last
klee-last
各个文件的作用可以见【官方文档】

查看生成的测试用例

查看测试用例需要使用klee-tools,这里我们分别查看下test0000001.ktest,test0000002.ktest,test0000003.ktest

test-detail

ktest中结果解释

图中可见,其生成的三个测试用例有符号整型值分别对应0,16843009,-2147483648

参数参数解释
args调用程序时使用的参数,这个例子中只有程序名
num objects: 符号对象在路径上的数量,在这个例子中只有1个
object 0: name: 符号对应的变量名字
object 0:size: 符号对应的变量大小
object 0:int\hex\uint等: 其他格式的用例查看。例如:无符号形式uint、十六进制hex

四、使用KLEE生成的测试用例运行程序

1.链接到klee库

用klee提供的库来将得到的测试用例作为输入来运行我们的程序。首先将我们的程序链接到klee提供的库libkleeRuntest

export LD_LIBRARY_PATH=<KLEE_BUILD_PATH/lib>:$LD_LIBRARY_PATH
# 指定将get_sign.c编成 get_sign.out
$ gcc -I ../../include -L <KLEE_BUILD_PATH/lib>/lib  get_sign.c -o get_sign -lkleeRuntest
# 使用默认,生成a.out
$ gcc -I ../../include -L <KLEE_BUILD_PATH/lib>/lib  get_sign.c  -lkleeRuntest

这里的KLEE_BUILD_PATH是你KLEE的build目录,请根据自己的实际设置。
klee-gcc

2.查看执行结果

两个指令生成的就是文件名不一样。将测试用例输入程序a.out或者get_sign.out

KTEST_FILE=klee-last/test000001.ktest ./a.out
# 或者
KTEST_FILE=klee-last/test000001.ktest ./get_sigin.out.out

使用echo $?输出执行结果,可以看到测试用例1的值为0 所以函数执行后同样输出0。其他的东西都一样,就不逐一试了。
input0

五、约束文件生成

我使用KLEE的目的就是为了获取程序分析后的约束文件,所以这里也写下。只找到一篇文章【简书Blog】KLEE中的约束文件解析。但本文跟它存在偏差。约束文件的格式讲解可以参靠这篇文章。
更多的内容还是来自官方文档
The reference manual for the KQuery language

1.生成约束文件

在进行符号执行前添加相关参数(这里与原文章介绍的-use-query-log=all:pc不一样,可能版本不同,所以大家最好还是通过输入klee --help来查看自己当前版本的参数是什么)

参数参数解释
-use-query-log=all:kquery记录格式为KQuery,全部约束
-use-query-log=all:smt2记录格式为SMT-LIBv2,全部约束
-use-query-log=solver:kquery记录格式为KQuery ,只记录交于约束求解器求解的约束
-use-query-log=solver:smt2记录格式为SMT-LIBv2,solver则表示只记录交于约束求解器求解的约束

输入命令

klee -use-query-log=all:kquery get_sign.bc

可以看到生成了名为all-queries.kquery文件
kquery

查看all:kquery格式文件

使用vim查看all:kquery格式文件

vim all-queries.kquery

kquery2
一共生成了4个约束条件。

查看solver:Kquery格式文件

klee -use-query-log=solver:kquery get.sign.bc
vim solver-queries.kquery

kquery-solver
可以看到最终交给约束求解器求解的一共只有3个。

2.约束文件的结构

基本结构

kquery = { array-declaration | query-command }
  • 数组声明(array-declaration):用于声明在后续表达式中使用的位向量数组。
  • 查询命令(query-command):用于定义应由约束求解器执行的查询。查询由一组约束(假设)、一个查询表达式以及可选的表达式和数组组成,用于在查询表达式无效时计算值。

详细结构

一般一个求解的查询命令包括5个元素:元素1为关键字"query";元素2个由[]包裹,表示一个待解约束表达式列表 ;元素3表示期望元素2合取后不满足的布尔值(即求得的解使得元素2与元素3不等);元素4由[]包裹,表示约束求解过程中,要顺带计算的表达式列表,如果元素5不存在,元素4可以不存在;如果元素5存在,又没有什么表达式需要计算时,此处应为[];元素5由[]包裹,表示元素2中需要求解的变量列表. --------引自《【简书Blog】KLEE中的约束文件解析》

简单说就是:

query 
[元素2: 待求解表达式列表] 
<元素3:元素2解析后不满足时布尔值> 
[元素4:求解过程中需要计算的表达式,可为空] 
[元素5:元素2中需要求解的变量列表]

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

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

相关文章

爬取微博热搜榜

需求&#xff1a; 利用python和xpath爬取微博热搜榜 步骤&#xff1a; 爬虫的步骤 获取网页数据-》分析网页数据-》提取网页数据。 1&#xff0c;首先获取微博热搜数据。 热搜主页为 https://s.weibo.com/top/summary?caterealtimehot 打开收&#xff0c;按F12获取网页源…

FebHost:墨西哥.MX域名概述

墨西哥&#xff0c;这片充满生机与历史的国度&#xff0c;以其丰富的文化传统、诱人的美食以及壮丽的自然景观吸引着世界各地的游客。从古老的阿兹特克和玛雅文明到现代都市的繁华街区&#xff0c;墨西哥为每一位访客和当地居民提供了一场视觉与感官的盛宴。 关于 .MX 域名 作…

特征值与特征向量的关系,Au=λu

特征值与特征向量的关系在线性代数中是一个核心概念&#xff0c;尤其在处理矩阵和线性变换时。给定一个矩阵 A A A&#xff0c;如果存在一个非零向量 u u u和一个标量 λ \lambda λ&#xff0c;使得 A u λ u Au \lambda u Auλu&#xff0c;那么我们就说 λ \lambda λ是矩…

docker使用arthas基本教程

供参考也是自己的笔记 docker容器下使用遇到的问题&#xff1a;大致是连接不上1号进程 我这边主要的问题是用户权限问题&#xff0c;docker容器使用aaa用户启动&#xff0c;那个在docker容器内&#xff0c;需要使用aaa用于启动 docker 容器如何使用arthas #实现下载好arthas …

【LeetCode】--- 动态规划 集训(二)

目录 一、63. 不同路径 II1.1 题目解析1.2 状态转移方程1.3 解题代码 二、931. 下降路径最小和2.1 题目解析2.2 状态转移方程2.3 解题代码三、174. 地下城游戏3.1 题目解析3.2 状态转移方程3.3 解题代码 一、63. 不同路径 II 题目地址&#xff1a; 不同路径 II 一个机器人位于…

2024年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题是由安全生产模拟考试一点通提供&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材&#xff0c;N1叉车司机大纲整理而成&#xff08;含2024年…

『VUE』13. Class绑定(详细图文注释)

目录 动态和静态类结合采用数组的方式引入数组语法的动态类名代码演示总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 首先样式类定义 <style> .active {font-size: 50px; } .text-danger {color: red; } </style&g…

一文带你理解完Git知识点

文章目录 Git基础概念Git基本操作**0. 初始化仓库****1. add到暂存区****2. 再commit到本地仓库****3. 推送到远程仓库****4. 拉取远程仓库****5. 撤销更改** Git分支管理1. 创建分支命令2. 切换分支命令3. 摘取提交4. 删除分支命令5. 合并分支命令6. 变基 Git进阶1. **git tag…

计算机网络 实验指导 实验8

三层交换机的访问控制 1.实验拓扑图&#xff1a; 名称接口IP地址网关Switch AF0/1192.168.1.1/24F0/2172.1.1.1/24Switch BF0/1192.168.1.2/24F0/2172.2.2.1/24PC1172.1.1.2/24172.1.1.1PC2172.1.1.3/24172.1.1.1PC3172.2.2.2/24172.2.2.1PC4172.2.2.3/24172.2.2.1 2.实验目的…

Stable Diffusion介绍

Stable Diffusion是一种前沿的开源深度学习模型框架&#xff0c;专门设计用于从文本描述生成高质量的图像。这种称为文本到图像生成的技术&#xff0c;利用了大规模变换器&#xff08;transformers&#xff09;和生成对抗网络&#xff08;GANs&#xff09;的力量&#xff0c;以…

PPT在线压缩工具推荐

有时候使用邮箱发送邮件时&#xff0c;添加的PPT、Word、PDF文档总会因为过大而转为其他类型的附件发送&#xff0c;不仅上传缓慢&#xff0c;对方查收下载时还有有效期限制&#xff0c;7天或15天后就过期再也无法下载了&#xff0c;有没有什么办法可以压缩PPT等文档&#xff0…

基于单片机光伏太阳能跟踪系统设计

**单片机设计介绍&#xff0c;基于单片机光伏太阳能跟踪系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机光伏太阳能跟踪系统的设计&#xff0c;旨在通过单片机技术实现对光伏太阳能设备的自动跟踪&#xff0c;以提高太阳…

五款户外运动耳机推荐,让你畅享户外运动时光

在繁忙的都市生活中&#xff0c;我们常常被各种琐事所困扰&#xff0c;以至于忘记了自然的美丽与宁静。然而&#xff0c;当我们走近大自然&#xff0c;放下心中的烦恼&#xff0c;我们会发现&#xff0c;自然是我们最好的治愈师。热爱自然的朋友们&#xff0c;这里有一份运动耳…

linux进阶篇:磁盘管理(一):LVM逻辑卷基本概念及LVM的工作原理

Linux磁盘管理(一)&#xff1a;LVM逻辑卷基本概念及LVM的工作原理 一、传统的磁盘管理 在传统的磁盘管理方案中&#xff0c;如果我们的磁盘容量不够了&#xff0c;那这个时候应该要加一块硬盘&#xff0c;但是新增加的硬盘是作为独立的文件系统存在的&#xff0c;原有的文件系…

怎么根据ip地址计算子网掩码

在计算机网络的世界中&#xff0c;IP地址和子网掩码扮演着至关重要的角色。IP地址用于标识网络中的每一台设备&#xff0c;而子网掩码则用于区分网络地址和主机地址&#xff0c;进而确定设备在网络中的具体位置。然而&#xff0c;有时我们可能需要根据已知的IP地址来计算子网掩…

A Novel Distributed File System Using Blockchain Metadata——论文泛读

Wireless Personal Communications 2023 Paper 分布式元数据论文阅读笔记整理 问题 随着来自不同来源&#xff08;如在线社交媒体、物联网、移动数据、传感器数据、黑匣子数据等&#xff09;的大量数据以指数级的速度增长&#xff0c;集群计算已成为数据处理中不可避免的一部…

多功能调解室sip可视对讲方案

多功能调解室sip可视对讲方案 人民调解委员会是依法设立的调解民间纠纷的群众性组织。 我国基层解决人民内部纠纷的群众性自治组织.人民调解委员会在城市以居民委员会为单位,农村以村民委员会为单位建立.其任务是: 及时发现纠纷,迅速解决争端.防止矛盾激化,预防,减少犯罪的发生…

Java System类和Runtime类

System常见API exit:退出程序currentTimeMillis &#xff1a;获取当前的毫秒数&#xff08;1970年是c语言诞生的那一年&#xff09; 代码 System.out.println("Hello, World!"); // System.exit(0); // 退出程序 尽量别使用long currentTimeMillis System.currentTi…

咖啡茶饮、便利店、餐厅……连锁门店的人效突围之路

1、连锁门店的人效突围 去年年末&#xff0c;我们有幸访谈了餐饮、茶饮业的一些连锁品牌&#xff0c;有餐厅&#xff0c;茶饮品牌、精品咖啡、便利店……有走在创业路上的新起之秀&#xff0c;也有十几年的老牌企业。他们的门店数量&#xff0c;从几十家、上百家、上千家不等。…

FME学习之旅---day20

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 教程&#xff1a;AutoCAD 入门 FME使用四种主要格式来读取和写入AutoCAD图形文件;初级教程重点介绍AutoDesk AutoCAD DWG\DXF(ACAD) AutoCAD中常用的术语 实体&#xff1a;AutoCAD 图元表示 D…