z3 training
This commit is contained in:
1
2025/cscg/crypto/intro3/.python-version
Normal file
1
2025/cscg/crypto/intro3/.python-version
Normal file
@@ -0,0 +1 @@
|
||||
3.12
|
||||
0
2025/cscg/crypto/intro3/README.md
Normal file
0
2025/cscg/crypto/intro3/README.md
Normal file
@@ -1,4 +1,6 @@
|
||||
from z3 import Solver, BitVec, sat
|
||||
from z3 import Solver, BitVec, sat, ULE
|
||||
|
||||
known_prefix = "CSCG{"
|
||||
|
||||
def rng(x, size):
|
||||
return (x*A+B) & ((2**size)-1)
|
||||
@@ -17,25 +19,33 @@ MASK = 0xFF
|
||||
|
||||
state = SEED
|
||||
|
||||
with open("./msg.txt", "r") as f:
|
||||
with open("./test_msg.txt", "r") as f:
|
||||
nums = [int(n) for n in f.readlines()[1:]]
|
||||
print(nums)
|
||||
|
||||
flag_bytes = [BitVec(f'flag_{i}', 56) for i in range(142)]
|
||||
flag = []
|
||||
|
||||
solver = Solver()
|
||||
|
||||
for i, n in enumerate(nums):
|
||||
state = rng(state, BITS)
|
||||
cur_num = state & MASK
|
||||
solver.add(n == cur_num ^ flag_bytes[i])
|
||||
solver.add(flag_bytes[i] >= 32, flag_bytes[i] <= 126)
|
||||
|
||||
decrypted_char = cur_num ^ n
|
||||
flag.append(decrypted_char)
|
||||
if i < len(known_prefix):
|
||||
solver.add(decrypted_char == ord(known_prefix[i]))
|
||||
# else:
|
||||
# solver.add(ULE(32, decrypted_char))
|
||||
# solver.add(ULE(decrypted_char, 126))
|
||||
|
||||
if solver.check() == sat:
|
||||
model = solver.model()
|
||||
flag = ''.join([chr(model[flag_bytes[i]].as_long()) for i in range(142)])
|
||||
recovered_chars = ""
|
||||
for char_expr in flag:
|
||||
val = model.evaluate(char_expr).as_long()
|
||||
recovered_chars += chr(val)
|
||||
print(model)
|
||||
print(flag)
|
||||
print(recovered_chars)
|
||||
else:
|
||||
print("Not solveable")
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import os
|
||||
import struct
|
||||
|
||||
BITS = 56
|
||||
|
||||
FLAG = os.getenv("FLAG", "CSCG{TESTFLAG}")
|
||||
FLAG = os.getenv("FLAG", "CSCG{sH4r1nG_1nt3rn4l_sT4te_1s_d3adLy}")
|
||||
|
||||
A = int.from_bytes(os.urandom(BITS//8), "little")
|
||||
B = int.from_bytes(os.urandom(BITS//8), "little")
|
||||
@@ -22,7 +21,8 @@ def main():
|
||||
print("Here are some random numbers, now guess the flag")
|
||||
rng = gen_random(SEED, BITS, 0xFF)
|
||||
for i in range(len(FLAG)):
|
||||
print(next(rng) ^ ord(FLAG[i]))
|
||||
num = next(rng)
|
||||
print(num ^ ord(FLAG[i]))
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
9
2025/cscg/crypto/intro3/pyproject.toml
Normal file
9
2025/cscg/crypto/intro3/pyproject.toml
Normal file
@@ -0,0 +1,9 @@
|
||||
[project]
|
||||
name = "intro3"
|
||||
version = "0.1.0"
|
||||
description = "Add your description here"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.12"
|
||||
dependencies = [
|
||||
"z3-solver>=4.15.4.0",
|
||||
]
|
||||
39
2025/cscg/crypto/intro3/test_msg.txt
Normal file
39
2025/cscg/crypto/intro3/test_msg.txt
Normal file
@@ -0,0 +1,39 @@
|
||||
Here are some random numbers, now guess the flag
|
||||
249
|
||||
95
|
||||
203
|
||||
23
|
||||
59
|
||||
19
|
||||
104
|
||||
148
|
||||
210
|
||||
145
|
||||
206
|
||||
231
|
||||
255
|
||||
145
|
||||
206
|
||||
212
|
||||
147
|
||||
210
|
||||
206
|
||||
148
|
||||
204
|
||||
255
|
||||
211
|
||||
244
|
||||
148
|
||||
212
|
||||
197
|
||||
255
|
||||
145
|
||||
211
|
||||
255
|
||||
196
|
||||
147
|
||||
193
|
||||
196
|
||||
236
|
||||
217
|
||||
221
|
||||
28
2025/cscg/crypto/intro3/uv.lock
generated
Normal file
28
2025/cscg/crypto/intro3/uv.lock
generated
Normal file
@@ -0,0 +1,28 @@
|
||||
version = 1
|
||||
revision = 3
|
||||
requires-python = ">=3.12"
|
||||
|
||||
[[package]]
|
||||
name = "intro3"
|
||||
version = "0.1.0"
|
||||
source = { virtual = "." }
|
||||
dependencies = [
|
||||
{ name = "z3-solver" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
requires-dist = [{ name = "z3-solver", specifier = ">=4.15.4.0" }]
|
||||
|
||||
[[package]]
|
||||
name = "z3-solver"
|
||||
version = "4.15.4.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/8a/8e/0c8f17309549d2e5cde9a3ccefa6365437f1e7bafe71878eaf9478e47b18/z3_solver-4.15.4.0.tar.gz", hash = "sha256:928c29b58c4eb62106da51c1914f6a4a55d0441f8f48a81b9da07950434a8946", size = 5018600, upload-time = "2025-10-29T18:12:03.062Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/63/33/a3d5d2eaeb0f7b3174d57d405437eabb2075d4d50bd9ea0957696c435c7b/z3_solver-4.15.4.0-py3-none-macosx_13_0_arm64.whl", hash = "sha256:407e825cc9211f95ef46bdc8d151bf630e7ab2d62a21d24cd74c09cc5b73f3aa", size = 37052538, upload-time = "2025-10-29T18:11:46.233Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/47/84/fd7ffac1551cd9f8d44fe41358f738be670fc4c24dfd514fab503f2cf3e7/z3_solver-4.15.4.0-py3-none-macosx_13_0_x86_64.whl", hash = "sha256:00bd10c5a6a5f6112d3a9a810d0799227e52f76caa860dafa5e00966bb47eb13", size = 39807925, upload-time = "2025-10-29T18:11:49.81Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/21/c9/bb51a96af0091324c81b803f16c49f719f9f6ea0b0bb52200f5c97ec4892/z3_solver-4.15.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e103a6f203f505b8b8b8e5c931cc407c95b61556512d4921c1ddc0b3f41b08e", size = 29268352, upload-time = "2025-10-29T18:11:53.032Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bf/2e/0b49f7e4e53817cfb09a0f6585012b782dfe0b666e8abefcb4fac0570606/z3_solver-4.15.4.0-py3-none-manylinux_2_34_aarch64.whl", hash = "sha256:62c7e9cbdd711932301f29919ad9158de9b2f58b4d281dd259bbcd0a2f408ba1", size = 27226534, upload-time = "2025-10-29T18:11:55.59Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/26/91/33de49538444d4aafbe47415c450c2f9abab1733e1226f276b496672f46c/z3_solver-4.15.4.0-py3-none-win32.whl", hash = "sha256:be3bc916545c96ffbf89e00d07104ff14f78336e55db069177a1bfbcc01b269d", size = 13191672, upload-time = "2025-10-29T18:11:58.424Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/03/d6/a0b135e4419df475177ae78fc93c422430b0fd8875649486f9a5989772e6/z3_solver-4.15.4.0-py3-none-win_amd64.whl", hash = "sha256:00e35b02632ed085ea8199fb230f6015e6fc40554a6680c097bd5f060e827431", size = 16259597, upload-time = "2025-10-29T18:12:01.14Z" },
|
||||
]
|
||||
Reference in New Issue
Block a user