z3 training

This commit is contained in:
2025-11-28 12:23:07 +01:00
parent dc96452364
commit 9144e50e85
11 changed files with 910 additions and 17 deletions

View File

@@ -0,0 +1 @@
3.12

View File

View 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")

View File

@@ -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()

View 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",
]

View 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
View 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" },
]