2022-04-28 16:01:33 +00:00
< details >
2024-02-08 04:49:53 +00:00
< summary > < strong > ゼロからヒーローまでのAWSハッキングを学ぶ< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE( HackTricks AWS Red Team Expert) < / strong > < / a > < strong > ! < / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-02-08 04:49:53 +00:00
HackTricks をサポートする他の方法:
2022-04-28 16:01:33 +00:00
2024-02-08 04:49:53 +00:00
* **HackTricks で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい** 場合は [**SUBSCRIPTION PLANS** ](https://github.com/sponsors/carlospolop ) をチェックしてください!
* [**公式PEASS& HackTricksスウォッグ** ](https://peass.creator-spring.com )を入手する
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )、当社の独占的な [**NFTs** ](https://opensea.io/collection/the-peass-family ) コレクションを発見する
* **💬 [**Discordグループ** ](https://discord.gg/hRep4RUj7f ) に参加するか、[**telegramグループ** ](https://t.me/peass ) に参加するか、**Twitter** 🐦 で私をフォローする [**@carlospolopm** ](https://twitter.com/carlospolopm )**。**
* **ハッキングトリックを共有するために、PRを** [**HackTricks** ](https://github.com/carlospolop/hacktricks ) と [**HackTricks Cloud** ](https://github.com/carlospolop/hacktricks-cloud ) github リポジトリに提出してください。
2022-04-28 16:01:33 +00:00
< / details >
2022-05-01 16:32:23 +00:00
2024-02-08 04:49:53 +00:00
非常に基本的に、このツールは、特定の条件を満たす必要がある変数の値を見つけるのに役立ち、手計算するのは非常に面倒です。したがって、Z3に変数が満たす必要がある条件を示すことができ、それがいくつかの値を見つけます( 可能な場合) 。
2021-09-08 23:47:00 +00:00
2024-02-08 04:49:53 +00:00
# 基本的な操作
2021-09-08 23:47:00 +00:00
2024-02-08 04:49:53 +00:00
## ブール値/And/Or/Not
2021-09-08 23:47:00 +00:00
```python
#pip3 install z3-solver
from z3 import *
s = Solver() #The solver will be given the conditions
x = Bool("x") #Declare the symbos x, y and z
y = Bool("y")
z = Bool("z")
# (x or y or !z) and y
s.add(And(Or(x,y,Not(z)),y))
s.check() #If response is "sat" then the model is satifable, if "unsat" something is wrong
print(s.model()) #Print valid values to satisfy the model
```
2024-01-09 13:00:50 +00:00
## 整数/単純化/実数
2021-09-08 23:47:00 +00:00
```python
from z3 import *
x = Int('x')
y = Int('y')
#Simplify a "complex" ecuation
print(simplify(And(x + 1 >= 3, x**2 + x**2 + y**2 + 2 >= 5)))
#And(x >= 2, 2*x**2 + y**2 >= 3)
#Note that Z3 is capable to treat irrational numbers (An irrational algebraic number is a root of a polynomial with integer coefficients. Internally, Z3 represents all these numbers precisely.)
#so you can get the decimals you need from the solution
r1 = Real('r1')
r2 = Real('r2')
#Solve the ecuation
print(solve(r1**2 + r2**2 == 3, r1**3 == 2))
#Solve the ecuation with 30 decimals
set_option(precision=30)
print(solve(r1**2 + r2**2 == 3, r1**3 == 2))
```
2024-01-09 13:00:50 +00:00
## モデルの印刷
2021-09-08 23:47:00 +00:00
```python
from z3 import *
x, y, z = Reals('x y z')
s = Solver()
s.add(x > 1, y > 1, x + y > 3, z - x < 10 )
s.check()
m = s.model()
print ("x = %s" % m[x])
for d in m.decls():
2023-07-07 23:42:27 +00:00
print("%s = %s" % (d.name(), m[d]))
2021-09-08 23:47:00 +00:00
```
2024-02-08 04:49:53 +00:00
# 機械算術
2021-09-08 23:47:00 +00:00
2024-02-08 04:49:53 +00:00
現代のCPUおよび主要なプログラミング言語は、**固定サイズのビットベクトル**上で算術演算を行います。機械算術はZ3Pyで**ビットベクトル**として利用できます。
2021-09-08 23:47:00 +00:00
```python
from z3 import *
x = BitVec('x', 16) #Bit vector variable "x" of length 16 bit
y = BitVec('y', 16)
e = BitVecVal(10, 16) #Bit vector with value 10 of length 16bits
a = BitVecVal(-1, 16)
b = BitVecVal(65535, 16)
print(simplify(a == b)) #This is True!
a = BitVecVal(-1, 32)
b = BitVecVal(65535, 32)
print(simplify(a == b)) #This is False
```
2024-02-08 04:49:53 +00:00
## 符号付き/符号なしの数値
2021-09-08 23:47:00 +00:00
2024-02-08 04:49:53 +00:00
Z3は、**ビットベクトルが符号付きか符号なしかによって違いが生じる**特別な符号付きの算術演算を提供します。Z3Pyでは、演算子**< 、< =、>、>=、/、%、および >>** が**符号付き**バージョンに対応しています。対応する**符号なし**演算子は**ULT、ULE、UGT、UGE、UDiv、URem、および LShR**です。
2021-09-08 23:47:00 +00:00
```python
from z3 import *
# Create to bit-vectors of size 32
x, y = BitVecs('x y', 32)
solve(x + y == 2, x > 0, y > 0)
# Bit-wise operators
# & bit-wise and
# | bit-wise or
# ~ bit-wise not
solve(x & y == ~y)
solve(x < 0 )
2023-07-07 23:42:27 +00:00
# using unsigned version of <
2021-09-08 23:47:00 +00:00
solve(ULT(x, 0))
```
2023-07-07 23:42:27 +00:00
## 関数
2021-09-08 23:47:00 +00:00
2024-02-08 04:49:53 +00:00
**解釈された関数** は、**関数 +** が **固定された標準解釈** を持つ算術などの関数です( 2つの数を加算します) 。 **解釈されていない関数** と定数は **最大限に柔軟** です。関数や定数に関する **制約** と **整合性** を持つ **任意の解釈** を許可します。
2021-09-08 23:47:00 +00:00
2024-02-08 04:49:53 +00:00
例: x に 2 回適用された f は再び x になりますが、x に 1 回適用された f は x とは異なります。
2021-09-08 23:47:00 +00:00
```python
from z3 import *
x = Int('x')
y = Int('y')
f = Function('f', IntSort(), IntSort())
s = Solver()
s.add(f(f(x)) == x, f(x) == y, x != y)
s.check()
m = s.model()
print("f(f(x)) =", m.evaluate(f(f(x))))
print("f(x) =", m.evaluate(f(x)))
2021-09-09 12:54:19 +00:00
print(m.evaluate(f(2)))
s.add(f(x) == 4) #Find the value that generates 4 as response
s.check()
print(m.model())
2021-09-08 23:47:00 +00:00
```
2023-07-07 23:42:27 +00:00
# 例
## 数独ソルバー
2021-09-09 12:56:08 +00:00
```python
# 9x9 matrix of integer variables
X = [ [ Int("x_%s_%s" % (i+1, j+1)) for j in range(9) ]
2023-07-07 23:42:27 +00:00
for i in range(9) ]
2021-09-09 12:56:08 +00:00
# each cell contains a value in {1, ..., 9}
cells_c = [ And(1 < = X[i][j], X[i][j] < = 9)
2023-07-07 23:42:27 +00:00
for i in range(9) for j in range(9) ]
2021-09-09 12:56:08 +00:00
# each row contains a digit at most once
rows_c = [ Distinct(X[i]) for i in range(9) ]
# each column contains a digit at most once
cols_c = [ Distinct([ X[i][j] for i in range(9) ])
2023-07-07 23:42:27 +00:00
for j in range(9) ]
2021-09-09 12:56:08 +00:00
# each 3x3 square contains a digit at most once
sq_c = [ Distinct([ X[3*i0 + i][3*j0 + j]
2023-07-07 23:42:27 +00:00
for i in range(3) for j in range(3) ])
for i0 in range(3) for j0 in range(3) ]
2021-09-09 12:56:08 +00:00
sudoku_c = cells_c + rows_c + cols_c + sq_c
# sudoku instance, we use '0' for empty cells
instance = ((0,0,0,0,9,4,0,3,0),
2023-07-07 23:42:27 +00:00
(0,0,0,5,1,0,0,0,7),
(0,8,9,0,0,0,0,4,0),
(0,0,0,0,0,0,2,0,8),
(0,6,0,2,0,1,0,5,0),
(1,0,2,0,0,0,0,0,0),
(0,7,0,0,0,0,5,2,0),
(9,0,0,0,6,5,0,0,0),
(0,4,0,9,7,0,0,0,0))
2021-09-09 12:56:08 +00:00
instance_c = [ If(instance[i][j] == 0,
2023-07-07 23:42:27 +00:00
True,
X[i][j] == instance[i][j])
for i in range(9) for j in range(9) ]
2021-09-09 12:56:08 +00:00
s = Solver()
s.add(sudoku_c + instance_c)
if s.check() == sat:
2023-07-07 23:42:27 +00:00
m = s.model()
r = [ [ m.evaluate(X[i][j]) for j in range(9) ]
for i in range(9) ]
print_matrix(r)
2021-09-09 12:56:08 +00:00
else:
2023-07-07 23:42:27 +00:00
print "failed to solve"
2021-09-09 12:56:08 +00:00
```
2024-02-08 04:49:53 +00:00
## 参考文献
2021-09-09 12:56:08 +00:00
* [https://ericpony.github.io/z3py-tutorial/guide-examples.htm ](https://ericpony.github.io/z3py-tutorial/guide-examples.htm )
2022-04-28 16:01:33 +00:00
2022-05-01 16:32:23 +00:00
2022-04-28 16:01:33 +00:00
< details >
2024-02-08 04:49:53 +00:00
< summary > < strong > ゼロからヒーローまでのAWSハッキングを学ぶ< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE( HackTricks AWS Red Team Expert) < / strong > < / a > < strong > ! < / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-02-08 04:49:53 +00:00
HackTricks をサポートする他の方法:
2022-04-28 16:01:33 +00:00
2024-02-08 04:49:53 +00:00
* **HackTricks で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい** 場合は [**SUBSCRIPTION PLANS** ](https://github.com/sponsors/carlospolop ) をチェックしてください!
* [**公式PEASS& HackTricksのグッズ** ](https://peass.creator-spring.com )を入手する
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family ) を発見し、独占的な [**NFTs** ](https://opensea.io/collection/the-peass-family ) のコレクションを見つける
* **💬 [**Discordグループ** ](https://discord.gg/hRep4RUj7f ) に参加するか、[**telegramグループ** ](https://t.me/peass ) に参加するか、**Twitter** 🐦 [**@carlospolopm** ](https://twitter.com/carlospolopm ) をフォローする**
* **ハッキングテクニックを共有するには、** [**HackTricks** ](https://github.com/carlospolop/hacktricks ) と [**HackTricks Cloud** ](https://github.com/carlospolop/hacktricks-cloud ) のGitHubリポジトリにPRを提出してください。
2022-04-28 16:01:33 +00:00
< / details >