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("无解或超时")