[HNCTF 2022 WEEK2]来解个方程?

打开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}

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值