约束求解器Z3

目录

  • 预备知识
    • 1.关于z3
  • 实验目的
  • 实验环境
  • 实验步骤一
  • 实验步骤二
  • 实验步骤三

预备知识

1.关于z3

Z3是一个微软出品的开源约束求解器,能够解决很多种情况下的给定部分约束条件寻求一组满足条件的解的问题(可以简单理解为解方程的感觉,虽然这么比喻其实还差距甚远,请勿吐槽),功能强大且易于使用,本文以近期的CTF题为实例,向尚未接触过约束求解器的小伙伴们介绍Z3在CTF解题中的应用。
Z3约束求解器是针对Satisfiability modulotheories Problem的一种通用求解器。所谓SMT问题,在Z3环境下是指关于算术、位运算、数组等背景理论的一阶逻辑组合决定性问题。虽然Z3功能强大,但是从理论上来说,大部分SMT问题的时间复杂度都过高,根本不可能在有限时间内解决。所以千万不要把Z3想象得过于万能。
Z3在工业应用中实际上常见于软件验证、程序分析等。然而由于功能实在强大,也被用于很多其他领域。CTF领域来说,能够用约束求解器搞定的问题常见于密码题、二进制逆向、符号执行、Fuzzing模糊测试等。此外,著名的二进制分析框架angr也内置了一个修改版的Z3。
Z3本身提供一个类似于Lisp的内置语言,但是实际使用中,一般使用Python Binding操作会比较方便。

实验目的

通过该实验了解z3的常规使用、IDA Pro、file等工具的使用,以及z3在CTF中的使用技巧。

实验环境

Windows 8(安装ida)
kali IP地址:随机分配
源码请在实验机内下载使用:http://tools.hetianlab.com/tools/z3.zip

实验步骤一

z3的安装方法(已装)
在这里插入图片描述
我们首先以一个简单的例子来入门z3最基础的用法:
在这里插入图片描述
函数Int(‘x’)在Z3中创建了一个名为x的整形变量,solve函数则处理一系列约束(即已知条件),上面的例子使用两个变量x和y以及三个约束。可以理解为z3用来解方程,solve中是方程满足的条件。
接下来的例子可以学习到z3在约束求解中的其他功能。
z3表达式简化器(用于简化表达式):
在这里插入图片描述
(**是次方的意思)
z3提供了用于遍历表达式的函数:
在这里插入图片描述
z3可用于求解非线性多项式约束:
在这里插入图片描述
Real(’x’)创建实数变量x。Z3可以表示任意大的整数,有理数(如上例)和无理代数。一个无理数代数是具有整数系数的多项式的根。在内部,Z3精确地代表了所有这些数字。无理数以十进制表示法显示,以便读取结果:
在这里插入图片描述
函数set_option用于配置Z3环境。它用于设置全局配置选项,比如设置结果如何显示。set_option(precision = 30)设置显示结果时使用的小数位数为30。而?标记在1.2599210498?中表示输出被截断。
如果一个约束没有解决方案(可理解为方程没有解)则显示如下:
在这里插入图片描述
求解器API的使用:
在这里插入图片描述
solver()创建一个通用的求解器。
在这里插入图片描述
可以使用add()添加约束。我们说约束已经在求解器中断言,方法check()判断是否有解解决断言的约束。如果找到解,则结果是SAT(可满足)。如果没有解存在,则结果是UNSAT(不可满足),也可以说断言约束系统是不可行的。
了解了这些基础之后,以一个数学物理问题结尾吧。
甲正以30.0米/秒的速度行驶,红绿灯变成黄色,甲刹车。如果甲的加速度为-8.00 m / s^2,求车辆在打滑过程中的位移。
代码如下:
在这里插入图片描述
运行结果为:
在这里插入图片描述

实验步骤二

