本文最后更新于375 天前,其中的信息可能已经过时,如有错误可以直接在文章下留言
看名字应该是一个python题目,先用DIE查看一下信息
发现是用PyInstaller打包的,那就直接用pyinstxtractor解包一下,解包成功了,
我们到解包成功的文件夹里面找到.pyc文件,然后用pycdc对其反编译,做题的时候才发现狗日的Win11防火墙又偷偷把我的pycdc.exe给删了,真是恶心吐了,找回来反编译,如图
这里显示了反编译未完成,没想到pycdc都未完成,只能上在线网站找个可以的来反编译,发现这个网站可以。
得到了python代码
print("please input len=15's number.")
input_str = input()
a = [list(map(int, input_str[i:i + 5])) for i in range(0, len(input_str), 5)]
#每五个一组,转换成整数列表,a是一个三行五列的列表
row_sums = [sum(row) for row in a]
#计算每一行列表的元素之和
col_sums = [sum(col) for col in zip(*a)]
#计算每一列元素的和
row_products = [1] * len(a)
#row_products=[1, 1, 1]
for i in range(len(a)):#len(a)=3
for j in range(len(a[i])):#len(a[i])=5
row_products[i] *= a[i][j]
#行元素相乘
else:
col_products = [
1] * len(a[0])
#col_products=[1,1,1,1,1]
for j in range(len(a[0])):
for i in range(len(a)):
col_products[j] *= a[i][j]
#列元素相乘
else:
if (row_sums == [19, 17, 20]) & (col_sums == [9, 11, 17, 10, 9]) & (row_products == [576, 384, 560]) & (col_products == [24, 40, 168, 32, 24]) & (a[0][0] == 3) & (a[2][4] == 4):
print('bingo!!')
else:
print('lose!')
input()
注释了一下,搞懂了大概逻辑之后就是一个反推,感觉手搓答案也是可以的,这里用z3来解决,脚本如下。
from z3 import *
a1=Int('a1')
a2=Int('a2')
a3=Int('a3')
a4=Int('a4')
a5=Int('a5')
b1=Int('b1')
b2=Int('b2')
b3=Int('b3')
b4=Int('b4')
b5=Int('b5')
c1=Int('c1')
c2=Int('c2')
c3=Int('c3')
c4=Int('c4')
c5=Int('c5')
s=Solver()
s.add(a1==3)
s.add(c5==4)
s.add(a1+a2+a3+a4+a5==19)
s.add(b1+b2+b3+b4+b5==17)
s.add(c1+c2+c3+c4+c5==20)
s.add(a2+b2+c2==11)
s.add(a3+b3+c3==17)
s.add(a4+b4+c4==10)
s.add(a5+b5+c5==9)
s.add(a1*a2*a3*a4*a5==576)
s.add(b1*b2*b3*b4*b5==384)
s.add(c1*c2*c3*c4*c5==560)
s.add(a1*b1*c1==24)
s.add(a2*b2*c2==40)
s.add(a3*c3*b3==168)
s.add(a4*b4*c4==32)
s.add(a5*b5*c5==24)
if s.check()==sat:
print(s.model())
else:
print('error')
#输出[a1 = 3,c5 = 4,b4 = 4,b2 = 2,a2 = 4,c3 = 7,c4 = 2,b5 = 3,b3 = 4,b1 = 4,a4 = 4,a3 = 6,a5 = 2,c1 = 2,c2 = 5]
#346424244325724
如果要设列表为未知解的话,再加上这是一个二维列表,百度了一下,发现好像是可以实现的,但是感觉应该很麻烦。想了一下直接设15个数都为未知数。笨人笨方法。
flag就是flag{346424244325724}
这次内部赛和舍友合砍第二,还是挺不错滴,虽然差点也能拿第一没拿到有些可惜。