Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๋๊ตฌ๋ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ ๋ณ์์ ๊ฐ์ ์ฐพ๋ ๋ฐ ๋์์ ์ค ๊ฒ์ด๋ฉฐ, ์์์ ์ผ๋ก ๊ณ์ฐํ๋ ๊ฒ์ ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ธ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ Z3์ ๋ณ์๊ฐ ๋ง์กฑํด์ผ ํ๋ ์กฐ๊ฑด์ ์ง์ ํ๋ฉด ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ผ๋ถ ๊ฐ์ ์ฐพ์๋ ๋๋ค.
์ผ๋ถ ํ ์คํธ์ ์์๋ https://ericpony.github.io/z3py-tutorial/guide-examples.htm์์ ์ถ์ถ๋์์ต๋๋ค.
๊ธฐ๋ณธ ์์
๋ถ๋ฆฌ์ธ/๊ทธ๋ฆฌ๊ณ /๋๋/์๋์ค
#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
Ints/Simplify/Reals
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))
๋ชจ๋ธ ์ถ๋ ฅ
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():
print("%s = %s" % (d.name(), m[d]))
๋จธ์ ์ฐ์
ํ๋ CPU์ ์ฃผ๋ฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๊ณ ์ ํฌ๊ธฐ ๋นํธ ๋ฒกํฐ์ ๋ํ ์ฐ์ ์ ์ฌ์ฉํฉ๋๋ค. ๋จธ์ ์ฐ์ ์ Z3Py์์ ๋นํธ ๋ฒกํฐ๋ก ์ ๊ณต๋ฉ๋๋ค.
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
Signed/Unsigned Numbers
Z3๋ ๋นํธ ๋ฒกํฐ๊ฐ ๋ถํธ๊ฐ ์๋์ง ์๋์ง์ ๋ฐ๋ผ ์ฐจ์ด๊ฐ ๋๋ ํน๋ณํ ๋ถํธ ์๋ ๋ฒ์ ์ ์ฐ์ ์ฐ์ฐ์ ์ ๊ณตํฉ๋๋ค. Z3Py์์ ์ฐ์ฐ์ **<, <=, >, >=, /, % ๋ฐ >>**๋ ๋ถํธ ์๋ ๋ฒ์ ์ ํด๋นํฉ๋๋ค. ํด๋นํ๋ ๋ถํธ ์๋ ์ฐ์ฐ์๋ **ULT, ULE, UGT, UGE, UDiv, URem ๋ฐ LShR.**์ ๋๋ค.
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)
# using unsigned version of <
solve(ULT(x, 0))
Functions
ํด์๋ ํจ์๋ ์ฐ์ ๊ณผ ๊ฐ์ ๊ฒ์ผ๋ก, **ํจ์ +**๋ ๊ณ ์ ๋ ํ์ค ํด์์ ๊ฐ์ง๊ณ ์์ต๋๋ค(๋ ์ซ์๋ฅผ ๋ํฉ๋๋ค). ๋นํด์ ํจ์์ ์์๋ ์ต๋ ์ ์ฐ์ฑ์ ๊ฐ์ง๋ฉฐ, ์ด๋ ํจ์๋ ์์์ ๋ํ ์ ์ฝ๊ณผ ์ผ๊ด๋ ๋ชจ๋ ํด์์ ํ์ฉํฉ๋๋ค.
์: f๊ฐ x์ ๋ ๋ฒ ์ ์ฉ๋๋ฉด ๋ค์ x๊ฐ ๋์ง๋ง, f๊ฐ x์ ํ ๋ฒ ์ ์ฉ๋๋ฉด x์ ๋ค๋ฆ ๋๋ค.
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)))
print(m.evaluate(f(2)))
s.add(f(x) == 4) #Find the value that generates 4 as response
s.check()
print(m.model())
์์
์ค๋์ฟ ํด๊ฒฐ๊ธฐ
# 9x9 matrix of integer variables
X = [ [ Int("x_%s_%s" % (i+1, j+1)) for j in range(9) ]
for i in range(9) ]
# each cell contains a value in {1, ..., 9}
cells_c = [ And(1 <= X[i][j], X[i][j] <= 9)
for i in range(9) for j in range(9) ]
# 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) ])
for j in range(9) ]
# each 3x3 square contains a digit at most once
sq_c = [ Distinct([ X[3*i0 + i][3*j0 + j]
for i in range(3) for j in range(3) ])
for i0 in range(3) for j0 in range(3) ]
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),
(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))
instance_c = [ If(instance[i][j] == 0,
True,
X[i][j] == instance[i][j])
for i in range(9) for j in range(9) ]
s = Solver()
s.add(sudoku_c + instance_c)
if s.check() == sat:
m = s.model()
r = [ [ m.evaluate(X[i][j]) for j in range(9) ]
for i in range(9) ]
print_matrix(r)
else:
print "failed to solve"
์ฐธ๊ณ ๋ฌธํ
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


