from
z3
import
*
set_param(
"parallel.enable"
,
True
)
set_param(
"dump_models"
,
True
)
set_param(
"maxsat_engine"
,
"core_maxsat"
)
def
Trvnc8(num):
return
num &
0xff
def
on_model(m):
print
(m.
eval
(score), bytes(m[c].as_long()
for
c
in
flag))
solver
=
Optimize()
solver.set_on_model(on_model)
flag
=
[BitVec(f
'flag_{i}'
,
16
)
for
i
in
range
(
56
)]
score
=
0
for
i
in
range
(
5
,
55
):
solver.add( Or(
And(flag[i] >
=
ord
(
'0'
), flag[i] <
=
ord
(
'9'
)),
And(flag[i] >
=
ord
(
'a'
), flag[i] <
=
ord
(
'f'
))
))
condition_vars
=
[]
condition_0
=
And(( ((flag[
3
]
+
flag[
26
]) & flag[
32
]) < Trvnc8(flag[
9
]
+
flag[
25
]
-
flag[
28
]), ((flag[
15
]
-
flag[
16
]) & flag[
18
]) <
=
0x26
, Trvnc8(flag[
14
]
+
flag[
23
]
*
flag[
2
]) < Trvnc8((flag[
24
]
+
flag[
25
])
*
flag[
26
]) ))
solver.add_soft(condition_0,
8
)
score
+
=
condition_0
*
8
condition_1
=
And(( Trvnc8(flag[
2
]
*
flag[
37
]
-
flag[
43
]) <
=
0xC7
, Trvnc8(flag[
47
]
-
flag[
41
]
+
flag[
11
]) >
=
0x3D
, Trvnc8(flag[
49
]
+
flag[
33
]
-
flag[
5
]) >
=
0x4D
, (Trvnc8(flag[
13
]
*
flag[
46
]) ^ flag[
10
]) > Trvnc8(flag[
23
]
-
(flag[
8
]
+
flag[
46
])) ))
solver.add_soft(condition_1,
1
)
score
+
=
condition_1
*
1
...
condition_399
=
And(( Trvnc8((flag[
35
] | flag[
13
])
+
flag[
20
]) < Trvnc8(flag[
45
]
+
flag[
19
]
-
flag[
48
]), (Trvnc8(flag[
41
]
*
flag[
12
]) | flag[
34
]) >
=
0x7C
))
solver.add_soft(condition_399,
4
)
score
+
=
condition_399
*
4
solver.add(flag[
0
]
=
=
ord
(
'P'
))
solver.add(flag[
1
]
=
=
ord
(
'C'
))
solver.add(flag[
2
]
=
=
ord
(
'T'
))
solver.add(flag[
3
]
=
=
ord
(
'F'
))
solver.add(flag[
4
]
=
=
ord
(
'{'
))
solver.add(flag[
55
]
=
=
ord
(
'}'
))
score
=
simplify(score)
solver.maximize(score)
if
solver.check()
=
=
sat:
model
=
solver.model()
flag_str
=
""
for
i
in
flag:
print
(model.
eval
(i, model_completion
=
True
), end
=
' '
)
flag_str
+
=
chr
(model.
eval
(i, model_completion
=
True
).as_long())
print
(f
"找到解: {flag_str}"
)
print
(f
"最终分数: {score}"
)
else
:
model
=
solver.model()
flag_str
=
""
for
i
in
flag:
print
(model.
eval
(i, model_completion
=
True
), end
=
' '
)
flag_str
+
=
chr
(model.
eval
(i, model_completion
=
True
).as_long())
print
(f
"找到解: {flag_str}"
)
print
(f
"最终分数: {score}"
)
print
(
"无解或超时"
)