文章源自投稿
作者-小帽
下载下来有一个hdf5文件,应该是出题人训练的存储点,一个txt文件,相当于密文,一个py文件是远程检查结果的脚本
首先看下检查脚本:
--代码块--
import numpy as np
true_flag = 'hgame{}'
flag = np.loadtxt('flag.txt')
threshold = 0.18
def mse(true, predict):
return np.average(np.abs(true - predict))
def judge(predict):
if mse(flag, predict) < threshold:
print(true_flag)
else:
print("Unfortunately! Your mse loss is over the threshold, try again!")
print("Wrong flag!")
if __name__ == "__main__":
print("Welcome to this game!")
print("Please input your flag here (separated by space please):")
inp=input()geduangeduan
try:
inp = np.asarray(inp.split(' '), dtype=float)
judge(inp)
except Exception as e:
print("Internal Error!")
--代码块--
告诉了我输入的数据用空格隔断,然后会跟他后台存的答案检查一下,平均差小于0.18即可。
还有一部分信息在题目描述里,输入128位0和1,输出64位,线性函数
接下来加载一下hef5文件,发现他没存储网络结构,只存了权值(后来感觉是自己手里keras版本问题没能成功加载结构,如果可以加载的话直接model = models.loadmodel('flag.hdf5')即可) 那我们给他加上一层输入128输出64全连接,可以了
--代码块--
import keras
import numpy as np
import random
model = keras.Sequential()
model.add(keras.layers.Dense(64,input_dim=128))
model.load_weights('flag.hdf5')
print(model.summary())
--代码块--
接下来就可以利用它制作数据集了,随机生成3000组数据
--代码块--
inp=''
for i in range(0,128):
inp+=str(random.randint(0,1))+' '
inp = np.asarray(inp.split(' ')[:128], dtype=float)
print(inp.reshape(1,128).shape)
out=model.predict(inp.reshape(1,128))
X=inp.reshape(1,128)
Y=out
for i in range(0,3000):
xx=''
for i in range(0,128):
xx+=str(random.randint(0,1))+' '
xx = np.asarray(xx.split(' ')[:128], dtype=float)
xx = xx.reshape(-1,128)
xy=model.predict(xx.reshape(1,128))
X=np.append(X,xx.reshape(1,128),axis=0)
#print(X)
#input()
Y=np.append(Y,xy,axis=0)
print(X.shape)
print(Y.shape)
print('Data has been prepared')
--代码块--
model.predict(xx.reshape(1,128))利用这行代码获得随机生成的x对应的y
也就是说,我们搞了3000对输入和输出值
现在有数据了,再定义一个新的神经网络来拟合那个线性函数的逆运算,也就是函数自变量因变量互换。
然后再解一下题目给的文件
--代码块--
model2 = keras.Sequential()
model2.add(keras.layers.Dense(128,input_dim=64,activation='relu'))
#新建一个输入64输出128的全连接
print(model2.summary())
model2.compile(loss='mse', optimizer='sgd')
model2.fit(Y, X, epochs=1500)
#掉换X和Y,将新模型训练1500次
scores = model2.evaluate(out,inp.reshape(1,128))
print("%s: %.2f%%" % (model2.metrics_names[0], scores*100))
flag = np.loadtxt('enc_flag.txt')
ouu=model2.predict(flag.reshape(1,64))
print(ouu)
--代码块--
即使检查脚本没规定必须用0和1作为输入,float就可以,不过还是整理了一下,大于0.5的是1,小于的是0(后来也发现可能因为训练次数导致直接给小数进去误差太大,0和1是可以的)
--代码块--
for i in a:
if i<0.5:
b.append(0)
else:
b.append(1)
--代码块--