任务描述:使用z3尝试按照给出的约束破解序列码,序列码格式为XXXX-XXXX-XXXX-XXXX(我们提供了源程序和可执行文件)
我们先执行一下看看效果:
在这里插入图片描述
可以看到,执行时要求输入正确的序列号,否则会报错。
我们直接来看题目提供的源程序,来梳理下序列号产生的逻辑:
在这里插入图片描述
从代码中我们可以判断出序列号需要满足的约束条件:
1)x在0-9之间,但是第四组的x一定在3-8之间;
2)第四组是校验和,他的总和等于前三组的平均值,它的平均值等于第一组的总和;
3)第一组的总和和第二组的总和不同;
4)第一组和第四组相同下标的值不同;
5)第二组和第三组相同下标的值不同。
当然我们可以暴力破解,不过我们现在可以使用z3来解决这个问题。
Z3有几种类型,如Int,Float,IntVector等。在这里,我决定为每组四个使用一个IntVector。第一个参数是Z3变量名,第二个是矢量大小。稍后使用Z3变量名来访问生成的模型中的值。
在这里插入图片描述
求解器将负责应用约束并获取模型:
在这里插入图片描述
因为我们需要使用总和和平均值来计算和存储这些值。我们仅将第四组用于校验和。
在这里插入图片描述
现在我们准备好了这些值,让我们添加约束,只需使用求解器实例中的add()即可。
在这里插入图片描述
以下是我在addConstraintBetweenXandY和addConstraintNotEq上面使用的两个简单的自定义函数,用于遍历符合约束的值。
现在我们已完成约束,我们已准备好获得我们的解。在打印模型之前,必须调用check()以确保至少有一个令人满意的解,并且还因为它能判断已有的约束是否能够求解:
在这里插入图片描述
这是完整的原始输出:
在这里插入图片描述
还记得我们在开始时声明的变量吗?所以现在我们以[variableName__index = value,…]的形式得到了我们的序列,这足以解决这个问题。但我们只是格式化它们。为此,需要使用索引(a__0,a__1,…)来访问这些值。可以使用Python变量作为索引检索这些内容获得序列号:
在这里插入图片描述
运行结果如图:
在这里插入图片描述
然后把得到的序列号输入crackme:
在这里插入图片描述
可以看到序列号是有效的。

实验步骤三

任务描述:再来做一个crackme吧~(这次只提供可执行文件)
先执行看看:
在这里插入图片描述
程序要求我们输入用户名和密码,如果校验出错则提出login failure。
我们切换到win中用IDA分析。
在切换之前,先使用file来看一下相关信息:
在这里插入图片描述
是64位的,所以使用ida pro x64打开:
在这里插入图片描述
点击ok即可:
在这里插入图片描述
先f5反编译main函数:
在这里插入图片描述
可以看到是checkuser2函数用于判断用户名和密码并决定我们登录是否成功,我们跟进去看看:
在这里插入图片描述
可知用户名为Palash2。
v6是一个常量数组,用于在循环内进行计算。在每次迭代时,v4应为0,以使其成为有效的用户名/密码组合。让我们尝试删除无用的片段,来获得更清晰的for循环的逻辑:
在这里插入图片描述
根据这个逻辑,按照第一个crackme一样用python表达同样的逻辑,从正向出发去考虑求解。
代码如图:
在这里插入图片描述
运行后结果如图:
在这里插入图片描述
在test可执行文件里测试:
在这里插入图片描述
成功拿到了flag。

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

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

相关文章

Geomesa-HBase索引篇——Z3索引

目录 1. 概述 2. 原理 2.1 概述 2.2 分片存储机制 2.3 Epoch Week机制 2.4 时空索引机制 2.5 Fid机制 2.6 多个数据的封装 3. 代码实现 3.1 获取分片 3.2 获取Epoch Week 3.3 获取时空索引 3.4 获取Fid 3.5 多个数据的封装 1. 概述 在大量的场景当中&#xff0c…

matlab函数参数不足,调用函数显示输入参数不足

问题描述.png (29.7 KB, 下载次数: 1) 2015-1-27 09:34 上传 %Gauss-Newton算法实现如下 function[x,minf] = GN(f,x0,var,eps)formatlong; ifnargin == 3 %如果没有设置eps,则eps=1.0e-6eps = 1.0e-6; end m = 0; S =transpose(f)*f; %trnspose是转…

mark点Z3学习资料整理

文章目录 Anything is NothingLess is MoreSMTz3 classeslogic programming Reasoning符号推理策略strategiesFixed-point关系代数datalog程序分析验证 Anything is Nothing 前几个月科研用到z3-solver,学习了下,主要注释写在源码上进行学习和试验&…

z3 guide

Z3是微软研究院开发的高性能定理证明程序。Z3有许多应用场合,如:软件/硬件验证和测试,约束求解,混合系统的分析,安全,生物(硅分析),几何问题。 Z3发行版还包含C、C、.Net、Java和OCaml 的api。Z3Py的源代码…

【Django】无法从“django.utils.encoding”导入名称“force_text”

整晚处理 Django 的导入错误。 我将把它作为提醒,希望处于相同情况的人数会减少。 原因 某些软件包版本不支持Django 4 请看下表并决定Django和Python的版本 方案 如果出现难以响应,或者更改环境麻烦,请尝试以下操作 例如出现以下错误 …

走迷宫(maze) 难度**

题目描述 有一个 mn 格的迷宫(表示有 m 行、n 列),其中有可走的也有不可走的,如果用 11 表示可以走,00 表示不可以走。 文件读入这 mn 个数据和起 始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列…

地下迷宫

