前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hgame智械危机详细解析

hgame智械危机详细解析

作者头像
字节脉搏实验室
发布2020-04-14 16:56:00
8320
发布2020-04-14 16:56:00
举报
文章被收录于专栏:字节脉搏实验室

文章源自投稿

作者-小帽

下载下来有一个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)

--代码块--

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 字节脉搏实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档