Z3 사용법
Z3
Z3는 마이크로소프트에서 개발한 수식 해석 도구로, 대표적인 SMT(Satisfiability Modulo Theories)1 솔버이다. Z3는 보통 CTF에서 로직 자체는 파악을 다 했으나 역연산이 어려울 때 많이 사용된다.
Install
Python에서 Z3의 모듈의 설치 방법은 다음과 같다.
1
pip install z3-solver
위 명령어로 손쉽게 설치할 수 있다.
Basic Usage Guide for the Z3 Python API
import
1
from z3 import *
python에서 z3을 사용하고 싶다면 해당 모듈을 불러오면 된다.
Variable Declaration
변수 선언은 다음과 같이 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Int
x = Int("x")
y = Int("y")
# Real
a = Real("a")
b = Real("b")
# Bool
p = Bool("p")
q = Bool("q")
# BitVec
x_bitvec = BitVec("x", 32)
y_bitvec = BitVec("y", 32)
# Array(Array_name, Index_Type, Value_Type)
arr = Array("arr", IntSort(), IntSort())
비트 벡터 선언은 BitVec("Val", N)
으로 N비트 Val값을 선언할 수 있다. 또한, 실수형을 선언할 때 자리수를 N자리 까지만 출력하고 싶으면 set_option(precision=N)
을 사용할 수 있다.
Solver Class
z3에서 Solver라는 객체를 생성할 수 있는데, Solver 객체로 여러개의 수식을 작성할 수 있다.
1
s = Solver()
add()
1
s.add(조건)
s.add()
로 수식을 추가할 수 있다.
check()
1
s.check()
s.check()
는 내가 작성한 조건을 만족하는 해가 있으면 sat
를 반환하고, 없다면 unsat
를 반환한다.
model()
1
s.model()
s.model()
은 값이 존재할 경우 값을 반환하는 함수이다. 만약 unsat
이거나 unknown
이면 에러를 반환한다.
s.reason_unknown()
을 통해서unknown
인 이유를 알려준다.
reset()
1
s.reset()
내가 작성한 수식들을 초기화 하고 싶다면 s.reset()
을 작성하면 된다.
Ref
[1] z3 microsoft
[2] z3 github
[3] Z3 Solver Class
[4] Z3Py Guide
[5] z3에 적응하기 위해 RedVelvet을 풀어보자.
Footnote
SMT(Satisfiability Modulo Theories): 다양한 자료형(Boolean, 실수, 정수, list, bit vector, str등)을 사용하는 복합적인 복합적인 수학적 및 논리적 표현식을 만족할 수 있는지 결정하는 문제를 다루는 이론 ↩︎