import java.util.*;/*** 题目大意:n*m格迷宫,1代表青蛙可以通过,0不能通过* 青蛙体力值P,每次走一步,横向走消耗体力值1,向下走不消耗体力,* 向上走消耗体力值3.* 青蛙初始位置(0,0),迷宫出口(0,m-1)* 求青蛙走出迷宫的路径*/ public class Main {static class Node {int x;in…

7-2 地下迷宫探索

7-2 地下迷宫探索 分数 30 全屏浏览题目 切换布局 作者 DS课程组 单位 浙江大学 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式。地道网是房连房、街连街、村连村的地下工事,如下图所示。 我们在回顾前辈们艰苦卓绝…

走迷宫图解

本节利用栈的思想用试探法进行了迷宫一条路径的探索。其中主要的操作是找到下一个空格、如果空格不再可行退回上一个格、每走过一个格子将走过的格子标记为-1防止循环走。 原理如下图: 具体的代码如下: #走一个任意的5*5迷宫 #mg可以为[[1,1,1,1,1,1],…

C/C++编程:获取路径中的文件名

文件是否存在 bool fileExists(const char *fileName) {ifstream infile(fileName);return infile.good(); }C/C获取路径中的文件名 void getfilename(const char *filename, char *name)//从完整路径名中解析出文件名称,例如:/home/test/abc.txt,解析…

Linux C 文件路径中获取文件名及路径

编程中有时会遇到需要把文件路径中的文件名或者路径提取出来的情况&#xff0c;发现了两个好用的函数记录一下。 一、提取文件名 头文件&#xff1a;#include <libgen.h> **函数&#xff1a;**char *basename(char *path); 注&#xff1a;这个函数不会修改传入的 path …

从路径名中得到文件名 MFC

从路径名中得到文件名 MFC 转载▼ strFileNamestrPathName.Mid(strPathName.ReverseFind( \\ )1); //若去掉.txt .exe .doc等后缀&#xff0c;共4个字符 strFileNamestrPathName.Mid(strPathName.ReverseFind( \\ )1&#xff0c;strPathName.length()-4); CString CFile…

C++读取特定路径下文件目录及文件名称

C读取特定路径下文件目录及文件名称亲测有效。主要用到了以下几个头文件(类)&#xff1a;io.h&#xff0c;fstream&#xff0c;string&#xff0c;vector 1、读取某给定路径下所有文件夹与文件名称&#xff0c;并带完整路径。代码如下&#xff1a; 1 void getAllFiles(string…

C++读取文件夹中文件名以及文件路径

文章目录 1 获取文件夹中所有文件名&#xff0c;包含子文件夹中的文件名2 获取文件夹中所有文件路径&#xff0c;包含子文件夹中的文件路径3 获取母文件夹中所有文件名&#xff0c;不包含子文件夹中的文件名4 只获取母文件夹中的文件路径&#xff0c;不包含子文件夹中的文件5 主…

C++ 获取文件路径和文件名

C 获取文件路径和文件名 就是基本的字符串截取 const char * filePath“F:\a.txt”; string filePath_strfilePath; string fileNamefilePath_str.substr(filePath.find_last_of(’\\’)1); const char *filename_cfileName.c_str(); ** 1. string 转换 成 const char *…

如何设置打印机?

1.取消禁用Guest用户&#xff0c;因为别人要访问安装打印机的按个电脑就是以guest账户访问的。 点击【开始】按钮&#xff0c;在【计算机】上右键&#xff0c;选择【管理】&#xff0c;如下图所示&#xff1a; 在弹出的【计算机管理】窗口中找到【Guest】用户 双击【Guest】&am…

Epson 打印机设置

在新到的 680 的打印机打印新的电费收据&#xff0c; 驱动选择 Windows 自带的 1600k 驱动&#xff1b;后进连打&#xff0c;左边卡位在 4 处。 一、 问题现象 如果您&#xff08;比如使用了进纸旋钮调整页顶位置之后&#xff0c;或者在使用专用软件打印套打票据的时候&a…

Excel的公式和函数

目录 运算符 地址的引用 逻辑函数 文本函数 统计函数 查找与引用函数 日期函数 常见出错信息 一、运算符 算术运算符 若要进行基本的数学运算&#xff08;如加法、减法、乘法或除法&#xff09;、合并数字以及生成数值结果&#xff0c;请使用以下算术运算符。 比较运算符 可以使…

excel 数据计算

简单计算&#xff1a; 算销售额&#xff0c;B2*C2&#xff0c;右下双击填充下面的 计算 D2&#xff1a;D6 到 D7 函数计算 日期计算 DATEDIF(start,date,end_date,unit) 返回两个日期之间的年/月/日间隔数 unit&#xff1a;有 Y&#xff1a;指时间段中的整年数 M&#xff1…

计算机二级MS office之excel常用函数

总结一下计算机二级excel中常用的函数&#xff0c;如果有错误的地方&#xff0c;希望小伙伴们可以多多指教❤️。 本文主要介绍了以下函数(可根据序号进行查阅)&#xff1a; 序号函数名称函数类别1VLOOKUP查询函数2MID、 LEFT、RIGHT文本函数3LOOKUP数组查询函数4RANK排名函数…