预备知识
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表达式简化器(用于简化表达式):