打开ida,检查check函数
标准的z3
用python z3库求解
这里我因为求简单分了三个模块求--其实不是
from z3 import *
s=Solver()
v2,v3,v4,v5,v6,v7=Ints('v2 v3 v4 v5 v6 v7')
#Ints('')创建多个整形变量,字符串列表, 每一个字符串是一个变量名
s.add(245 * v6 + 395 * v5 + 3541 * v4 + 2051 * v3 + 3201 * v2 + 1345 * v7 == 855009,
3270 * v6 + 3759 * v5 + 3900 * v4 + 3963 * v3 + 1546 * v2 + 3082 * v7 == 1515490,
526 * v6 + 2283 * v5 + 3349 * v4 + 2458 * v3 + 2012 * v2 + 268 * v7 == 854822,
3208 * v6 + 2021 * v5 + 3146 * v4 + 1571 * v3 + 2569 * v2 + 1395 * v7 == 1094422,
3136 * v6 + 3553 * v5 + 2997 * v4 + 1824 * v3 + 1575 * v2 + 1599 * v7 == 1136398,
2300 * v6 + 1349 * v5 + 86 * v4 + 3672 * v3 + 2908 * v2 + 1681 * v7 == 939991)
#检查是否满足
if s.check() == sat:
#获取数据/模型
data=s.model()
print(data)
#[v3 = 83, v5 = 67, v7 = 70, v2 = 78, v4 = 83, v6 = 84]
后面也一样
拼凑起来就是
[v12 = 95,
v21 = 90,
v10 = 105,
v23 = 125,
v20 = 95,
v11 = 112,
v9 = 112,
v22 = 51,
v8 = 123]
[v12 = 95,
v21 = 90,
v10 = 105,
v23 = 125,
v20 = 95,
v11 = 112,
v9 = 112,
v22 = 51,
v8 = 123]
[v17 = 64,
v19 = 108,
v14 = 110,
v13 = 105,
v15 = 115,
v18 = 108,
v16 = 116]
[v3 = 83, v5 = 67, v7 = 70, v2 = 78, v4 = 83, v6 = 84]
按顺序转成ascii码 字符串输出
# 转换函数
def to_ascii(value):
return chr(value)
# 提供变量值
def to_ascii(value):
return chr(value)
values = {
'v2': 78, 'v3': 83, 'v4': 83, 'v5': 67, 'v6': 84, 'v7': 70,
'v8': 123, 'v9': 112, 'v10': 105, 'v11': 112, 'v12': 95,
'v13': 105, 'v14': 110, 'v15': 115, 'v16': 116, 'v17': 64,
'v18': 108, 'v19': 108, 'v20': 95, 'v21': 90, 'v22': 51,
'v23': 125
}
# 按照 v2 到 v23 的顺序输出字符串
output = ''.join(to_ascii(values[v]) for v in ['v2', 'v3', 'v4', 'v5', 'v6', 'v7', 'v8', 'v9', 'v10', 'v11', 'v12', 'v13', 'v14', 'v15', 'v16', 'v17', 'v18', 'v19', 'v20', 'v21', 'v22', 'v23'])
print(output)
#NSSCTF{pip_inst@ll_Z3}